Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| 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 Nosek | it: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:// |
| - | < | + | |
| 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, | Emailová adresa použitá pro registraci u Let's Encrypt. Slouží k notifikacím, | ||
| - | ===== 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 | ||
| + | </ | ||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Pro zobrazení aktuálně existujících uživatelů jsem použil příkaz: | ||
| + | |||
| + | <code sql> | ||
| + | \du | ||
| + | </ | ||
| + | |||
| + | Výsledek byl následující: | ||
| + | |||
| + | < | ||
| + | List of roles | ||
| + | Role name | | ||
| + | ----------------+------------------------------------------------------------ | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Následně jsem vypsal všechny dostupné databáze příkazem: | ||
| + | |||
| + | <code sql> | ||
| + | \l | ||
| + | </ | ||
| + | |||
| + | 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 ' | ||
| + | CREATE DATABASE nextcloud_db OWNER nextcloud_user; | ||
| + | </ | ||
| + | |||
| + | ==== 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:// | ||
| + | |||
| + | Zároveň jsem nastavil cacheovací server redis. Do docker-file.yml jsem tedy přidal: | ||
| + | |||
| + | <code yaml> | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | - " | ||
| + | | ||
| + | - POSTGRES_DB=nextcloud_db | ||
| + | - POSTGRES_USER=nextcloud_user | ||
| + | - POSTGRES_PASSWORD=*** #replace with your secure password | ||
| + | - POSTGRES_HOST=database | ||
| + | - TRUSTED_PROXIES=192.168.1.0/ | ||
| + | - OVERWRITEHOST=nextcloud.nosekpetr.cz | ||
| + | - OVERWRITEPROTOCOL=https | ||
| + | - APACHE_DISABLE_REWRITE_IP=1 | ||
| + | - OVERWRITECLIURL=https:// | ||
| + | - REDIS_HOST=redis | ||
| + | - REDIS_HOST_PASSWORD=*** | ||
| + | | ||
| + | - ./ | ||
| + | | ||
| + | | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | | ||
| + | |||
| + | # HTTPS router | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | # Middleware for CalDAV/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | # Add HSTS header | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | |||
| + | | ||
| + | - database | ||
| + | - redis | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | - redis-data:/ | ||
| + | |||
| + | |||
| + | volumes: | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | === 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: | ||
| + | - " | ||
| + | </ | ||
| + | |||
| + | 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**, | ||
| + | |||
| + | * **TRUSTED_PROXIES=192.168.1.0/ | ||
| + | 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:// | ||
| + | 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/ | ||
| + | Protokoly **CalDAV** a **CardDAV** jsou používány k synchronizaci kalendářů a kontaktů. Následující middleware zajišťuje, | ||
| + | |||
| + | <code yaml> | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.permanent: | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.regex: | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.replacement: | ||
| + | </ | ||
| + | |||
| + | * **permanent: | ||
| + | Zajišťuje, | ||
| + | |||
| + | * **regex a replacement** | ||
| + | Regular expression `https:// | ||
| + | |||
| + | |||
| + | === 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: | ||
| + | traefik.http.middlewares.nextcloud-hsts.headers.stsIncludeSubdomains: | ||
| + | traefik.http.middlewares.nextcloud-hsts.headers.stsPreload: | ||
| + | </ | ||
| + | |||
| + | * **stsSeconds: | ||
| + | Udává dobu (v sekundách), | ||
| + | |||
| + | * **stsIncludeSubdomains: | ||
| + | Rozšiřuje politiku HSTS i na všechny subdomény. | ||
| + | |||
| + | * **stsPreload: | ||
| + | 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: | ||
| + | </ | ||
| + | |||
| + | |||
| + | === 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ů, | ||
| + | |||
| + | Takto jsem spouštěl příkaz v Dockeru: | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -u 33 -it nextcloud php / | ||
| + | </ | ||
| + | |||
| + | * 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í: | ||
| + | |||
| + | __Krok 1: Stažení nové verze kontejneru__ | ||
| + | Stáhněte nejnovější verzi obrazu Nextcloudu pomocí příkazu: | ||
| + | |||
| + | <code bash> | ||
| + | docker pull nextcloud | ||
| + | </ | ||
| + | |||
| + | __Krok 2: Zastavení a odstranění starého kontejneru__ | ||
| + | Zastavte běžící kontejner Nextcloudu: | ||
| + | |||
| + | <code bash> | ||
| + | docker stop < | ||
| + | </ | ||
| + | |||
| + | Odstraňte starý kontejner: | ||
| + | |||
| + | <code bash> | ||
| + | docker rm < | ||
| + | </ | ||
| + | |||
| + | __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 < | ||
| + | </ | ||
| + | |||
| + | 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šší, | ||
| + | |||
| + | 1. Stáhněte aktualizovaný obraz: | ||
| + | <code bash> | ||
| + | docker compose pull | ||
| + | </ | ||
| + | |||
| + | 2. Restartujte kontejnery s novou verzí: | ||
| + | <code bash> | ||
| + | docker compose up -d | ||
| + | </ | ||
| + | |||
| + | Tímto způsobem dojde k aktualizaci Nextcloudu na novější verzi bez ztráty dat. Nezapomeňte zkontrolovat, | ||
| + | |||
| + | |||
| + | ==== 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: | ||
| + | |||
| + | Zjistil jsem, že příčinou je chybějící podpora **ECH (Encrypted Client Hello)**. ECH je moderní technologie šifrování, | ||
| + | |||
| + | Dočasným řešením bylo spustit Chrome s vypnutou funkcí ECH: | ||
| + | |||
| + | < | ||
| + | google-chrome --disable-features=EncryptedClientHello | ||
| + | </ | ||
| + | |||
| + | Tato úprava umožnila správné zobrazení stránky. | ||
| + | |||
| + | Při dalším pátrání jsem v diskusi na [[https:// | ||
| + | |||
| + | Dalším faktorem byla omezená podpora TLS 1.3 v Traefiku, jak potvrzují [[https:// | ||
| + | |||
| + | 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: ": | ||
| + | websecure: | ||
| + | address: ": | ||
| + | http: | ||
| + | tls: | ||
| + | certResolver: | ||
| + | options: maxtls12 | ||
| + | |||
| + | certificatesResolvers: | ||
| + | tmdnschallenge: | ||
| + | acme: | ||
| + | email: "" | ||
| + | storage: "/ | ||
| + | dnsChallenge: | ||
| + | provider: cloudflare | ||
| + | delayBeforeCheck: | ||
| + | |||
| + | providers: | ||
| + | docker: | ||
| + | exposedByDefault: | ||
| + | |||
| + | global: | ||
| + | sendAnonymousUsage: | ||
| + | |||
| + | tls: | ||
| + | options: | ||
| + | maxtls12: | ||
| + | minVersion: VersionTLS12 | ||
| + | maxVersion: VersionTLS12 | ||
| + | sniStrict: true | ||
| + | </ | ||
| + | |||
| + | 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. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 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: " | ||
| + | |||
| + | services: | ||
| + | php-apache: | ||
| + | container_name: | ||
| + | image: php: | ||
| + | restart: always | ||
| + | volumes: | ||
| + | - ./ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.smarthome-insecure.rule: | ||
| + | traefik.http.routers.smarthome-insecure.entrypoints: | ||
| + | traefik.http.routers.smarthome-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.smarthome.rule: | ||
| + | traefik.http.routers.smarthome.entrypoints: | ||
| + | traefik.http.routers.smarthome.tls.certresolver: | ||
| + | traefik.http.services.smarthome.loadbalancer.server.port: | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Nodered ===== | ||
| + | |||
| + | |||
| + | <code yaml> | ||
| + | nodered: | ||
| + | container_name: | ||
| + | build: | ||
| + | context: ../ | ||
| + | args: | ||
| + | - DOCKERHUB_TAG=latest | ||
| + | - EXTRA_PACKAGES= | ||
| + | restart: unless-stopped | ||
| + | user: " | ||
| + | environment: | ||
| + | - TZ=Europe/ | ||
| + | volumes: | ||
| + | - ./ | ||
| + | - ./ | ||
| + | - / | ||
| + | - / | ||
| + | devices: | ||
| + | - "/ | ||
| + | - "/ | ||
| + | - "/ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Přesměrování HTTP na HTTPS | ||
| + | traefik.http.routers.nodered-insecure.rule: | ||
| + | traefik.http.routers.nodered-insecure.entrypoints: | ||
| + | traefik.http.routers.nodered-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS konfigurace | ||
| + | traefik.http.routers.nodered.rule: | ||
| + | traefik.http.routers.nodered.entrypoints: | ||
| + | traefik.http.routers.nodered.tls.certresolver: | ||
| + | traefik.http.services.nodered.loadbalancer.server.port: | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Grafana ===== | ||
| + | |||
| + | Grafana pro jiné použití než vykreslení grafů z Teslamate. | ||
| + | |||
| + | <code yaml> | ||
| + | grafana: | ||
| + | container_name: | ||
| + | image: grafana/ | ||
| + | restart: unless-stopped | ||
| + | user: " | ||
| + | environment: | ||
| + | - TZ=Europe/ | ||
| + | - GF_PATHS_DATA=/ | ||
| + | - GF_PATHS_LOGS=/ | ||
| + | volumes: | ||
| + | - ./ | ||
| + | - ./ | ||
| + | healthcheck: | ||
| + | test: [" | ||
| + | interval: 30s | ||
| + | timeout: 10s | ||
| + | retries: 3 | ||
| + | start_period: | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.grafana-insecure.rule: | ||
| + | traefik.http.routers.grafana-insecure.entrypoints: | ||
| + | traefik.http.routers.grafana-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.grafana.rule: | ||
| + | traefik.http.routers.grafana.entrypoints: | ||
| + | traefik.http.routers.grafana.tls.certresolver: | ||
| + | |||
| + | # Define service port | ||
| + | traefik.http.services.grafana.loadbalancer.server.port: | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Gitea ===== | ||
| + | |||
| + | Na správu projektů, zdrojového kódu, verzování, | ||
| + | |||
| + | 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:// | ||
| + | cd gitea | ||
| + | docker build --platform linux/ | ||
| + | </ | ||
| + | |||
| + | Pro informaci: | ||
| + | * **linux/ | ||
| + | * **linux/ | ||
| + | |||
| + | 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: | ||
| + | restart: " | ||
| + | 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}:/ | ||
| + | - / | ||
| + | - / | ||
| + | depends_on: | ||
| + | - postgres | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | traefik.http.routers.gitea-insecure.rule: | ||
| + | traefik.http.routers.gitea-insecure.entrypoints: | ||
| + | traefik.http.routers.gitea-insecure.middlewares: | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | traefik.http.routers.gitea.rule: | ||
| + | traefik.http.routers.gitea.entrypoints: | ||
| + | traefik.http.routers.gitea.tls.certresolver: | ||
| + | traefik.http.services.gitea.loadbalancer.server.port: | ||
| + | </ | ||
| + | |||
| + | ==== 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: | ||
| + | |||
| + | < | ||
| + | error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 Internal Server Error | ||
| + | </ | ||
| + | |||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Nebo pouze pro daný repozitář: | ||
| + | |||
| + | <code bash> | ||
| + | cd your_repo | ||
| + | git config http.postBuffer 157286400 | ||
| + | </ | ||
| + | |||
| + | Více informací o tomto nastavení naleznete na: | ||
| + | [[https:// | ||
| + | |||
| + | 2: Nastavil jsem `http.keepAlive`: | ||
| + | <code bash> | ||
| + | git config http.keepAlive true | ||
| + | </ | ||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | 3. V konfiguraci Traefiku jsem přidal část transport: | ||
| + | <code yaml> | ||
| + | entryPoints: | ||
| + | web: | ||
| + | address: ": | ||
| + | websecure: | ||
| + | address: ": | ||
| + | http: | ||
| + | tls: | ||
| + | certResolver: | ||
| + | options: maxtls12 | ||
| + | transport: | ||
| + | respondingTimeouts: | ||
| + | readTimeout: | ||
| + | </ | ||
| + | |||
| + | Zdroj informací: | ||
| + | [[https:// | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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`: | ||
| + | |||
| + | < | ||
| + | machine gitea.servername.cz | ||
| + | login muj_uzivatel_gitea | ||
| + | password sem_prijde_token | ||
| + | </ | ||
| + | |||
| + | 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: | ||
| + | |||
| + | 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: | ||
| + | ports: | ||
| + | - " | ||
| + | - " | ||
| + | extra_hosts: | ||
| + | - " | ||
| + | environment: | ||
| + | - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL} | ||
| + | - CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN} | ||
| + | - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - / | ||
| + | - ./ | ||
| + | - ./ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Přesměrování HTTP na HTTPS | ||
| + | traefik.http.routers.solar-insecure.rule: | ||
| + | traefik.http.routers.solar-insecure.entrypoints: | ||
| + | traefik.http.routers.solar-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.solar.rule: | ||
| + | traefik.http.routers.solar.entrypoints: | ||
| + | traefik.http.routers.solar.tls.certresolver: | ||
| + | traefik.http.routers.solar.service: | ||
| + | </ | ||
| + | |||
| + | ==== Dynamická konfigurace ==== | ||
| + | |||
| + | Do `docker-compose.yml` jsem musel přidat odkaz na dynamické nastavení: | ||
| + | <code yaml> | ||
| + | traefik.http.routers.solar.service: | ||
| + | </ | ||
| + | |||
| + | Soubor `traefik.yml` jsem upravil takto: | ||
| + | <code yaml> | ||
| + | providers: | ||
| + | docker: | ||
| + | exposedByDefault: | ||
| + | file: | ||
| + | directory: "/ | ||
| + | watch: true # Sleduje změny v souboru | ||
| + | </ | ||
| + | |||
| + | Ve složce `traefik-dynamic-config` se nachází soubor `dynamic-config.yml`: | ||
| + | <code yaml> | ||
| + | http: | ||
| + | services: | ||
| + | solar: | ||
| + | loadBalancer: | ||
| + | servers: | ||
| + | - url: " | ||
| + | </ | ||
| + | |||
| + | ==== Postup konfigurace ==== | ||
| + | |||
| + | 1. Musel jsem připravit dynamickou konfiguraci a přidat složku: | ||
| + | < | ||
| + | ./ | ||
| + | </ | ||
| + | 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`, | ||
| + | |||
| + | 4. Nasledováním rady z [[https:// | ||
| + | |||
| + | Dokud jsem nepřesunul nastavení do dynamického konfiguračního souboru, konfigurace nefungovala. | ||
| + | |||
| + | |||
| + | |||
| + | ===== Shrnutí | ||
| Řádek 512: | Řádek 1179: | ||
| * https:// | * https:// | ||
| + | |||
| + | |||
| + | 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: " | ||
| + | |||
| + | |||
| + | |||
| + | services: | ||
| + | |||
| + | |||
| + | proxy: | ||
| + | image: traefik | ||
| + | restart: always | ||
| + | container_name: | ||
| + | ports: | ||
| + | - " | ||
| + | - " | ||
| + | extra_hosts: | ||
| + | - " | ||
| + | environment: | ||
| + | - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL} | ||
| + | - CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN} | ||
| + | - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - / | ||
| + | - ./ | ||
| + | - ./ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.solar-insecure.rule: | ||
| + | traefik.http.routers.solar-insecure.entrypoints: | ||
| + | traefik.http.routers.solar-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.solar.rule: | ||
| + | traefik.http.routers.solar.entrypoints: | ||
| + | traefik.http.routers.solar.tls.certresolver: | ||
| + | traefik.http.routers.solar.service: | ||
| + | |||
| + | |||
| + | |||
| + | postgres: | ||
| + | container_name: | ||
| + | image: postgres:17 | ||
| + | restart: always | ||
| + | environment: | ||
| + | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} | ||
| + | - TZ=${DOCKER_TZ} | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | |||
| + | |||
| + | php-apache: | ||
| + | container_name: | ||
| + | image: php:apache | ||
| + | restart: always | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | | ||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.smarthome-insecure.rule: | ||
| + | traefik.http.routers.smarthome-insecure.entrypoints: | ||
| + | traefik.http.routers.smarthome-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.smarthome.rule: | ||
| + | traefik.http.routers.smarthome.entrypoints: | ||
| + | traefik.http.routers.smarthome.tls.certresolver: | ||
| + | traefik.http.services.smarthome.loadbalancer.server.port: | ||
| + | |||
| + | |||
| + | mosquitto: | ||
| + | container_name: | ||
| + | build: | ||
| + | context: ${IOT_STACK}/ | ||
| + | args: | ||
| + | - MOSQUITTO_BASE=eclipse-mosquitto: | ||
| + | restart: unless-stopped | ||
| + | environment: | ||
| + | - TZ=${DOCKER_TZ} | ||
| + | ports: | ||
| + | - " | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | |||
| + | influxdb: | ||
| + | container_name: | ||
| + | image: " | ||
| + | restart: unless-stopped | ||
| + | ports: | ||
| + | - " | ||
| + | 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}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | healthcheck: | ||
| + | test: [" | ||
| + | interval: 30s | ||
| + | timeout: 10s | ||
| + | retries: 3 | ||
| + | start_period: | ||
| + | |||
| + | |||
| + | nodered: | ||
| + | container_name: | ||
| + | build: | ||
| + | context: ${IOT_STACK}/ | ||
| + | args: | ||
| + | - DOCKERHUB_TAG=latest | ||
| + | - EXTRA_PACKAGES=ffmpeg | ||
| + | restart: unless-stopped | ||
| + | user: " | ||
| + | environment: | ||
| + | - TZ=${DOCKER_TZ} | ||
| + | volumes: | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | - / | ||
| + | - / | ||
| + | devices: | ||
| + | - "/ | ||
| + | - "/ | ||
| + | - "/ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Přesměrování HTTP na HTTPS | ||
| + | traefik.http.routers.nodered-insecure.rule: | ||
| + | traefik.http.routers.nodered-insecure.entrypoints: | ||
| + | traefik.http.routers.nodered-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS konfigurace | ||
| + | traefik.http.routers.nodered.rule: | ||
| + | traefik.http.routers.nodered.entrypoints: | ||
| + | traefik.http.routers.nodered.tls.certresolver: | ||
| + | traefik.http.services.nodered.loadbalancer.server.port: | ||
| + | |||
| + | grafana: | ||
| + | container_name: | ||
| + | image: grafana/ | ||
| + | restart: unless-stopped | ||
| + | user: " | ||
| + | environment: | ||
| + | - TZ=${DOCKER_TZ} | ||
| + | - GF_PATHS_DATA=/ | ||
| + | - GF_PATHS_LOGS=/ | ||
| + | - 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}/ | ||
| + | - ${VOLUME_PATH}/ | ||
| + | healthcheck: | ||
| + | test: [" | ||
| + | interval: 30s | ||
| + | timeout: 10s | ||
| + | retries: 3 | ||
| + | start_period: | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.grafana-insecure.rule: | ||
| + | traefik.http.routers.grafana-insecure.entrypoints: | ||
| + | traefik.http.routers.grafana-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.grafana.rule: | ||
| + | traefik.http.routers.grafana.entrypoints: | ||
| + | traefik.http.routers.grafana.tls.certresolver: | ||
| + | |||
| + | # Define service port | ||
| + | traefik.http.services.grafana.loadbalancer.server.port: | ||
| + | |||
| + | |||
| + | teslamate: | ||
| + | container_name: | ||
| + | image: teslamate/ | ||
| + | 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: | ||
| + | # - ./ | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Router pro HTTP přesměrování na HTTPS | ||
| + | traefik.http.routers.teslamate-insecure.rule: | ||
| + | traefik.http.routers.teslamate-insecure.entrypoints: | ||
| + | traefik.http.routers.teslamate-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování z HTTP na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | traefik.http.routers.teslamate-ws.rule: | ||
| + | traefik.http.routers.teslamate-ws.entrypoints: | ||
| + | traefik.http.routers.teslamate-ws.tls: | ||
| + | |||
| + | traefik.http.routers.teslamate.middlewares: | ||
| + | traefik.http.routers.teslamate.rule: | ||
| + | traefik.http.routers.teslamate.entrypoints: | ||
| + | traefik.http.routers.teslamate.tls.certresolver: | ||
| + | traefik.http.services.teslamate.loadbalancer.server.port: | ||
| + | |||
| + | |||
| + | traefik.http.middlewares.teslamate-auth.basicauth.realm: | ||
| + | traefik.http.middlewares.teslamate-auth.basicauth.usersfile: | ||
| + | |||
| + | cap_drop: | ||
| + | - all | ||
| + | |||
| + | |||
| + | grafana-teslamate: | ||
| + | container_name: | ||
| + | image: teslamate/ | ||
| + | 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:// | ||
| + | - GF_SERVER_SERVE_FROM_SUB_PATH=true | ||
| + | labels: | ||
| + | # aktivace Traefiku pro tento kontejner | ||
| + | traefik.enable: | ||
| + | |||
| + | # Router pro HTTP přesměrování na HTTPS | ||
| + | traefik.http.routers.grafana-teslamate-insecure.rule: | ||
| + | traefik.http.routers.grafana-teslamate-insecure.entrypoints: | ||
| + | traefik.http.routers.grafana-teslamate-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování z HTTP na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | traefik.http.routers.grafana-teslamate.rule: | ||
| + | traefik.http.routers.grafana-teslamate.entrypoints: | ||
| + | traefik.http.routers.grafana-teslamate.tls.certresolver: | ||
| + | traefik.http.services.grafana-teslamate.loadbalancer.server.port: | ||
| + | volumes: | ||
| + | - grafana-teslamate:/ | ||
| + | |||
| + | |||
| + | redis: | ||
| + | container_name: | ||
| + | image: redis: | ||
| + | restart: always | ||
| + | command: [" | ||
| + | volumes: | ||
| + | - redis-data:/ | ||
| + | |||
| + | |||
| + | nextcloud: | ||
| + | container_name: | ||
| + | image: nextcloud: | ||
| + | build: | ||
| + | context: ./ | ||
| + | restart: " | ||
| + | extra_hosts: | ||
| + | - " | ||
| + | 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:// | ||
| + | - REDIS_HOST=redis | ||
| + | - REDIS_HOST_PASSWORD=${REDIS_HOST_PASSWORD} | ||
| + | - PHP_MEMORY_LIMIT=1024M | ||
| + | volumes: | ||
| + | - ${NEXTCLOUD_VOLUME_PATH}:/ | ||
| + | - type: tmpfs | ||
| + | target: /tmp | ||
| + | tmpfs: | ||
| + | mode: " | ||
| + | labels: | ||
| + | traefik.enable: | ||
| + | |||
| + | # Redirect HTTP to HTTPS | ||
| + | traefik.http.routers.nextcloud-insecure.rule: | ||
| + | traefik.http.routers.nextcloud-insecure.entrypoints: | ||
| + | traefik.http.routers.nextcloud-insecure.middlewares: | ||
| + | |||
| + | # Middleware for HTTPS redirection | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # HTTPS router | ||
| + | traefik.http.routers.nextcloud.rule: | ||
| + | traefik.http.routers.nextcloud.entrypoints: | ||
| + | traefik.http.routers.nextcloud.tls.certresolver: | ||
| + | traefik.http.services.nextcloud.loadbalancer.server.port: | ||
| + | |||
| + | # Middleware for CalDAV/ | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.permanent: | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.regex: | ||
| + | traefik.http.middlewares.nextcloud_redirectregex.redirectregex.replacement: | ||
| + | |||
| + | # Add HSTS header | ||
| + | traefik.http.middlewares.nextcloud-hsts.headers.stsSeconds: | ||
| + | traefik.http.middlewares.nextcloud-hsts.headers.stsIncludeSubdomains: | ||
| + | traefik.http.middlewares.nextcloud-hsts.headers.stsPreload: | ||
| + | |||
| + | traefik.http.routers.nextcloud.middlewares: | ||
| + | |||
| + | depends_on: | ||
| + | - postgres | ||
| + | - redis | ||
| + | |||
| + | |||
| + | gitea: | ||
| + | image: gitea-arm32 | ||
| + | container_name: | ||
| + | restart: " | ||
| + | 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}:/ | ||
| + | - / | ||
| + | - / | ||
| + | #ports: | ||
| + | #- " | ||
| + | #- " | ||
| + | depends_on: | ||
| + | - postgres | ||
| + | labels: | ||
| + | # Aktivace Traefiku pro tuto službu | ||
| + | traefik.enable: | ||
| + | |||
| + | # Router pro HTTP přesměrování na HTTPS | ||
| + | traefik.http.routers.gitea-insecure.rule: | ||
| + | traefik.http.routers.gitea-insecure.entrypoints: | ||
| + | traefik.http.routers.gitea-insecure.middlewares: | ||
| + | |||
| + | # Middleware pro přesměrování na HTTPS | ||
| + | traefik.http.middlewares.redirect.redirectscheme.scheme: | ||
| + | |||
| + | # Router pro HTTPS připojení | ||
| + | traefik.http.routers.gitea.rule: | ||
| + | traefik.http.routers.gitea.entrypoints: | ||
| + | traefik.http.routers.gitea.tls.certresolver: | ||
| + | traefik.http.services.gitea.loadbalancer.server.port: | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | |||
| + | |||
| + | |||
| + | volumes: | ||
| + | grafana-teslamate: | ||
| + | redis-data: | ||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | Konfigurace **traefik.yml**: | ||
| + | |||
| + | <code yaml> | ||
| + | entryPoints: | ||
| + | web: | ||
| + | address: ": | ||
| + | websecure: | ||
| + | address: ": | ||
| + | http: | ||
| + | tls: | ||
| + | certResolver: | ||
| + | options: maxtls12 # Vynucení TLS 1.2 | ||
| + | transport: | ||
| + | respondingTimeouts: | ||
| + | readTimeout: | ||
| + | |||
| + | |||
| + | certificatesResolvers: | ||
| + | tmdnschallenge: | ||
| + | acme: | ||
| + | email: " | ||
| + | storage: "/ | ||
| + | dnsChallenge: | ||
| + | provider: cloudflare | ||
| + | delayBeforeCheck: | ||
| + | |||
| + | providers: | ||
| + | docker: | ||
| + | exposedByDefault: | ||
| + | file: | ||
| + | directory: "/ | ||
| + | watch: true # Sleduje změny v souboru | ||
| + | |||
| + | global: | ||
| + | sendAnonymousUsage: | ||
| + | |||
| + | tls: | ||
| + | options: | ||
| + | maxtls12: | ||
| + | minVersion: VersionTLS12 | ||
| + | maxVersion: VersionTLS12 | ||
| + | sniStrict: true # Zajištění přísného ověřování SNI | ||
| + | </ | ||
| + | |||
| + | |||
| + | Konfigurace **dynamic-config.yml**: | ||
| + | |||
| + | <code yaml> | ||
| + | http: | ||
| + | services: | ||
| + | solar: | ||
| + | loadBalancer: | ||
| + | servers: | ||
| + | - url: " | ||
| + | </ | ||
| + | |||