Files
Kecalek_python/certs

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

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í