# Kubernetes Deployment Example The following manifest shows the essential pieces needed to run `caatsm` on Kubernetes with native config management and probes. ## 1. ConfigMap and Secret ```yaml apiVersion: v1 kind: ConfigMap metadata: name: caatsm-config data: config.toml: | # trimmed for brevity; see configs/config.prod.toml [nats] url = "nats://nats.jetstream.svc:4222" stream = "TELEGRAM" consumer = "telegram-consumer" [postgres] # default overridden by CAATSM_POSTGRES_URL in env url = "postgres://caatsm:password@timescale.svc:5432/aviation?sslmode=disable" [monitoring] addr = ":2112" enable_metrics = true enable_health = true --- apiVersion: v1 kind: Secret metadata: name: caatsm-secrets type: Opaque stringData: CAATSM_POSTGRES_URL: postgres://caatsm:super-secret@timescale.svc:5432/aviation?sslmode=disable ``` ## 2. Deployment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: caatsm spec: replicas: 1 selector: matchLabels: app: caatsm template: metadata: labels: app: caatsm spec: containers: - name: caatsm image: ghcr.io//caatsm:latest args: ["listen", "--config", "/etc/caatsm/config.toml"] envFrom: - secretRef: name: caatsm-secrets env: - name: GO_ENV value: prod ports: - name: monitoring containerPort: 2112 volumeMounts: - name: config mountPath: /etc/caatsm livenessProbe: httpGet: path: /healthz port: monitoring initialDelaySeconds: 10 periodSeconds: 15 readinessProbe: httpGet: path: /healthz port: monitoring initialDelaySeconds: 5 periodSeconds: 15 volumes: - name: config configMap: name: caatsm-config ``` ## 3. Service and Scraping ```yaml apiVersion: v1 kind: Service metadata: name: caatsm-metrics labels: app: caatsm spec: selector: app: caatsm ports: - name: http port: 2112 targetPort: monitoring protocol: TCP ``` Point Prometheus at the service above (or annotate it if you use `prometheus-operator`). The `/healthz` probe doubles as a readiness check and quickly surfaces upstream connectivity issues.