Skip to content

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, Tailscale 100.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í

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:

  1. 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 na cortex-redis prošel, ale pg-alfa v dst chyběla (pg-alfa je user-owned, ne tagovaná, takže ji tag:* v dst nepokryje). Příznak: tailscale ping projde, TCP timeoutne. Viz [[feedback_tailscale_tag_drops_member_egress]].
  2. 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.