Spec popisuje operativní rovinu workeru v produkci: deployment topologie, lifecycle, observabilita, secrets, resource limits, image build, runbook položky. Nepokrývá doménové business rules ani Anthropic SDK kontrakt — to je v worker-runtime.md.
1. Deployment topologie
1.1 K8s topologie (LIVE)
flowchart TB
subgraph CP[ns 'talkide-prod' — control-plane]
BE[talkide-be Deployment<br/>2 repliky alpha]
FE[talkide-fe Deployment<br/>2 repliky alpha]
GW[Gateway-proxy<br/>součást BE]
end
subgraph T1[ns 'mirek-dev' — tenant-env 1]
W1[talkide-worker Deployment<br/>1 replika]
S1[talkide-worker-token<br/>identity-token]
N1[PVC claude-sessions<br/>NFS RWM]
end
subgraph T2[ns 'popelkam-dev']
W2[talkide-worker Deployment<br/>1 replika]
S2[secret]
N2[PVC]
end
subgraph T3[ns 'h-talkide']
W3[talkide-worker Deployment<br/>1 replika]
S3[secret]
N3[PVC]
end
BE -.->|HTTP+SSE<br/>HMAC| W1
BE -.->|HTTP+SSE<br/>HMAC| W2
BE -.->|HTTP+SSE<br/>HMAC| W3
Aktuální stav (2026-05-23):
| Namespace | Worker pod | Image tag | NFS PVC |
|---|---|---|---|
mirek-dev | talkide-worker-7dbb55c8b9-k6phs | 4401f3a8977e802d664a48e95352684eb81b7119 | claude-sessions |
popelkam-dev | talkide-worker-74f76cd869-9zl8x | 4401f3a8... | claude-sessions |
h-talkide | talkide-worker-85db4f5676-spvm6 | 4401f3a8... | claude-sessions |
Jeden worker pod = jedna replika = stateful (drží live SDK runtime). Multi-replica per ns je v současné alpha out-of-scope (viz § 4.2).
1.2 Service discovery
Control-plane BE volá worker přes K8s DNS:
talkide-worker.{tenant}-{env}.svc.cluster.local:8090
K8sWorkerProvisioner v BE drží mapping (tenantId, envId) → worker Service URL.
Provisioning workeru = K8sWorkerProvisioner.buildWorkerDeployment (#275 LESSON — Recreate
strategy v CREATE cestě, patch cesta strategii nepřepisuje, viz CLAUDE.md “Pozn. #275”).
1.3 Image registry
registry.digitalocean.com/talkide/talkide-worker:<git-sha>. DO Container Registry Professional
plan (od #195 zrušen 5-repo limit). Image build pipeline: GitLab CI v talkide/talkide-worker
(manual trigger, viz CLAUDE.md “CI/CD — manual cost gate”).
2. Lifecycle
2.1 Worker pod provisioning
Trigger: prvni Mara turn v tenant-environment, nebo explicitní EnvironmentService.ensureNamespace
volání (ADR-026 lazy get-or-create).
Kroky (K8sWorkerProvisioner):
- Ensure namespace
{tenant}-{env}existuje (ADR-015 namespace provisioner). - Ensure K8s Secret
talkide-worker-token(klíčidentity-token+TALKIDE_GATEWAY_BASE_URL). - Ensure PVC
claude-sessions(NFS RWM, sdílený přes všechny workery v ns). - Ensure ServiceAccount + RoleBinding (scope:
batch.JobCREATE/GET/WATCH/DELETE — pro budoucí gradle Job dispatch, § 7.1 v worker-runtime). - Apply worker Deployment + Service (port 8090).
- Wait for readiness probe.
Idempotence: všechny kroky jsou idempotentní — opakované volání nepoškodí existující resources.
2.2 Worker image upgrade
Helm talkide-platform chart obsahuje per-tenant-env worker manifest. Image bump = helm upgrade talkide ... → rolling restart workerů.
Důsledek pro Mara sessions: SDK resume(conversationId) z NFS state. Krátká SSE
re-connection window (≈ 5–10 s) v BE → user vidí re-connect indicator. 3-week resume
neprerušuje BE redeploy (viz worker-runtime § 5).
2.3 Tenant deprovision
OPEN (be#120 medium). Současné chování: namespace + NFS PVC zůstávají po smazání posledního projektu uživatele. Implementace fáze post-alpha.
3. Resource limits
3.1 Worker pod
| Resource | Request | Limit | Důvod |
|---|---|---|---|
| CPU | 250m | 1000m | Worker je I/O bound (čeká na Anthropic streaming), CPU spike při tool dispatch |
| Memory | 256 Mi | 512 Mi | Node 22 baseline ~60 MB + Anthropic SDK ~50 MB + active session ~50 MB × N |
| Ephemeral storage | 100 Mi | 500 Mi | tmp soubory, log buffering |
NFS PVC claude-sessions velikost: 5 Gi v alfa (sdíleno přes všechny workery v ns). Session
state ≈ 1–5 MB per konverzace × tisíce konverzací → roste s tenantem; monitoring přes du -sh
v worker pod startup hook.
3.2 K8s nodes
Worker pody žijí na DO node poolu talkide-prod-pool-1 (s-4vcpu-8gb). s-2vcpu-4gb jsou
nedostatečné — BE baseline 1.2 GB + worker × N + Kaniko Joby by node OOM-killed (incident
ověřený u BE podu, viz CLAUDE.md “DigitalOcean infra reference”).
3.3 ResourceQuota per ns (plánováno post-alpha)
ADR-024 § Decision 5: ResourceQuota per {tenant}-{env} ns klíčované plánem uživatele.
Plan tier → ResourceQuota (CPU/memory ceiling) + LimitRange (per-pod default). V alfa
fázi (1–3 tenanti) ResourceQuota nenastavena — fair-use enforcement leží na FUP / UserBudget
(UC-08001).
4. Observability
4.1 Health probes
| Probe | Endpoint | Sémantika |
|---|---|---|
| Liveness | GET /healthz | Worker HTTP server reaguje (Node event loop žije) |
| Readiness | GET /healthz?ready=1 | Worker uměje přijmout POST /sessions (NFS mount OK, gateway endpoint reachable) |
Konkrétní implementace v talkide-worker/src/server/httpServer.ts.
4.2 Logging
- stdout = strukturovaný JSON log (level, timestamp, conversationId, message). Container log collector zachytává a posílá do platform log aggregátoru (DO LogStream → BetterStack nebo ekvivalent).
- stderr = uncaught exceptions, fatal startup errors.
- Žádný NDJSON kontroles protokol mimo SSE response k
GET /sessions/{id}/stream.
⚠️ Dočasný debug (CLAUDE.md): BE LOGGING_LEVEL_COM_MDDSUMMER_TALKIDE=DEBUG po dokončení
cutoveru C9 vrátit na INFO. Worker DEBUG flag pro Harness.ts v K8s env LOG_LEVEL=debug.
4.3 Metrics
Worker exponuje Prometheus metrics na :9091/metrics (TBD — open task; v alfa zatím
neimplementováno, viz § 6.4). Minimální plán:
worker_active_sessions{tenant_env}gaugeworker_session_duration_seconds{outcome}histogramworker_tool_use_total{tool_name}counterworker_gateway_call_duration_seconds{result}histogram
4.4 Tracing
W3C traceparent propagace: BE generuje trace context, posílá v HTTP hlavičce na worker.
Worker propaguje do gateway-proxy callu zpět na BE → koherentní trace přes celý turn.
Anthropic SDK custom HTTP headers — TBD (otevřená otázka).
5. Secrets management
5.1 ANTHROPIC_API_KEY
Žije VÝHRADNĚ v control-plane BE pod, K8s Secret talkide-anthropic-creds v ns talkide-prod.
Worker pod ho NIKDY nedostává — to je core invariant ADR-024 (gateway-proxy pattern).
Rotace: kvartální (90 dní). Při podezření na leak okamžitá rotace = K8s Secret update + BE rolling restart. Worker rotace netýká.
5.2 Identity token (talkide-be#245)
Per {tenant}-{env} K8s Secret talkide-worker-token:
| Klíč | Hodnota | Poznámka |
|---|---|---|
identity-token | TalkideWorker cid=0;exp=<epoch>;sig=<hmac> | Long-lived HMAC token mintnutý K8sWorkerProvisioner v control-plane |
TALKIDE_GATEWAY_BASE_URL | https://api.talkide.app | Base URL control-plane; worker ho používá pro mint endpoint i pro issue reporting |
Identity-token mechanismus:
identity-tokenje long-lived HMAC token sscope = IDENTITY_SCOPE_CID(TTL 90 dní, nikoli 120 s). NamístoconversationIdvcidnese speciální identity scope — tím BE pozná, že jde o identitní volání, ne o per-request gateway request.- Worker ho drží trvale v env
TALKIDE_WORKER_IDENTITY_TOKEN(načteno ze secretu při startu podu). - Před každým Mara turn worker volá control-plane mint endpoint (
/api/v1/worker-gateway/token/mint) autentizovaný pomocí identity-token → BE mintne čerstvý short-livedWorkerToken(TTL 120 s,scope = conversationId). Tento krátkodobý token se předá doLocalGatewayProxyServer, který ho připojuje k per-request gateway callu. - Worker nikdy nevolá
new Anthropic({ authToken: ... })přímo s gateway URL — viz § 5.2 proxy architektura v worker-runtime.md. - Token je per-pod stabilní; rotace = update secret + restart workeru (viz worker-runtime § 7.5).
5.3 K8s ServiceAccount RBAC
Worker SA v {tenant}-{env} ns má:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "get", "watch", "delete", "list"]
Striktně Role + RoleBinding v ns — NIKDY ClusterRole. Verifikace v deploy review.
6. Roadmap & open items
| Fáze | Co | Stav |
|---|---|---|
| 1 — Cutover (be#129) | Worker pod LIVE v 3 tenant-env ns, BE network executor default, sidecar smazán | DONE 2026-05-22 |
| 2 — be#143 Activity panel | recordToolUse na network-worker cestě (tool-call detail v UI) | DONE 2026-05-23 (deploy helm rev 62) |
| 3 — Gradle Job dispatch | GradleJobBuilder analogický KanikoJobBuilder; RBAC scope; NFS cache PVC | Open (priority post-alpha, infra#21) |
| 4 — ResourceQuota per ns | Plan-based vertical sizing (free / starter / pro tiers) | Open |
| 5 — Worker metrics | Prometheus /metrics + scrape z platform Prometheus | Open |
| 6 — Worker token rotation | Dva souběžné tokeny + grace window | Post-alpha |
| 7 — Tenant deprovision | Cleanup ns + NFS PVC (be#120) | Open medium |
7. Runbook
7.1 Worker pod zaseknutý / unresponsive
Příznak: BE SSE k workeru timeoutuje, žádné assistant_chunk eventy. Mara v UI “spinning”.
Diagnóza:
kubectl get pods -n {tenant}-{env}
kubectl logs -n {tenant}-{env} talkide-worker-<hash> --tail 200
kubectl exec -n {tenant}-{env} talkide-worker-<hash> -- ls /data/claude/projects
Akce:
- Identifikuj zaseknutý SSE call:
Harness.tslog →query()timeout? Anthropic 5xx? - Restart worker pod:
kubectl delete pod -n {tenant}-{env} talkide-worker-<hash>→ SDKresume()pickne session z NFS. - Pokud problém přetrvává: zkontroluj NFS PVC mount status, NFS server health.
Souvisí s open issue be#117 (Mara zaseknutá když Theo padne — commit 655c233 NEdeployed).
7.2 NFS volume full
Worker pod CrashLoopBackOff s ENOSPC při query() startu. NFS PVC plný.
Akce:
du -sh /data/claude/projects/*ve worker pod → identifikuj nejstarší / largest session directories.- Cleanup uzavřených konverzací: TBD admin endpoint v BE — interim manual
rm -rfpřeskubectl exec. - Resize PVC (infra#12 backup strategy je open).
7.3 Worker → gateway 401
Worker HMAC token nevalidní. Příznak: každý turn padá s 429/401 z gateway-proxy.
Akce:
kubectl get secret -n {tenant}-{env} talkide-worker-token -o jsonpath='{.data.identity-token}' | base64 -d- Ověř, že token začíná
TalkideWorker cid=0;exp=a není prošlý (epoch vexp=). - Re-issue token přes admin endpoint nebo
K8sWorkerProvisionershell (re-mint identity token).
8. Vztah k jiným ADR a specifikacím
| Reference | Vztah |
|---|---|
| worker-runtime.md | Design spec workeru — co worker dělá a proč |
| ADR-024 | Architektonické rozhodnutí o extrakci |
| ADR-023 | Namespace-per-tenant-env substrát |
| ADR-026 | Environment lifecycle |
| hosting-architecture.md | User-app runtime (jiný workload — neplést s talkide-worker) |
9. Co bylo a už není
Thanks for the feedback.