migrate-job.yaml 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # Exactly-once schema migration Job (task 46).
  2. #
  3. # Run BEFORE the Deployment rolls (CI applies the Job, waits for completion,
  4. # then rolls the Deployment). `migrate` applies forward-only sqlx migrations
  5. # under Postgres advisory lock, so concurrent starts serialize and the schema
  6. # is applied exactly once — replicas MUST NOT migrate (they share one
  7. # database; per-replica migration races and double-applies). The Deployment's
  8. # readiness gate (`_sqlx_migrations` version match) keeps new replicas out of
  9. # traffic until this Job succeeds.
  10. apiVersion: batch/v1
  11. kind: Job
  12. metadata:
  13. name: d-oauth-migrate
  14. namespace: d-oauth
  15. labels:
  16. app.kubernetes.io/name: d-oauth-server
  17. app.kubernetes.io/part-of: d-oauth
  18. spec:
  19. backoffLimit: 3
  20. activeDeadlineSeconds: 300
  21. ttlSecondsAfterFinished: 3600
  22. template:
  23. metadata:
  24. labels:
  25. app.kubernetes.io/name: d-oauth-server
  26. app.kubernetes.io/part-of: d-oauth
  27. app.kubernetes.io/component: migrate
  28. spec:
  29. restartPolicy: Never
  30. securityContext:
  31. runAsNonRoot: true
  32. runAsUser: 65532
  33. runAsGroup: 65532
  34. seccompProfile:
  35. type: RuntimeDefault
  36. containers:
  37. - name: migrate
  38. # Same pinning rule as the Deployment: CI resolves to a digest.
  39. image: ghcr.io/d-oauth/d-oauth-server:latest
  40. imagePullPolicy: IfNotPresent
  41. # Overrides the image ENTRYPOINT (["/d-oauth-server","serve"]).
  42. command: ["/d-oauth-server", "migrate"]
  43. envFrom:
  44. - configMapRef:
  45. name: d-oauth-config
  46. env:
  47. - name: D_OAUTH_DATABASE__URL
  48. valueFrom:
  49. secretKeyRef:
  50. name: d-oauth-secrets
  51. key: database-url
  52. - name: D_OAUTH_REDIS__URL
  53. valueFrom:
  54. secretKeyRef:
  55. name: d-oauth-secrets
  56. key: redis-url
  57. - name: D_OAUTH_TOKEN_PEPPER
  58. valueFrom:
  59. secretKeyRef:
  60. name: d-oauth-secrets
  61. key: token-pepper
  62. - name: D_OAUTH_TOTP_ENCRYPTION_KEY
  63. valueFrom:
  64. secretKeyRef:
  65. name: d-oauth-secrets
  66. key: totp-encryption-key
  67. resources:
  68. requests:
  69. cpu: 50m
  70. memory: 64Mi
  71. limits:
  72. cpu: 500m
  73. memory: 256Mi
  74. securityContext:
  75. allowPrivilegeEscalation: false
  76. readOnlyRootFilesystem: true
  77. capabilities:
  78. drop:
  79. - ALL
  80. volumeMounts:
  81. - name: certs
  82. mountPath: /certs
  83. readOnly: true
  84. volumes:
  85. - name: certs
  86. secret:
  87. secretName: d-oauth-tls
  88. defaultMode: 0o400