# 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 # Caller controls and terminal invitation retry fix, source c9756b0; approved image-only rollout. image: forgejo.coulomb.social/coulomb/email-connect@sha256:eb3e7b68d21209e9eb71b928a5b0bc987e8e3164f21dca4ff712f946d0c103f2 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: {}