# email-connect transactional receiver — railiance01 (EMAIL-WP-0004-T03). # # Conventions match audit-core / user-engine: digest-pinned image from # forgejo.coulomb.social, non-root, read-only root, probes on named http port. --- apiVersion: apps/v1 kind: Deployment metadata: name: email-connect namespace: email-connect labels: app.kubernetes.io/name: email-connect app.kubernetes.io/part-of: email-connect annotations: email-connect.railiance.io/rollback-note: >- SQLite schema is additive. Preserve deliveries and send_attempts. Stop delivery and reconcile any in_flight reservations before reverting to a pre-P05 image, which cannot enforce uncertain-outcome reservations. spec: replicas: 1 revisionHistoryLimit: 5 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 1 selector: matchLabels: app.kubernetes.io/name: email-connect template: metadata: labels: app.kubernetes.io/name: email-connect app.kubernetes.io/part-of: email-connect spec: serviceAccountName: email-connect securityContext: runAsNonRoot: true fsGroup: 10001 seccompProfile: type: RuntimeDefault terminationGracePeriodSeconds: 15 containers: - name: email-connect # P05 durable send reservations and non-sending SMTP diagnostics, 2026-09-13. image: forgejo.coulomb.social/coulomb/email-connect@sha256:e095d7e51c68a29ff6b82d735c734d5d27e0041b937dc958ecee5bcb5ddf5e8b imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 envFrom: - configMapRef: name: email-connect-config - secretRef: name: email-connect-runtime optional: false resources: requests: cpu: 25m memory: 64Mi limits: cpu: 250m memory: 256Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 10001 runAsGroup: 10001 volumeMounts: - name: data mountPath: /data - name: tmp mountPath: /tmp startupProbe: httpGet: {path: /healthz, port: http} periodSeconds: 3 failureThreshold: 20 readinessProbe: httpGet: {path: /readyz, port: http} periodSeconds: 10 timeoutSeconds: 2 failureThreshold: 3 livenessProbe: httpGet: {path: /healthz, port: http} periodSeconds: 20 timeoutSeconds: 2 failureThreshold: 3 volumes: - name: data persistentVolumeClaim: claimName: email-connect-data - name: tmp emptyDir: {}