# TLS Setup — Let's Encrypt + Cloudflare DNS TLS certifikát přes Let's Encrypt bez nutnosti otevírat port 80. Ověření domény probíhá přes DNS TXT záznam (Cloudflare API). ## Předpoklady - Doména s DNS na Cloudflare (free tier stačí) - Cloudflare API token s oprávněním "Edit zone DNS" - Root přístup na serveru (certbot potřebuje `/etc/letsencrypt/`) ## Postup ### 1. Cloudflare API token 1. Jdi na https://dash.cloudflare.com/profile/api-tokens 2. **Create Token** → Use template **"Edit zone DNS"** 3. Zone Resources → vybrat svou doménu 4. Zkopíruj vygenerovaný token ### 2. Credentials soubor ```bash cp cloudflare.ini.example cloudflare.ini nano cloudflare.ini # vlož API token chmod 600 cloudflare.ini ``` ### 3. Získání certifikátu ```bash sudo ./setup-tls.sh chat.example.com ``` Skript nainstaluje certbot + Cloudflare plugin, získá certifikát a vytvoří symlinky v tomto adresáři. ### 4. Konfigurace serveru Přidej do `.env` v kořenovém adresáři projektu: ```env TLS_ENABLED=true TLS_CERT_FILE=/etc/letsencrypt/live/chat.example.com/fullchain.pem TLS_KEY_FILE=/etc/letsencrypt/live/chat.example.com/privkey.pem ``` ### 5. Konfigurace klienta Na klientovi stačí: ```env TLS_ENABLED=true ``` Let's Encrypt je v systémovém trust store — klient ověří certifikát automaticky. ## Obnova certifikátu Certbot obnovuje certifikát automaticky přes systemd timer (každých ~60 dní, cert platí 90). ```bash # Ověřit že timer běží systemctl status certbot.timer # Ruční obnova (test) sudo certbot renew --dry-run ``` Po úspěšné obnově se spustí `reload-server.sh` (deploy hook) — restartuje chat server aby načetl nový certifikát. ## Soubory | Soubor | Účel | |--------|------| | `setup-tls.sh` | Instalace certbot + získání certifikátu | | `reload-server.sh` | Deploy hook — restartuje server po renew | | `cloudflare.ini.example` | Šablona pro Cloudflare API token | | `cloudflare.ini` | Tvůj API token (gitignored) | ## FAQ **Funguje certifikát na nestandardním portu (např. 9999)?** Ano. Certifikát je vázaný na doménu, ne na port. `chat.example.com:9999` funguje. **Musím otevírat port 80?** Ne. DNS challenge ověřuje doménu přes DNS TXT záznam, žádný HTTP požadavek na server. **Co když nemám Cloudflare?** Můžeš použít ruční DNS challenge (bez automatického renew): ```bash sudo certbot certonly --manual --preferred-challenges dns -d chat.example.com ``` Certbot ti řekne jaký TXT záznam přidat. Při renew to musíš opakovat ručně. **Dev/testování bez certifikátu?** ```env ENVIRONMENT=dev TLS_ENABLED=true TLS_AUTOGEN=true # server vygeneruje self-signed cert TLS_INSECURE=true # klient přeskočí ověření ```