xpeditis2.0/infra/prod/k8s/base/07-migration-job.yaml
2026-09-07 21:40:50 +02:00

77 lines
2.7 KiB
YAML

# =============================================================================
# Migrations de base de donnees -- Job execute AVANT chaque deploiement
# =============================================================================
# Pourquoi un Job separe alors que l'image lance deja les migrations au
# demarrage (scripts/setup/startup.js) :
#
# Avec 2 replicas, deux pods appellent runMigrations() simultanement. TypeORM
# ne serialise pas les migrations entre processus : l'un des deux echoue et
# part en CrashLoopBackOff. En passant par un Job (parallelisme 1) execute
# avant le `kubectl set image`, les migrations sont deja appliquees quand les
# pods demarrent : startup.js constate "no pending migrations" et laisse la
# main a l'application. Le comportement de l'image reste inchange, il devient
# simplement un filet de securite.
#
# Le nom du Job porte le tag de l'image : chaque deploiement cree son propre
# Job, ce qui laisse une trace consultable (kubectl get jobs).
# Le tag et le nom sont substitues par scripts/deploy.sh / cd-main.yml.
apiVersion: batch/v1
kind: Job
metadata:
name: xpeditis-migrate-__IMAGE_TAG__
namespace: xpeditis-prod
labels:
app.kubernetes.io/name: xpeditis-migrate
app.kubernetes.io/part-of: xpeditis
spec:
# Les Jobs termines s'effacent au bout d'une heure : pas d'accumulation.
ttlSecondsAfterFinished: 3600
backoffLimit: 2
activeDeadlineSeconds: 900
parallelism: 1
completions: 1
template:
metadata:
labels:
app.kubernetes.io/name: xpeditis-migrate
spec:
restartPolicy: Never
imagePullSecrets:
- name: regcred
securityContext:
runAsNonRoot: true
runAsUser: 1001
runAsGroup: 1001
seccompProfile:
type: RuntimeDefault
containers:
- name: migrate
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:__IMAGE_TAG__
imagePullPolicy: IfNotPresent
# CLI TypeORM sur la source de donnees compilee. Elle honore
# DATABASE_SSL, contrairement au client de secours de startup.js.
command:
- node
- ./node_modules/typeorm/cli.js
- migration:run
- -d
- dist/infrastructure/persistence/typeorm/data-source.js
envFrom:
- configMapRef:
name: xpeditis-backend-config
- secretRef:
name: xpeditis-backend-secrets
resources:
requests:
cpu: 200m
memory: 384Mi
limits:
cpu: 1000m
memory: 1Gi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
readOnlyRootFilesystem: false