# 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í
```
