it:server:traefik-reverzni-proxy

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
it:server:traefik-reverzni-proxy [2024/12/30 01:07] Petr Nosekit:server:traefik-reverzni-proxy [2025/01/15 00:01] (aktuální) – [Zabezpečení Gitea a přihlašování bez hesla] Petr Nosek
Řádek 761: Řádek 761:
  
 Tímto způsobem dojde k aktualizaci Nextcloudu na novější verzi bez ztráty dat. Nezapomeňte zkontrolovat, zda všechny funkce fungují správně po aktualizaci. Tímto způsobem dojde k aktualizaci Nextcloudu na novější verzi bez ztráty dat. Nezapomeňte zkontrolovat, zda všechny funkce fungují správně po aktualizaci.
 +
 +
 +==== Problém s certifikáty v Chrome ====
 +
 +Tato chyba byla velmi zrádná, protože komplikace vycházela z problému na straně DNS serveru, což jsem nečekal. K tomu se přidalo, že ve Firefoxu vše fungovalo správně, ale v Chrome se problém projevoval. Zároveň se chyba objevovala pouze u Nextcloudu, což situaci ještě více zkomplikovalo.
 +
 +Chrome odmítl stránku zobrazit a hlásil chybu certifikátu: **ERR_ECH_FALLBACK_CERTIFICATE_INVALID**.
 +
 +Zjistil jsem, že příčinou je chybějící podpora **ECH (Encrypted Client Hello)**. ECH je moderní technologie šifrování, kterou prohlížeč Chrome očekává. Pokud server neposkytuje správně nakonfigurovaný certifikát, Chrome to detekuje a hlásí chybu.
 +
 +Dočasným řešením bylo spustit Chrome s vypnutou funkcí ECH:
 +
 +<code>
 +google-chrome --disable-features=EncryptedClientHello
 +</code>
 +
 +Tato úprava umožnila správné zobrazení stránky.
 +
 +Při dalším pátrání jsem v diskusi na [[https://community.traefik.io/t/err-ech-fallback-certificate-invalid-errors/24588/37?page=2|Traefik fóru - ERR_ECH_FALLBACK_CERTIFICATE_INVALID errors]] zjistil, že problém může být způsoben Cloudflare. Cloudflare využívá HTTPS záznamy pro „opportunistic HTTPS to HTTPS upgrade“, ECH a další funkce, které způsobují přidání vnější vrstvy k požadavkům ECH s doménou **cloudflare-ech.com**.
 +
 +Dalším faktorem byla omezená podpora TLS 1.3 v Traefiku, jak potvrzují [[https://doc.traefik.io/traefik/https/tls/|dokumentace]] a plány na implementaci v Go 1.24, což má být dostupné v únoru 2025.
 +
 +Na základě doporučení v diskusi jsem v Traefik konfiguraci přešel na TLS 1.2. Takto vypadá můj soubor `traefik.yml`:
 +
 +<code yaml>
 +entryPoints:
 +  web:
 +    address: ":80"
 +  websecure:
 +    address: ":443"
 +    http:
 +      tls:
 +        certResolver: tmdnschallenge
 +        options: maxtls12
 +
 +certificatesResolvers:
 +  tmdnschallenge:
 +    acme:
 +      email: "" 
 +      storage: "/etc/acme/acme.json"
 +      dnsChallenge:
 +        provider: cloudflare
 +        delayBeforeCheck: 10
 +
 +providers:
 +  docker:
 +    exposedByDefault: false
 +
 +global:
 +  sendAnonymousUsage: false
 +
 +tls:
 +  options:
 +    maxtls12:
 +      minVersion: VersionTLS12
 +      maxVersion: VersionTLS12
 +      sniStrict: true
 +</code>
 +
 +Nicméně ani toto řešení nestačilo. Nakonec jsem upravil nastavení v Cloudflare. V menu **SSL/TLS → Edge Certificates** jsem deaktivoval podporu TLS 1.3:
 +
 +  TLS 1.3  
 +  Enable the latest version of the TLS protocol for improved security and performance.
 +
 +{{:it:server:pasted:20241231-212724.png}}
 +
 +Výsledek se projevil až po několika hodinách (cca 6 hodin až den). Tato kombinace kroků vedla k úspěšnému vyřešení problému.
 +
 +
  
  
Řádek 882: Řádek 951:
 </code> </code>
  
-===== Shrnutí =====+ 
 +===== Gitea ===== 
 + 
 +Na správu projektů, zdrojového kódu, verzování, klientských dat atp. jsem chtěl používat git. Chtěl jsem na serveru jednoduchou službu, abych si mohl zobrazit přehled repozitářů. Podobně jako GitHub. A úplně perfektní pro moje potřeby se ukázal projekt Gitea. 
 + 
 +K mojí smůle mám aktuálně Raspberry Pi s 32bitovým OS. Nemůžu teď přecházet na 64bit a Gitea není na hub.docker.com v 32bitové verzi, pouze 64bitové. Takže to vypadalo špatně. Nicméně jako schůdné řešení se ukázalo stáhnout zdrojové kódy Gitea a vytvořit Dockerfile pro 32bit ARM. 
 + 
 +Stáhl jsem zdrojové soubory a udělal jsem docker build pro ARM: 
 +<code bash> 
 +git clone https://github.com/go-gitea/gitea.git 
 +cd gitea 
 +docker build --platform linux/arm/v7 -t gitea-arm32 . 
 +</code> 
 + 
 +Pro informaci: 
 +  * **linux/arm/v7**: Cílová platforma pro ARM32. 
 +  * **linux/arm64/v8**: Pro ARM64 (pokud byste migrovali na 64bitový systém). 
 + 
 +Podařilo se mi úspěšně sestavit a rozběhnout. 
 + 
 +Tady je moje konfigurace do `docker-compose.yml`: 
 +<code yaml> 
 +gitea: 
 +  image: gitea-arm32 
 +  container_name: gitea 
 +  restart: "no" 
 +  environment: 
 +    - USER_UID=1000 
 +    - USER_GID=1000 
 +    - GITEA__database__DB_TYPE=postgres 
 +    - GITEA__database__HOST=postgres 
 +    - GITEA__database__NAME=${GITEA_DB} 
 +    - GITEA__database__USER=${GITEA_DB_USER} 
 +    - GITEA__database__PASSWD=${GITEA_DB_PASSWORD} 
 +  restart: always 
 +  volumes: 
 +    - ${GITEA_VOLUME_PATH}:/data 
 +    - /etc/timezone:/etc/timezone:ro 
 +    - /etc/localtime:/etc/localtime:ro 
 +  depends_on: 
 +    - postgres 
 +  labels: 
 +    traefik.enable: "true" 
 +    traefik.http.routers.gitea-insecure.rule: "Host(`${FQDN_GITEA}`)" 
 +    traefik.http.routers.gitea-insecure.entrypoints: "web" 
 +    traefik.http.routers.gitea-insecure.middlewares: "redirect" 
 +    traefik.http.middlewares.redirect.redirectscheme.scheme: "https" 
 +    traefik.http.routers.gitea.rule: "Host(`${FQDN_GITEA}`)" 
 +    traefik.http.routers.gitea.entrypoints: "websecure" 
 +    traefik.http.routers.gitea.tls.certresolver: "tmdnschallenge" 
 +    traefik.http.services.gitea.loadbalancer.server.port: "3000" 
 +</code> 
 + 
 +==== Problémy se kterými jsem se setkal při provozu Gitea ==== 
 + 
 +Při nahrávání většího repozitáře do Gitea (cca 2 GB) se objevila tato chyba: 
 + 
 +<code> 
 +error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 Internal Server Error 
 +</code> 
 + 
 + 
 +Po hledání řešení jsem zjistil následující: 
 + 
 +1. Zvýšil jsem globální Git buffer: 
 +<code bash> 
 +git config --global http.postBuffer 157286400 
 +</code> 
 + 
 +Nebo pouze pro daný repozitář: 
 + 
 +<code bash> 
 +cd your_repo 
 +git config http.postBuffer 157286400 
 +</code> 
 + 
 +Více informací o tomto nastavení naleznete na:   
 +[[https://stackoverflow.com/questions/44780221/git-push-failing-http-500-curl-22-the-requested-url-returned-error-500-internal]] 
 + 
 +2: Nastavil jsem `http.keepAlive`: 
 +<code bash> 
 +git config http.keepAlive true 
 +</code> 
 + 
 +Pro obnovení výchozího stavu (pokud člověk nastaví parametry globálně): 
 +<code bash> 
 +git config --global --unset http.postBuffer 
 +git config --global --unset http.keepAlive 
 +</code> 
 + 
 +3. V konfiguraci Traefiku jsem přidal část transport: 
 +<code yaml> 
 +entryPoints: 
 +  web: 
 +    address: ":80" 
 +  websecure: 
 +    address: ":443" 
 +    http: 
 +      tls: 
 +        certResolver: tmdnschallenge 
 +        options: maxtls12 
 +    transport: 
 +      respondingTimeouts: 
 +        readTimeout: 30m 
 +</code> 
 + 
 +Zdroj informací:   
 +[[https://community.traefik.io/t/increase-maximum-body-size-without-buffering/15928/6]] 
 + 
 +Po těchto úpravách jsem mohl nahrát i objemnější repozitář. 
 + 
 + 
 +==== Zabezpečení Gitea a přihlašování bez hesla ==== 
 + 
 +I když provozuji server lokálně, tak jede přes HTTPS a nechci, aby byl repozitář volně přístupný v síti. Ovšem na počítači, kde mám stažený repozitář, nechci při každé aktualizaci zadávat heslo. 
 + 
 +V Gitea jsem vytvořil token pro přihlašování místo hesla. Na svém počítači jsem si v domovském adresáři vytvořil soubor `.netrc`: 
 + 
 +<code> 
 +machine gitea.servername.cz 
 +login muj_uzivatel_gitea 
 +password sem_prijde_token 
 +</code> 
 + 
 +Tím jsem dosáhl pohodlného přihlašování bez opakovaného zadávání hesla. 
 + 
 + 
 +===== Zabezpečení Solar Assistanta na portu 80 přes Traefik ===== 
 + 
 +Potřeboval jsem zabezpečit Solar Assistanta, který běží na Raspberry Pi na portu 80, a rozhodl jsem se k tomu využít Traefik. Vytvořil jsem tunel pomocí `autossh` ze serveru, na kterém běží Traefik. 
 + 
 +SSH tunel je šifrovaný a web Solar Assistanta byl po propojení dostupný na adrese `localhost:8089`. Cílem tedy bylo nastavit Traefik tak, aby přistupoval na `localhost:8089`. Problém však byl, že Traefik v kontejneru nemůže přistupovat na `localhost:8089`, protože tam nic není – Traefik se musí dostat mimo kontejner. 
 + 
 +V tomto případě se konfigurace odehrává pomocí labelů u kontejneru Traefik, protože se nebude přistupovat do jiného kontejneru. 
 + 
 +==== Konfigurace Docker Compose ==== 
 + 
 +<code yaml> 
 +proxy: 
 +  image: traefik 
 +  restart: always 
 +  container_name: traefik 
 +  ports: 
 +    - "443:443" # HTTPS 
 +    - "80:80" 
 +  extra_hosts: 
 +    - "host.docker.internal:host-gateway" 
 +  environment: 
 +    - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL} 
 +    - CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN} 
 +    - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} 
 +  volumes: 
 +    - ${VOLUME_PATH}/traefik/acme:/etc/acme/ 
 +    - ${VOLUME_PATH}/traefik/.htpasswd:/auth/.htpasswd 
 +    - /var/run/docker.sock:/var/run/docker.sock 
 +    - ./traefik.yml:/etc/traefik/traefik.yml:ro 
 +    - ./traefik-dynamic-config:/etc/traefik/dynamic-config:ro 
 +  labels: 
 +    traefik.enable: "true" 
 + 
 +    # Přesměrování HTTP na HTTPS 
 +    traefik.http.routers.solar-insecure.rule: "Host(`${FQDN_SOLAR}`)" 
 +    traefik.http.routers.solar-insecure.entrypoints: "web" 
 +    traefik.http.routers.solar-insecure.middlewares: "redirect" 
 + 
 +    # Middleware pro přesměrování na HTTPS 
 +    traefik.http.middlewares.redirect.redirectscheme.scheme: "https" 
 + 
 +    # HTTPS router 
 +    traefik.http.routers.solar.rule: "Host(`${FQDN_SOLAR}`)" 
 +    traefik.http.routers.solar.entrypoints: "websecure" 
 +    traefik.http.routers.solar.tls.certresolver: "tmdnschallenge" 
 +    traefik.http.routers.solar.service: "solar@file" 
 +</code> 
 + 
 +==== Dynamická konfigurace ==== 
 + 
 +Do `docker-compose.yml` jsem musel přidat odkaz na dynamické nastavení: 
 +<code yaml> 
 +traefik.http.routers.solar.service: "solar@file" 
 +</code> 
 + 
 +Soubor `traefik.yml` jsem upravil takto: 
 +<code yaml> 
 +providers: 
 +  docker: 
 +    exposedByDefault: false 
 +  file: 
 +    directory: "/etc/traefik/dynamic-config" 
 +    watch: true  # Sleduje změny v souboru 
 +</code> 
 + 
 +Ve složce `traefik-dynamic-config` se nachází soubor `dynamic-config.yml`: 
 +<code yaml> 
 +http: 
 +  services: 
 +    solar: 
 +      loadBalancer: 
 +        servers: 
 +          - url: "http://host.docker.internal:8089" 
 +</code> 
 + 
 +==== Postup konfigurace ==== 
 + 
 +1. Musel jsem připravit dynamickou konfiguraci a přidat složku: 
 +<code> 
 +./traefik-dynamic-config:/etc/traefik/dynamic-config:ro 
 +</code> 
 +Docker neumí pracovat se změnami, pokud je definován pouze soubor – je třeba nasměrovat na celou složku. 
 + 
 +2. Změna se projeví bez restartu Traefiku díky nastavení `watch: true`. 
 + 
 +3. Původně jsem se snažil nadefinovat přesměrování přímo v `docker-compose.yml`, ale dle článku [[https://community.traefik.io/t/what-does-loadbalancer-server-url-really-mean/23728|What does loadbalancer.server.url really mean]] je nutné využít dynamický konfigurační soubor. 
 + 
 +4. Nasledováním rady z [[https://community.traefik.io/t/traefik-not-reloading-configuration-when-dynamic-file-was-changed/1774|Traefik not reloading configuration when dynamic file was changed]] jsem pochopil, že musím použít celou složku pro dynamickou konfiguraci. 
 + 
 +Dokud jsem nepřesunul nastavení do dynamického konfiguračního souboru, konfigurace nefungovala. 
 + 
 + 
 + 
 +===== Shrnutí a závěrečná konfigurace =====
  
  
Řádek 890: Řádek 1179:
  
   * https://docs.teslamate.org/docs/guides/traefik/   * https://docs.teslamate.org/docs/guides/traefik/
 +
 +
 +Protože je projekt stále živý a od napsání jsem stihl už udělat dost změn, přidávám aktuální soubory. Ve složce mám ještě soubor **.env** kde jsou proměnné s hesly a cestami, abych je nemusel psát do docker-compose.yml a mohl si je u jiného systému změnit. 
 +
 +Tady je **docker-compose.yml**:
 +
 +<code yaml>
 +version: "3.7"
 +
 +
 +
 +services:
 +
 +
 +  proxy:
 +    image: traefik
 +    restart: always
 +    container_name: traefik
 +    ports:
 +      - "443:443" # HTTPS
 +      - "80:80"
 +    extra_hosts:
 +      - "host.docker.internal:host-gateway"
 +    environment:
 +      - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
 +      - CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN}
 +      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
 +    volumes:
 +      - ${VOLUME_PATH}/traefik/acme:/etc/acme/
 +      - ${VOLUME_PATH}/traefik/.htpasswd:/auth/.htpasswd
 +      - /var/run/docker.sock:/var/run/docker.sock
 +      - ./traefik.yml:/etc/traefik/traefik.yml:ro
 +      - ./traefik-dynamic-config:/etc/traefik/dynamic-config:ro
 +    labels:
 +      traefik.enable: "true"
 +
 +      # Redirect HTTP to HTTPS
 +      traefik.http.routers.solar-insecure.rule: "Host(`${FQDN_SOLAR}`)"
 +      traefik.http.routers.solar-insecure.entrypoints: "web"
 +      traefik.http.routers.solar-insecure.middlewares: "redirect"
 +
 +      # Middleware for HTTPS redirection
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # HTTPS router
 +      traefik.http.routers.solar.rule: "Host(`${FQDN_SOLAR}`)"
 +      traefik.http.routers.solar.entrypoints: "websecure"
 +      traefik.http.routers.solar.tls.certresolver: "tmdnschallenge"
 +      traefik.http.routers.solar.service: "solar@file"
 +
 + 
 +
 +  postgres:
 +    container_name: postgres
 +    image: postgres:17
 +    restart: always
 +    environment:
 +      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
 +      - TZ=${DOCKER_TZ}
 +    volumes:
 +      - ${VOLUME_PATH}/postgres:/var/lib/postgresql/data
 +
 +
 +  php-apache:
 +    container_name: php-apache
 +    image: php:apache
 +    restart: always
 +    volumes:
 +      - ${VOLUME_PATH}/www:/var/www/html:ro 
 +    labels:
 +      traefik.enable: "true"
 +  
 +      # Redirect HTTP to HTTPS
 +      traefik.http.routers.smarthome-insecure.rule: "Host(`${FQDN_PHP_APACHE}`)"
 +      traefik.http.routers.smarthome-insecure.entrypoints: "web"
 +      traefik.http.routers.smarthome-insecure.middlewares: "redirect"
 +
 +      # Middleware for HTTPS redirection
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # HTTPS router
 +      traefik.http.routers.smarthome.rule: "Host(`${FQDN_PHP_APACHE}`)"
 +      traefik.http.routers.smarthome.entrypoints: "websecure"
 +      traefik.http.routers.smarthome.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.smarthome.loadbalancer.server.port: "80"
 +
 +
 +  mosquitto:
 +    container_name: mosquitto
 +    build:
 +      context: ${IOT_STACK}/.templates/mosquitto/.
 +      args:
 +      - MOSQUITTO_BASE=eclipse-mosquitto:latest
 +    restart: unless-stopped
 +    environment:
 +    - TZ=${DOCKER_TZ}
 +    ports:
 +    - "8883:8883"
 +    volumes:
 +    - ${VOLUME_PATH}/mosquitto/config:/mosquitto/config
 +    - ${VOLUME_PATH}/mosquitto/data:/mosquitto/data
 +    - ${VOLUME_PATH}/mosquitto/log:/mosquitto/log
 +    - ${VOLUME_PATH}/mosquitto/pwfile:/mosquitto/pwfile
 +
 +  influxdb:
 +    container_name: influxdb
 +    image: "influxdb:1.8"
 +    restart: unless-stopped
 +    ports:
 +      - "127.0.0.1:8086:8086"
 +    environment:
 +    - TZ=${DOCKER_TZ}
 +    - INFLUXDB_HTTP_FLUX_ENABLED=false
 +    - INFLUXDB_REPORTING_DISABLED=false
 +    - INFLUXDB_HTTP_AUTH_ENABLED=false
 +    - INFLUXDB_MONITOR_STORE_ENABLED=FALSE
 +    - INFLUX_USERNAME=${INFLUX_USERNAME}
 +    - INFLUX_PASSWORD=${INFLUX_PASSWORD}
 +    volumes:
 +    - ${VOLUME_PATH}/influxdb/data:/var/lib/influxdb
 +    - ${VOLUME_PATH}/backups/influxdb/db:/var/lib/influxdb/backup
 +    healthcheck:
 +      test: ["CMD", "curl", "http://localhost:8086"]
 +      interval: 30s
 +      timeout: 10s
 +      retries: 3
 +      start_period: 30s
 +
 +
 +  nodered:
 +    container_name: nodered
 +    build:
 +      context: ${IOT_STACK}/services/nodered/.
 +      args:
 +      - DOCKERHUB_TAG=latest
 +      - EXTRA_PACKAGES=ffmpeg
 +    restart: unless-stopped
 +    user: "0"
 +    environment:
 +      - TZ=${DOCKER_TZ}
 +    volumes:
 +      - ${VOLUME_PATH}/nodered/data:/data
 +      - ${VOLUME_PATH}/nodered/ssh:/root/.ssh
 +      - /var/run/docker.sock:/var/run/docker.sock
 +      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
 +    devices:
 +      - "/dev/ttyAMA0:/dev/ttyAMA0"
 +      - "/dev/vcio:/dev/vcio"
 +      - "/dev/gpiomem:/dev/gpiomem"
 +    labels:
 +      traefik.enable: "true"
 +
 +      # Přesměrování HTTP na HTTPS
 +      traefik.http.routers.nodered-insecure.rule: "Host(`${FQDN_NODERED}`)"
 +      traefik.http.routers.nodered-insecure.entrypoints: "web"
 +      traefik.http.routers.nodered-insecure.middlewares: "redirect"
 +
 +      # Middleware pro přesměrování na HTTPS
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # HTTPS konfigurace
 +      traefik.http.routers.nodered.rule: "Host(`${FQDN_NODERED}`)"
 +      traefik.http.routers.nodered.entrypoints: "websecure"
 +      traefik.http.routers.nodered.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.nodered.loadbalancer.server.port: "1880"
 +
 +  grafana:
 +    container_name: grafana
 +    image: grafana/grafana
 +    restart: unless-stopped
 +    user: "0"
 +    environment:
 +      - TZ=${DOCKER_TZ}
 +      - GF_PATHS_DATA=/var/lib/grafana
 +      - GF_PATHS_LOGS=/var/log/grafana
 +      - GF_SECURITY_ALLOW_EMBEDDING=true
 +      - GF_AUTH_ANONYMOUS_ENABLED=true
 +      - GF_AUTH_ANONYMOUS_ORG_NAME=Hajany
 +      - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
 +      - GF_SECURITY_HIDE_VERSION=true
 +    volumes:
 +      - ${VOLUME_PATH}/grafana/data:/var/lib/grafana
 +      - ${VOLUME_PATH}/grafana/log:/var/log/grafana
 +    healthcheck:
 +      test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:3000"]
 +      interval: 30s
 +      timeout: 10s
 +      retries: 3
 +      start_period: 30s
 +    labels:
 +      traefik.enable: "true"
 +
 +      # Redirect HTTP to HTTPS
 +      traefik.http.routers.grafana-insecure.rule: "Host(`${FQDN_GRAFANA}`)"
 +      traefik.http.routers.grafana-insecure.entrypoints: "web"
 +      traefik.http.routers.grafana-insecure.middlewares: "redirect"
 +
 +      # Middleware for HTTPS redirection
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # HTTPS router
 +      traefik.http.routers.grafana.rule: "Host(`${FQDN_GRAFANA}`)"
 +      traefik.http.routers.grafana.entrypoints: "websecure"
 +      traefik.http.routers.grafana.tls.certresolver: "tmdnschallenge"
 +
 +      # Define service port
 +      traefik.http.services.grafana.loadbalancer.server.port: "3000"
 +
 +
 +  teslamate:
 +    container_name: teslamate
 +    image: teslamate/teslamate:latest
 +    restart: always
 +    environment:
 +      - ENCRYPTION_KEY=${TM_ENCRYPTION_KEY}
 +      - DATABASE_USER=${TM_DB_USER}
 +      - DATABASE_PASS=${TM_DB_PASSWORD}
 +      - DATABASE_NAME=${TM_DB}
 +      - DATABASE_HOST=postgres
 +      - VIRTUAL_HOST=${FQDN_TESLAMATE}
 +        #- MQTT_HOST=mosquitto
 +      - MQTT_HOST=${MAJORDOMUS_MQTT_HOST}
 +      - MQTT_PORT=${MAJORDOMUS_MQTT_PORT}
 +      - MQTT_USERNAME=${MAJORDOMUS_MQTT_USERNAME}
 +      - MQTT_PASSWORD=${MAJORDOMUS_MQTT_PASSWORD}
 +      - MQTT_TLS=true
 +      - MQTT_TLS_ACCEPT_INVALID_CERTS=true
 +      - TZ=${DOCKER_TZ}
 +    #volumes:
 +    #  - ./import:/opt/app/import
 +    labels:
 +      traefik.enable: "true"
 +
 +      # Router pro HTTP přesměrování na HTTPS
 +      traefik.http.routers.teslamate-insecure.rule: "Host(`${FQDN_TESLAMATE}`)"
 +      traefik.http.routers.teslamate-insecure.entrypoints: "web"
 +      traefik.http.routers.teslamate-insecure.middlewares: "redirect"
 +
 +      # Middleware pro přesměrování z HTTP na HTTPS
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      traefik.http.routers.teslamate-ws.rule: "Host(`${FQDN_TESLAMATE}`) && Path(`/live/websocket`)"
 +      traefik.http.routers.teslamate-ws.entrypoints: "websecure"
 +      traefik.http.routers.teslamate-ws.tls: ""
 +
 +      traefik.http.routers.teslamate.middlewares: "teslamate-auth"
 +      traefik.http.routers.teslamate.rule: "Host(`${FQDN_TESLAMATE}`)"
 +      traefik.http.routers.teslamate.entrypoints: "websecure"
 +      traefik.http.routers.teslamate.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.teslamate.loadbalancer.server.port: "4000"
 +
 +
 +      traefik.http.middlewares.teslamate-auth.basicauth.realm: "teslamate"
 +      traefik.http.middlewares.teslamate-auth.basicauth.usersfile: "/auth/.htpasswd"
 +
 +    cap_drop:
 +      - all
 +
 +
 +  grafana-teslamate:
 +    container_name: grafana-teslamate
 +    image: teslamate/grafana:latest
 +    restart: always
 +    environment:
 +      - DATABASE_USER=${TM_DB_USER}
 +      - DATABASE_PASS=${TM_DB_PASSWORD}
 +      - DATABASE_NAME=${TM_DB}
 +      - DATABASE_HOST=postgres
 +      - TZ=${DOCKER_TZ}
 +      - GF_SERVER_DOMAIN=${FQDN_TESLAMATE}
 +      - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana
 +      - GF_SERVER_SERVE_FROM_SUB_PATH=true
 +    labels:
 +      # aktivace Traefiku pro tento kontejner
 +      traefik.enable: "true"
 +
 +      # Router pro HTTP přesměrování na HTTPS
 +      traefik.http.routers.grafana-teslamate-insecure.rule: "Host(`${FQDN_TESLAMATE}`) && (Path(`/grafana`) || PathPrefix(`/grafana/`))"
 +      traefik.http.routers.grafana-teslamate-insecure.entrypoints: "web"
 +      traefik.http.routers.grafana-teslamate-insecure.middlewares: "redirect"
 +
 +      # Middleware pro přesměrování z HTTP na HTTPS
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      traefik.http.routers.grafana-teslamate.rule: "Host(`${FQDN_TESLAMATE}`) && (Path(`/grafana`) || PathPrefix(`/grafana/`))"
 +      traefik.http.routers.grafana-teslamate.entrypoints: "websecure"
 +      traefik.http.routers.grafana-teslamate.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.grafana-teslamate.loadbalancer.server.port: "3000"
 +    volumes:
 +      - grafana-teslamate:/var/lib/grafana
 +
 +
 +  redis:
 +    container_name: redis
 +    image: redis:alpine
 +    restart: always
 +    command: ["redis-server", "--requirepass", "${REDIS_HOST_PASSWORD}"] #replace with your secure password
 +    volumes:
 +      - redis-data:/data
 +
 +
 +  nextcloud:
 +    container_name: nextcloud
 +    image: nextcloud:apache
 +    build:
 +      context: ./Dockerfiles/nextcloud/.
 +    restart: "no"
 +    extra_hosts:
 +      - "${FQDN_NEXTCLOUD}:${NEXTCLOUD_EXTRA_HOST}"
 +    environment:
 +      - POSTGRES_DB=${NEXTCLOUD_DB}
 +      - POSTGRES_USER=${NEXTCLOUD_DB_USER}
 +      - POSTGRES_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
 +      - POSTGRES_HOST=postgres
 +      - TRUSTED_PROXIES=${TRUSTED_PROXIES}
 +      - OVERWRITEHOST=${FQDN_NEXTCLOUD}
 +      - OVERWRITEPROTOCOL=https
 +      - APACHE_DISABLE_REWRITE_IP=1
 +      - OVERWRITECLIURL=https://${FQDN_NEXTCLOUD}
 +      - REDIS_HOST=redis
 +      - REDIS_HOST_PASSWORD=${REDIS_HOST_PASSWORD}
 +      - PHP_MEMORY_LIMIT=1024M
 +    volumes:
 +      - ${NEXTCLOUD_VOLUME_PATH}:/var/www/html
 +      - type: tmpfs
 +        target: /tmp
 +        tmpfs:
 +          mode: "1777" # Volitelně: nastavení oprávnění
 +    labels:
 +      traefik.enable: "true"
 +
 +      # Redirect HTTP to HTTPS
 +      traefik.http.routers.nextcloud-insecure.rule: "Host(`${FQDN_NEXTCLOUD}`)"
 +      traefik.http.routers.nextcloud-insecure.entrypoints: "web"
 +      traefik.http.routers.nextcloud-insecure.middlewares: "redirect"
 +
 +      # Middleware for HTTPS redirection
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # HTTPS router
 +      traefik.http.routers.nextcloud.rule: "Host(`${FQDN_NEXTCLOUD}`)"
 +      traefik.http.routers.nextcloud.entrypoints: "websecure"
 +      traefik.http.routers.nextcloud.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.nextcloud.loadbalancer.server.port: "80"
 +
 +      # Middleware for CalDAV/CardDAV redirects
 +      traefik.http.middlewares.nextcloud_redirectregex.redirectregex.permanent: "true"
 +      traefik.http.middlewares.nextcloud_redirectregex.redirectregex.regex: "https://(.*)/.well-known/(?:card|cal)dav"
 +      traefik.http.middlewares.nextcloud_redirectregex.redirectregex.replacement: "https://$${1}/remote.php/dav"
 +
 +      # Add HSTS header
 +      traefik.http.middlewares.nextcloud-hsts.headers.stsSeconds: "15552000"
 +      traefik.http.middlewares.nextcloud-hsts.headers.stsIncludeSubdomains: "true"
 +      traefik.http.middlewares.nextcloud-hsts.headers.stsPreload: "true"
 +
 +      traefik.http.routers.nextcloud.middlewares: "nextcloud-hsts"
 +
 +    depends_on:
 +      - postgres
 +      - redis
 +
 +
 +  gitea:
 +    image: gitea-arm32
 +    container_name: gitea
 +    restart: "no"
 +    environment:
 +      - USER_UID=1000
 +      - USER_GID=1000
 +      - GITEA__database__DB_TYPE=postgres
 +      - GITEA__database__HOST=postgres
 +      - GITEA__database__NAME=${GITEA_DB}
 +      - GITEA__database__USER=${GITEA_DB_USER}
 +      - GITEA__database__PASSWD=${GITEA_DB_PASSWORD}
 +    restart: always
 +    volumes:
 +      - ${GITEA_VOLUME_PATH}:/data
 +      - /etc/timezone:/etc/timezone:ro
 +      - /etc/localtime:/etc/localtime:ro
 +    #ports:
 +      #- "3000:3000"
 +      #- "2222:22"
 +    depends_on:
 +      - postgres
 +    labels:
 +      # Aktivace Traefiku pro tuto službu
 +      traefik.enable: "true"
 +
 +      # Router pro HTTP přesměrování na HTTPS
 +      traefik.http.routers.gitea-insecure.rule: "Host(`${FQDN_GITEA}`)"
 +      traefik.http.routers.gitea-insecure.entrypoints: "web"
 +      traefik.http.routers.gitea-insecure.middlewares: "redirect"
 +
 +      # Middleware pro přesměrování na HTTPS
 +      traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
 +
 +      # Router pro HTTPS připojení
 +      traefik.http.routers.gitea.rule: "Host(`${FQDN_GITEA}`)"
 +      traefik.http.routers.gitea.entrypoints: "websecure"
 +      traefik.http.routers.gitea.tls.certresolver: "tmdnschallenge"
 +      traefik.http.services.gitea.loadbalancer.server.port: "3000"
 +
 +        #traefik.http.middlewares.upload-limit.buffering.maxRequestBodyBytes: "0"
 +        #traefik.http.middlewares.upload-limit.buffering.maxResponseBodyBytes: "0"
 +        #traefik.http.middlewares.upload-limit.buffering.memRequestBodyBytes: "0"
 +        #traefik.http.middlewares.upload-limit.buffering.memResponseBodyBytes: "0"
 +        #traefik.http.middlewares.upload-limit.buffering.retryExpression: "IsNetworkError()"
 +        #traefik.http.routers.gitea.middlewares: "upload-limit"
 +
 +
 +
 +volumes:
 +  grafana-teslamate:
 +  redis-data:
 +  
 +</code>
 +
 +
 +Konfigurace **traefik.yml**:
 +
 +<code yaml>
 +entryPoints:
 +  web:
 +    address: ":80"
 +  websecure:
 +    address: ":443"
 +    http:
 +      tls:
 +        certResolver: tmdnschallenge # Přidání certifikátového resolveru pro HTTPS
 +        options: maxtls12 # Vynucení TLS 1.2
 +    transport:
 +      respondingTimeouts:
 +        readTimeout: 30m
 +
 +
 +certificatesResolvers:
 +  tmdnschallenge:
 +    acme:
 +      email: "mujemail@example.com"  # Email pro komunikaci s Let's Encrypt
 +      storage: "/etc/acme/acme.json"  # Úložiště certifikátů
 +      dnsChallenge:
 +        provider: cloudflare  # Použití Cloudflare API
 +        delayBeforeCheck: 10  # Volitelná hodnota pro zpoždění ověření
 +
 +providers:
 +  docker:
 +    exposedByDefault: false
 +  file:
 +    directory: "/etc/traefik/dynamic-config"
 +    watch: true  # Sleduje změny v souboru
 +
 +global:
 +  sendAnonymousUsage: false
 +
 +tls:
 +  options:
 +    maxtls12:
 +      minVersion: VersionTLS12
 +      maxVersion: VersionTLS12
 +      sniStrict: true           # Zajištění přísného ověřování SNI
 +</code>
 +
 +
 +Konfigurace **dynamic-config.yml**:
 +
 +<code yaml>
 +http:
 +  services:
 +    solar:
 +      loadBalancer:
 +        servers:
 +          - url: "http://host.docker.internal:8088"
 +</code>
 +
  • it/server/traefik-reverzni-proxy.1735520851.txt.gz
  • Poslední úprava: 2024/12/30 01:07
  • autor: Petr Nosek