15 grudnia 2021

Docker #5 - Reverse proxy

Dlaczego Reverse proxy jest nam potrzebne

Jest wiele powodów, aby w sieci domowej zastosować Reverse proxy:

  • Aby posługiwać wygodnymi adresami z HTTPS zamiast adresów IP:port
  • Aby przeglądarka zapamiętywała hasła do aplikacji osobno, zamiast wszystkie wymieszane na jednym adresie
  • Ukryte przełączanie i podmienianie usług bez zmiany adresu
VS Code

Konfiguracja dostawcy DNS (dns-01 challenge) na przykładnie OVH

Na stronie OVH createToken (opens new window) generujemy nowy zestaw kluczy API. Nazwa i opis aplikacji są dowolne, okres ważności polecam ustawić unlimited, a uprawnienia następująco:

  • GET /domain/zone/*****
  • PUT /domain/zone/*
  • POST /domain/zone/*
  • DELETE /domain/zone/*
VS Code

API console (opens new window) pozwala nam na wywoływanie poszczególnych funkcji API, tym co może nam się przydać do zarządzania utworzonymi uprawnieniami to:

  • GET /me/api/application
  • GET /me/api/application/{applicationId}
  • GET /me/api/credential
  • GET /me/api/credential/{credentialId}
  • DELETE /me/api/application/{applicationId}
  • DELETE /me/api/credential/{credentialId}

Konfiguracja lokalna

Docker composer

version: "3.8"

services:
  traefik:
    image: traefik
    network_mode: host
    container_name: traefik
    restart: unless-stopped
    environment:
      - "OVH_ENDPOINT=ovh-eu"
      - "OVH_APPLICATION_KEY=xxxxxxxxxxx"
      - "OVH_APPLICATION_SECRET=xxxxxxxxxxxxxx"
      - "OVH_CONSUMER_KEY=xxxxxxxxxxxxxxxx"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/global_config/composer/traefik/config.yaml:/traefik.yaml:ro"
      - "/global_config/composer/traefik/config_2.yaml:/config_2.yaml:ro"
      - "/global_config/docker_data/traefik/acme:/acme"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik_dashboard.rule=Host(`traefik.home.robertolechowski.com`)"
      - "traefik.http.routers.traefik_dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik_dashboard.service=traefik_service"
      - "traefik.http.services.traefik_service.loadbalancer.server.port=7766"

Traefik konfiguracja (traefik.yaml, config_2.yaml)

global:
  checkNewVersion: true
  sendAnonymousUsage: false

log:
  level: DEBUG

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    watch: true
    exposedbydefault: false

  file:
    filename: "/config_2.yaml"
    watch: true

metrics:
  prometheus:
    entryPoint: "traefik"
    buckets: [0.1,0.3,1.2,5.0]

ping:
  entryPoint: "traefik"

entryPoints:
  http:
    address: ":80"

  https:
    address: ":443"

  traefik:
    address: ":7766"

api:
  debug: true
  insecure: true
  dashboard: true

certificatesResolvers:
  myresolver:
    acme:
      email: "robertolechowski@gmail.com"
      storage: "/acme/acme.json"
      dnsChallenge:
        provider: "ovh"
        delayBeforeCheck: 0
        resolvers: ["1.1.1.1:53", "8.8.8.8:53"]
http:
  routers:
    proxmox:
      entryPoints: [https]
      rule: "Host(`proxmox.home.robertolechowski.com`)"
      tls:
        certresolver: "myresolver"
      service: proxmox

    pihole:
      entryPoints: [https]
      rule: "Host(`pihole.home.robertolechowski.com`)"
      tls:
        certresolver: "myresolver"
      service: pihole   


  services:
    proxmox:
      loadBalancer:
        serversTransport: insecureTransport
        servers:
          - url: "https://192.168.30.70:8006"
        passHostHeader: true

    pihole:
      loadBalancer:
        servers:
          - url: "http://192.168.30.90"
        passHostHeader: true


  serversTransports:
    insecureTransport:
      insecureSkipVerify: true