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:06] – [Konfigurace Nextcloud v Dockeru] 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 699: Řádek 699:
  
  
-=== Spouštění OCC - úpravy nextcloudu === +=== OCC v NextCloudu ===
- +
-===== OCC v Nextcloudu =====+
  
 OCC (OwnCloud Command) je příkazový nástroj, který umožňuje správu a údržbu Nextcloudu z příkazové řádky. Tento nástroj je velmi užitečný pro provádění různých administrativních úkolů, jako je oprava dat, správa uživatelů, aktualizace databáze nebo nastavení systému. OCC (OwnCloud Command) je příkazový nástroj, který umožňuje správu a údržbu Nextcloudu z příkazové řádky. Tento nástroj je velmi užitečný pro provádění různých administrativních úkolů, jako je oprava dat, správa uživatelů, aktualizace databáze nebo nastavení systému.
Řádek 763: Řá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 884: Řá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 892: Řá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.1735520801.txt.gz
  • Poslední úprava: 2024/12/30 01:06
  • autor: Petr Nosek