Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
77 lines
2.7 KiB
YAML
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
|