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/22 16:55] – [Důležité parametry Grafany] 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 484: Řádek 484:
     Tato proměnná definuje doménu, na které je Grafana dostupná. Umožňuje Traefiku směrovat požadavky na správný kontejner.     Tato proměnná definuje doménu, na které je Grafana dostupná. Umožňuje Traefiku směrovat požadavky na správný kontejner.
  
-  * **GF_SERVER_ROOT_URL**   +  * **%%GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana%%**
-    <code>%(protocol)s://%(domain)s/grafana</code>  +
     Nastavuje kořenovou URL pro Grafanu včetně specifikace subcesty `/grafana`. Díky tomu je možné Grafanu provozovat na této subcestě bez konfliktů s jinými službami.     Nastavuje kořenovou URL pro Grafanu včetně specifikace subcesty `/grafana`. Díky tomu je možné Grafanu provozovat na této subcestě bez konfliktů s jinými službami.
  
Řádek 504: Řádek 503:
   * **LETSENCRYPT_EMAIL=***     * **LETSENCRYPT_EMAIL=***  
     Emailová adresa použitá pro registraci u Let's Encrypt. Slouží k notifikacím, například o expiraci certifikátu.     Emailová adresa použitá pro registraci u Let's Encrypt. Slouží k notifikacím, například o expiraci certifikátu.
-===== Shrnutí =====+ 
 + 
 + 
 +===== Nextcloud ===== 
 + 
 +==== Příprava Postgres databáze ==== 
 + 
 +Rozhodl jsem se využít existující docker s Postgres. Pro připojení k databázovému serveru Postgres jsem použil následující kroky. 
 + 
 +Nejprve jsem se připojil k běžícímu kontejneru s Postgres pomocí příkazu: 
 + 
 +<code bash> 
 +docker exec -it postgres bash 
 +</code> 
 + 
 +V rámci kontejneru jsem se připojil k databázovému serveru s těmito údaji: 
 + 
 +<code sql> 
 +psql -U ev_tesla_user -d postgres 
 +</code> 
 + 
 +Pro zobrazení aktuálně existujících uživatelů jsem použil příkaz: 
 + 
 +<code sql> 
 +\du 
 +</code> 
 + 
 +Výsledek byl následující: 
 + 
 +<code> 
 +                                 List of roles 
 +   Role name    |                         Attributes                          
 +----------------+------------------------------------------------------------ 
 + ev_tesla_user  | Superuser, Create role, Create DB, Replication, Bypass RLS 
 +</code> 
 + 
 +Následně jsem vypsal všechny dostupné databáze příkazem: 
 + 
 +<code sql> 
 +\l 
 +</code> 
 + 
 +Nakonec jsem vytvořil nového uživatele, databázi a přiřadil jsem uživateli práva k této databázi následujícími příkazy: 
 + 
 +<code sql> 
 +CREATE USER nextcloud_user WITH PASSWORD 'secure_password'; 
 +CREATE DATABASE nextcloud_db OWNER nextcloud_user; 
 +</code> 
 + 
 +==== Konfigurace Nextcloud v Dockeru ==== 
 + 
 +Protože všechno poběží na Raspberry Pi, není možné použít oficiální kontejner **Nextcloud AIO**. Ten není bohužel pro ARM architekturu. Proto jsem použil [[https://hub.docker.com/_/nextcloud|nextcloud]] a čerpal z [[https://github.com/docker-library/docs/blob/master/nextcloud/README.md|hlavní dokumentace]] a doplňující [[https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html|dokumentace k reverzní proxy]]. 
 + 
 +Zároveň jsem nastavil cacheovací server redis. Do docker-file.yml jsem tedy přidal: 
 + 
 +<code yaml> 
 + nextcloud: 
 +   container_name: nextcloud 
 +   image: nextcloud:apache 
 +   restart: always 
 +   extra_hosts: 
 +     - "nextcloud.nosekpetr.cz:192.168.1.123" 
 +   environment: 
 +     - POSTGRES_DB=nextcloud_db 
 +     - POSTGRES_USER=nextcloud_user 
 +     - POSTGRES_PASSWORD=*** #replace with your secure password 
 +     - POSTGRES_HOST=database 
 +     - TRUSTED_PROXIES=192.168.1.0/24 
 +     - OVERWRITEHOST=nextcloud.nosekpetr.cz 
 +     - OVERWRITEPROTOCOL=https 
 +     - APACHE_DISABLE_REWRITE_IP=1 
 +     - OVERWRITECLIURL=https://nextcloud.nosekpetr.cz 
 +     - REDIS_HOST=redis 
 +     - REDIS_HOST_PASSWORD=*** 
 +   volumes: 
 +     - ./nextcloud:/var/www/html 
 +   labels: 
 +     traefik.enable: "true" 
 + 
 +     # Redirect HTTP to HTTPS 
 +     traefik.http.routers.nextcloud-insecure.rule: "Host(`nextcloud.nosekpetr.cz`)" 
 +     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(`nextcloud.nosekpetr.cz`)" 
 +     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: 
 +     - database 
 +     - redis 
 + 
 + redis: 
 +   container_name: redis 
 +   image: redis:alpine 
 +   restart: always 
 +   command: ["redis-server", "--requirepass", "***"] #replace with your secure password 
 +   volumes: 
 +     - redis-data:/data 
 + 
 + 
 +volumes: 
 + teslamate-db: 
 + teslamate-grafana-data: 
 + redis-data: 
 + 
 +</code>  
 + 
 + 
 +=== extra_hosts === 
 +Konfigurace **extra_hosts** umožňuje nastavit vlastní DNS záznamy uvnitř kontejneru. To se hodí například pro řešení situací, kdy je třeba přiřadit určitou IP adresu k doménovému jménu, aniž by se tato změna musela provádět na externím DNS serveru. 
 + 
 +<code yaml> 
 +extra_hosts: 
 +  - "nextcloud.nosekpetr.cz:192.168.1.123" 
 +</code> 
 + 
 +Znamená, že požadavky na `nextcloud.nosekpetr.cz` budou směrovány na IP adresu `192.168.1.123`. 
 + 
 +=== Proměnné prostředí === 
 +**TRUSTED_PROXIES**, **OVERWRITEHOST**, **OVERWRITEPROTOCOL**, **APACHE_DISABLE_REWRITE_IP**, a **OVERWRITECLIURL** slouží k zajištění správné funkce Nextcloudu za reverzní proxy. 
 + 
 +  * **TRUSTED_PROXIES=192.168.1.0/24**   
 +    Tento parametr definuje seznam důvěryhodných proxy serverů. Je nezbytné, aby byla IP adresa reverzní proxy zahrnuta do tohoto seznamu, jinak může Nextcloud blokovat přístup. 
 + 
 +  * **OVERWRITEHOST=nextcloud.nosekpetr.cz**   
 +    Tato hodnota přepisuje hodnotu `HTTP_HOST` tak, aby odpovídala doméně, přes kterou je Nextcloud přístupný. 
 + 
 +  * **OVERWRITEPROTOCOL=https**   
 +    Přepíše protokol `HTTP` na `HTTPS`, což zajistí, že aplikace bude fungovat výhradně přes zabezpečené spojení. 
 + 
 +  * **APACHE_DISABLE_REWRITE_IP=1**   
 +    Zakazuje přepisování IP adres uživatele, které Apache provádí na základě hlaviček `X-Forwarded-For`. 
 + 
 +  * **OVERWRITECLIURL=https://nextcloud.nosekpetr.cz**   
 +    Nastavuje základní URL, kterou bude Nextcloud používat pro CLI operace. Toto je užitečné například při spouštění úloh cron nebo při komunikaci s externími API. 
 + 
 + 
 +=== Middleware pro CalDAV/CardDAV === 
 +Protokoly **CalDAV** a **CardDAV** jsou používány k synchronizaci kalendářů a kontaktů. Následující middleware zajišťuje, že tyto služby fungují správně i za reverzní proxy: 
 + 
 +<code yaml> 
 +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" 
 +</code> 
 + 
 +  * **permanent: "true"**   
 +    Zajišťuje, že přesměrování je trvalé (kód 301). 
 + 
 +  * **regex a replacement**   
 +    Regular expression `https://(.*)/.well-known/(?:card|cal)dav` zachytí požadavky na CalDAV/CardDAV endpointy a přesměruje je na `https://<domain>/remote.php/dav`, což je správná cesta v Nextcloudu. 
 + 
 + 
 +=== Middleware pro HSTS === 
 +HTTP Strict Transport Security (HSTS) chrání uživatele tím, že vyžaduje, aby byla veškerá komunikace vedena přes HTTPS: 
 + 
 +<code yaml> 
 +traefik.http.middlewares.nextcloud-hsts.headers.stsSeconds: "15552000" 
 +traefik.http.middlewares.nextcloud-hsts.headers.stsIncludeSubdomains: "true" 
 +traefik.http.middlewares.nextcloud-hsts.headers.stsPreload: "true" 
 +</code> 
 + 
 +  * **stsSeconds: "15552000"**   
 +    Udává dobu (v sekundách), po kterou má být HSTS aktivní. Zde je nastavena na 180 dní. 
 + 
 +  * **stsIncludeSubdomains: "true"**   
 +    Rozšiřuje politiku HSTS i na všechny subdomény. 
 + 
 +  * **stsPreload: "true"**   
 +    Označuje doménu pro zařazení do seznamu HSTS preload, který používají webové prohlížeče. 
 + 
 +Middleware je následně přidán k routeru pomocí: 
 + 
 +<code yaml> 
 +traefik.http.routers.nextcloud.middlewares: "nextcloud-hsts" 
 +</code> 
 + 
 + 
 +=== 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. 
 + 
 +Takto jsem spouštěl příkaz v Dockeru: 
 + 
 +<code bash> 
 +docker exec -u 33 -it nextcloud php /var/www/html/occ maintenance:repair --include-expensive 
 +</code> 
 + 
 +  * Přepíná instanci Nextcloudu do režimu údržby. 
 +  * Provádí opravy dat a databáze. Parametr --include-expensive zahrnuje i náročnější kontroly a opravy, které mohou být časově náročné, ale zvyšují celkovou stabilitu systému. 
 + 
 +=== Update Nextcloud Dockeru na novější verzi dle dokumentace === 
 + 
 + 
 +Při aktualizaci Nextcloudu v Dockeru je potřeba postupovat podle následujících kroků. Upozornění: Aktualizovat je možné pouze o jednu hlavní verzi najednou. Například při přechodu z verze 14 na 16 je nutné nejdříve aktualizovat z 14 na 15 a poté z 15 na 16. 
 + 
 +__Krok 1: Stažení nové verze kontejneru__ 
 +Stáhněte nejnovější verzi obrazu Nextcloudu pomocí příkazu: 
 + 
 +<code bash> 
 +docker pull nextcloud 
 +</code> 
 + 
 +__Krok 2: Zastavení a odstranění starého kontejneru__ 
 +Zastavte běžící kontejner Nextcloudu: 
 + 
 +<code bash> 
 +docker stop <jméno_vašeho_kontejneru> 
 +</code> 
 + 
 +Odstraňte starý kontejner: 
 + 
 +<code bash> 
 +docker rm <jméno_vašeho_kontejneru> 
 +</code> 
 + 
 +__Krok 3: Spuštění nového kontejneru__ 
 +Spusťte nový kontejner se stejnými parametry, které byly použity při původním spuštění (například volumes, porty, apod.): 
 + 
 +<code bash> 
 +docker run <OPTIONS> -d nextcloud 
 +</code> 
 + 
 +Ujistěte se, že při spuštění zahrnete všechny svazky (volumes), aby nedošlo ke ztrátě dat. Startup skript automaticky zjistí nesoulad mezi verzí v uložených datech a verzí kontejneru a spustí proces aktualizace. 
 + 
 +__Použití Docker Compose__ 
 + 
 +Pokud používáte Docker Compose, je aktualizace jednodušší, protože všechny parametry jsou již zapsány v souboru `docker-compose.yml`. Postupujte podle těchto kroků: 
 + 
 +1. Stáhněte aktualizovaný obraz: 
 +<code bash> 
 +docker compose pull 
 +</code> 
 + 
 +2. Restartujte kontejnery s novou verzí: 
 +<code bash> 
 +docker compose up -d 
 +</code> 
 + 
 +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. 
 + 
 + 
 + 
 + 
 +===== PHP s Apache ===== 
 + 
 +<code yaml> 
 +version: "3.3" 
 + 
 +services: 
 +  php-apache: 
 +    container_name: php-apache 
 +    image: php:apache 
 +    restart: always 
 +    volumes: 
 +      - ./smarthome:/var/www/html:ro  # Statické soubory a PHP aplikace 
 +    labels: 
 +      traefik.enable: "true" 
 + 
 +      # Redirect HTTP to HTTPS 
 +      traefik.http.routers.smarthome-insecure.rule: "Host(`smarthome.nosekpetr.cz`)" 
 +      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(`smarthome.nosekpetr.cz`)" 
 +      traefik.http.routers.smarthome.entrypoints: "websecure" 
 +      traefik.http.routers.smarthome.tls.certresolver: "tmdnschallenge" 
 +      traefik.http.services.smarthome.loadbalancer.server.port: "80" 
 + 
 +</code> 
 + 
 +===== Nodered ===== 
 + 
 + 
 +<code yaml> 
 +  nodered: 
 +    container_name: nodered 
 +    build: 
 +      context: ../IOTstack/services/nodered/
 +      args: 
 +      - DOCKERHUB_TAG=latest 
 +      - EXTRA_PACKAGES= 
 +    restart: unless-stopped 
 +    user: "0" 
 +    environment: 
 +      - TZ=Europe/Prague 
 +    volumes: 
 +      - ./nodered/data:/data 
 +      - ./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(`nodered.nosekpetr.cz`)" 
 +      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(`nodered.nosekpetr.cz`)" 
 +      traefik.http.routers.nodered.entrypoints: "websecure" 
 +      traefik.http.routers.nodered.tls.certresolver: "tmdnschallenge" 
 +      traefik.http.services.nodered.loadbalancer.server.port: "1880" 
 +             
 +</code> 
 + 
 + 
 +===== Grafana ===== 
 + 
 +Grafana pro jiné použití než vykreslení grafů z Teslamate. 
 + 
 +<code yaml> 
 +  grafana: 
 +    container_name: grafana 
 +    image: grafana/grafana 
 +    restart: unless-stopped 
 +    user: "0" 
 +    environment: 
 +      - TZ=Europe/Prague 
 +      - GF_PATHS_DATA=/var/lib/grafana 
 +      - GF_PATHS_LOGS=/var/log/grafana 
 +    volumes: 
 +      - ./grafana/data:/var/lib/grafana 
 +      - ./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(`grafana.nosekpetr.cz`)" 
 +      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(`grafana.nosekpetr.cz`)" 
 +      traefik.http.routers.grafana.entrypoints: "websecure" 
 +      traefik.http.routers.grafana.tls.certresolver: "tmdnschallenge" 
 + 
 +      # Define service port 
 +      traefik.http.services.grafana.loadbalancer.server.port: "3000" 
 + 
 +</code> 
 + 
 + 
 +===== 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 512: Řá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.1734886524.txt.gz
  • Poslední úprava: 2024/12/22 16:55
  • autor: Petr Nosek