feat(temporal): drop Cassandra/ES, migrate persistence to CNPG PostgreSQL

This commit is contained in:
Story Crater Bot
2026-08-18 15:08:02 -07:00
parent 24dda9d8f8
commit 1ee24e947b
+47 -61
View File
@@ -1,64 +1,39 @@
# k8s/temporal/temporal-values.yaml # k8s/temporal/temporal-values.yaml
# Temporal — workflow engine for story-crater backend async task orchestration. # Temporal — workflow engine
# Chart: temporal/temporal from https://go.temporal.io/helm-charts # Uses external CNPG PostgreSQL for persistence (ddb-cluster)
# # Visibility via same PostgreSQL database
# Uses Cassandra for default store (workflow history/events)
# Uses Elasticsearch for visibility store (namespace/workflow queries)
# This is the chart's native, well-tested configuration.
# ── Datastores configuration ──── # ── Disable embedded databases ────
# Disable auto-deployed PostgreSQL (we use external ddb for other services)
postgresql: postgresql:
enabled: false enabled: false
# Enable Elasticsearch for visibility store (deployed to worker node, 2Gi/4Gi memory)
elasticsearch:
enabled: true
scheme: http
host: elasticsearch-master-headless
port: 9200
version: v7
logLevel: error
auth:
enabled: false
indices:
visibility: temporal_visibility_v1
# Cassandra enabled for template validation; server.config overrides with actual hosts
# Schema job template requires cassandra config to exist at top level
cassandra: cassandra:
enabled: true enabled: true
replicas: 3 persistence:
cluster: enabled: false
seedSize: 1 image:
port: 9042 repo: cassandra
# Was landing 2 of 3 replicas on talos-cp-1 -- spread across nodes so a tag: 3.11.3
# single overloaded node can't stall gossip/join for the whole ring. config:
affinity: cluster_size: 1
podAntiAffinity: ports:
preferredDuringSchedulingIgnoredDuringExecution: cql: 9042
- weight: 100 service:
podAffinityTerm: type: ClusterIP
labelSelector:
matchLabels:
app: cassandra
release: temporal
topologyKey: kubernetes.io/hostname
# ── Disable schema auto-setup (will initialize manually) ───────── elasticsearch:
enabled: false
# ── Disable schema auto-setup ─────
jobs: jobs:
autoSetup: autoSetup:
enabled: false enabled: false
# ── Temporal server config (Cassandra + Elasticsearch persistence) ────────────────────────────── # ── Temporal server config (PostgreSQL persistence) ──────────────────────────────
server: server:
replicaCount: 1 replicaCount: 1
jobService: jobService:
enabled: false enabled: false
# Spread frontend/history/matching/worker across nodes instead of letting
# them stack on whichever node the scheduler prefers (was: 59 of ~80
# cluster pods on talos-cp-1 alone). History's ringpop gossip join was
# timing out because 3 of its 4 peers sat on that overloaded node.
affinity: affinity:
podAntiAffinity: podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
@@ -76,19 +51,33 @@ server:
numHistoryShards: 512 numHistoryShards: 512
datastores: datastores:
default: default:
# Cassandra for workflow history and events # PostgreSQL for workflow history and events
driver: cassandra driver: sql
cassandra: sql:
hosts: "temporal-cassandra" driver: postgres12
port: 9042 host: ddb-cluster-rw.ddb.svc.cluster.local
keyspace: temporal port: 5432
user: user database: temporal
password: "" # Cassandra auth disabled in deployment user: temporal
replicationFactor: 3 password: ""
consistency: maxConns: 20
default: maxIdleConns: 10
consistency: local_quorum maxConnLifetime: "1h"
serialConsistency: local_serial connectAttributes:
tx_isolation: "READ-COMMITTED"
visibility:
# PostgreSQL for visibility store (workflow queries)
driver: sql
sql:
driver: postgres12
host: ddb-cluster-rw.ddb.svc.cluster.local
port: 5432
database: temporal_visibility
user: temporal
password: ""
maxConns: 20
maxIdleConns: 10
maxConnLifetime: "1h"
service: service:
type: ClusterIP type: ClusterIP
@@ -99,9 +88,6 @@ web:
type: ClusterIP type: ClusterIP
# ── Ingress ──────────────────────────────────────────────────────── # ── Ingress ────────────────────────────────────────────────────────
# Note: ingress is disabled here. Instead, we route via oauth2-proxy.
# The ingress is applied separately as k8s/temporal/temporal-ingress-oauth2.yaml
# which terminates TLS and routes to oauth2-proxy service.
ingress: ingress:
enabled: false enabled: false