2.7 KiB
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
- Jdi na https://dash.cloudflare.com/profile/api-tokens
- Create Token → Use template "Edit zone DNS"
- Zone Resources → vybrat svou doménu
- Zkopíruj vygenerovaný token
2. Credentials soubor
cp cloudflare.ini.example cloudflare.ini
nano cloudflare.ini # vlož API token
chmod 600 cloudflare.ini
3. Získání certifikátu
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:
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čí:
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).
# 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):
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?
ENVIRONMENT=dev
TLS_ENABLED=true
TLS_AUTOGEN=true # server vygeneruje self-signed cert
TLS_INSECURE=true # klient přeskočí ověření