# k8s/deployment.yaml # ============================================ # Chat Switchboard - Kubernetes Deployment Template # ============================================ # Variables substituted by CI/CD via envsubst: # DEPLOY_NAME, ENVIRONMENT, IMAGE_TAG, BASE_PATH, # DB_NAME, REPLICAS, NAMESPACE, REGISTRY, IMAGE_NAME, # DOMAIN, CERT_ISSUER, POSTGRES_HOST, POSTGRES_PORT, # MEMORY_REQUEST, MEMORY_LIMIT, CPU_REQUEST, CPU_LIMIT # ============================================ apiVersion: apps/v1 kind: Deployment metadata: name: ${DEPLOY_NAME} namespace: ${NAMESPACE} labels: app: chat-switchboard env: ${ENVIRONMENT} service: chat-switchboard spec: replicas: ${REPLICAS} selector: matchLabels: app: chat-switchboard env: ${ENVIRONMENT} template: metadata: labels: app: chat-switchboard env: ${ENVIRONMENT} service: chat-switchboard spec: containers: - name: switchboard image: ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} imagePullPolicy: Always ports: - containerPort: 80 name: http env: - name: ENVIRONMENT value: "${ENVIRONMENT}" - name: BASE_PATH value: "${BASE_PATH}" - name: PORT value: "8080" # ── Database connection ── - name: POSTGRES_HOST value: "${POSTGRES_HOST}" - name: POSTGRES_PORT value: "${POSTGRES_PORT}" - name: POSTGRES_DB value: "${DB_NAME}" - name: POSTGRES_USER valueFrom: secretKeyRef: name: switchboard-db-credentials key: POSTGRES_USER - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: switchboard-db-credentials key: POSTGRES_PASSWORD - name: DATABASE_URL value: "postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@${POSTGRES_HOST}:${POSTGRES_PORT}/${DB_NAME}?sslmode=disable" resources: requests: memory: "${MEMORY_REQUEST}" cpu: "${CPU_REQUEST}" limits: memory: "${MEMORY_LIMIT}" cpu: "${CPU_LIMIT}" livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 10 periodSeconds: 30 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 --- apiVersion: v1 kind: Service metadata: name: ${DEPLOY_NAME} namespace: ${NAMESPACE} labels: app: chat-switchboard env: ${ENVIRONMENT} spec: selector: app: chat-switchboard env: ${ENVIRONMENT} ports: - protocol: TCP port: 80 targetPort: 80 name: http --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ${DEPLOY_NAME} namespace: ${NAMESPACE} annotations: cert-manager.io/cluster-issuer: "${CERT_ISSUER}" traefik.ingress.kubernetes.io/router.entrypoints: websecure labels: app: chat-switchboard env: ${ENVIRONMENT} spec: ingressClassName: "traefik" tls: - hosts: - ${DOMAIN} secretName: chat-switchboard-tls rules: - host: "${DOMAIN}" http: paths: - path: ${BASE_PATH} pathType: Prefix backend: service: name: ${DEPLOY_NAME} port: number: 80