S60-CS
Email/finance processing pipeline — běží na Cortex serveru (mimo hub/prod-alfa).
| Owner | cs (agent) |
| Status | running |
| Repo | studio60-cz/s60-cs |
| Stack | Python + Docker |
| Catalog | catalog/services/s60cs.yaml |
Server: Cortex (Hetzner Cloud CPX22)
- Public IP: 178.104.15.77 → migrace na
49.12.235.44(Hetzner CX, Tailscale100.113.39.105,tag:cortexnew), 2026-08-23 - Tailscale IP: 100.120.98.59
URLs
- API:
http://100.120.98.59:8080(Tailscale only)
DB
| DB | User | Server | Port |
|---|---|---|---|
bwcs |
s60_cs_user (owner) |
cortex (přes pg-alfa public IP) | 6432 |
⚠️ Cortex používá public IP pg-alfa (46.224.173.7), ne Tailscale (Tailscale IPv4 routing broken — oba Hetzner IPv6).
Features
- Email processing pipeline
- Finance processing pipeline
- Gmail integrace
- Customer service automatizace
Komponenty
- API backend (Python)
- Frontend UI
- Database layer
Sentinel role
Sentinel nedeployuje s60-cs (běží na Cortexu, jiný agent). Sentinel jen monitoruje (HTTP check, server metrics agent).
Související
infra/server-ips.md— Cortex IP
Migrace cortex → cortex-new (2026-08-23)
| staré | nové | |
|---|---|---|
| veřejná IP | 178.104.15.77 (CPX) |
49.12.235.44 (Hetzner CX) |
| Tailscale | 100.120.98.59 |
100.113.39.105 |
| tag | tag:cortex |
tag:cortexnew |
Co bylo potřeba povolit (ověřeno vždy z cortex-new, ne z konfigurace):
| místo | kdo | pozn. |
|---|---|---|
| Tailscale ACL grant | Libor | ⚠️ tag se změnil → původní grant pro tag:cortex na nový stroj NEPLATIL |
| vypnutá expirace klíče | Libor | nový uzel ji měl zapnutou (server ji mít nemá) |
| dc-block whitelist | sentinel | 49.12.235.44 je Hetzner AS24940 = blokovaná feedem, nutný whitelist ve build-dcblock.py i build-dcblock-feeds.py (+ containment self-test) |
fail2ban ignoreip |
sentinel | jail.d/s60-antibot.conf — jediné místo, platí pro všech 5 jailů |
hub UFW 443 |
sentinel | prod UFW nic nepotřeboval |
pg_hba / UFW pg-alfa |
— | netřeba — už pouští 100.64.0.0/10, cortex-new leze přes Tailscale |
⚠️ Dvě pasti, na které se narazilo:
- Tag ≠ automatický přístup. Otagovaný uzel ztrácí
autogroup:member → *a je deny-by-default → potřebuje grant na každou závislost zvlášť. Grant nacortex-redisprošel, ale pg-alfa vdstchyběla (pg-alfa je user-owned, ne tagovaná, takže jitag:*vdstnepokryje). Příznak:tailscale pingprojde, TCP timeoutne. Viz [[feedback_tailscale_tag_drops_member_egress]]. - fail2ban měl starou IP ve všech 5 jailech, novou v žádném — včetně
s60-auth-bruteforce, na který CS naráží nejvíc (poll/api/auth/meà 10 s).
Ověření po migraci (z cortex-new):
curl -s -o /dev/null -w '%{http_code}' https://api.studio60.cz/api/health # 200
curl -s -o /dev/null -w '%{http_code}' https://ucto.studio60.cz/health # 200
nc -z 100.125.3.121 5432 && nc -z 100.78.87.88 6380 # obojí OK
Na pg_hba vrstvě ověřeno protokolovou sondou — PG odpoví žádostí o autentizaci,
tedy spojení přijal (TCP sám o sobě nestačí).
⏳ Stará IP zůstává ve dc-block whitelistu (2 skripty), fail2ban ignoreip,
hub UFW a pg_hba/UFW pg-alfy — záměrně, jako cesta zpátky. Uklidit až po
ověřeném provozu.