# ============================================================================= # 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. API, CLI et startup # partagent DATABASE_SSL et DATABASE_SSL_CA avec verification TLS. 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: true volumeMounts: - name: tmp mountPath: /tmp volumes: - name: tmp emptyDir: sizeLimit: 128Mi