# 1 seul replica tant que les médias sont sur des volumes ReadWriteOnce # (persistence.* ci-dessous) ; passer à S3 avant d'en mettre plus. replicaCount: 1 image: repository: vitrine-backend tag: latest pullPolicy: IfNotPresent # Injecté par qui déploie (voir deploy/chart-gestion/registry-credentials # dans omnex/deploy pour le modèle) si un compte registry authentifié est # configuré — évite le rate-limit de pull anonyme partagé par IP de nœud. # Vide = pull anonyme (défaut). imagePullSecrets: [] service: type: ClusterIP port: 8080 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mi autoscaling: enabled: false minReplicas: 2 maxReplicas: 5 targetCPUUtilizationPercentage: 70 # Deux volumes distincts : uploads (médias publics, servis via /uploads) et # verification (pièces d'identité clients, jamais servies publiquement -- # voir backend/internal/modules/customerverification). Seulement pertinent # pour media.storageDriver=local ci-dessous ; avec S3 les deux sont désactivables. persistence: uploads: enabled: true size: 5Gi storageClass: "longhorn-replicated" accessMode: ReadWriteOnce verification: enabled: true size: 2Gi storageClass: "longhorn-replicated" accessMode: ReadWriteOnce # Postgres/Redis de CE namespace (voir ../postgresql, ../redis) -- host par # défaut = le nom de Service que ces charts produisent avec leur # fullnameOverride par défaut ("postgres"/"redis"). name/user = auth.database / # auth.username par défaut de ../postgresql. # Le mot de passe vit dans secrets.DB_PASSWORD / secrets.REDIS_PASSWORD # ci-dessous (jamais ici), et DATABASE_URL/REDIS_URL sont assemblés par # templates/secret.yaml à partir des deux. database: host: postgres port: 5432 name: vitrine_db user: postgres sslmode: disable redis: host: redis port: 6379 db: 0 # Variables non sensibles (backend/internal/platform/config). PORT doit # rester égal à service.port ci-dessus / containerPort (templates/deployment.yaml). env: PORT: "8080" GIN_MODE: release # Laisser vide si frontend et backend sont routés sur le même host par # l'IngressRoute partagée (voir ../ingressroute) -- l'origine est alors la # même pour le navigateur et CORS n'entre pas en jeu. CORS_ORIGIN: "" ACCESS_TOKEN_TTL_MINUTES: "15" REFRESH_TOKEN_TTL_HOURS: "168" COOKIE_SECURE: "true" # Nombre maximum de comptes admin : saisi par l'admin au déploiement # (dashboard Omnex), surchargé par le control-plane. ADMIN_NUMBER: "1" SEED_ADMIN_USERNAME: admin MEDIA_STORAGE_DRIVER: local MEDIA_MAX_UPLOAD_MB: "10" MEDIA_LOCAL_DIR: /app/uploads # URL publique sous laquelle /uploads est servi -- à fixer explicitement # une fois le host de l'IngressRoute connu (ex: https://shop.example.com/uploads). MEDIA_LOCAL_BASE_URL: "" VERIFICATION_UPLOAD_DIR: /app/verification-uploads S3_BUCKET: "" S3_REGION: "" S3_ENDPOINT: "" S3_USE_PATH_STYLE: "false" S3_PUBLIC_BASE_URL: "" # Valeurs sensibles -- à surcharger via --set-string ou un Secret Manager # externe, jamais commitées avec une vraie valeur. DATABASE_URL et REDIS_URL # ne sont PAS ici : templates/secret.yaml les construit à partir de # database.* / redis.* ci-dessus + DB_PASSWORD / REDIS_PASSWORD. secrets: JWT_SECRET: "change-me-to-a-long-random-secret" DB_PASSWORD: "" REDIS_PASSWORD: "" SEED_ADMIN_PASSWORD: "" S3_ACCESS_KEY_ID: "" S3_SECRET_ACCESS_KEY: "" # Bootstrap du compte admin initial (cmd/seed). PAS idempotent -- échoue si # SEED_ADMIN_USERNAME existe déjà (voir backend/cmd/seed/main.go), donc ce # Job ne tourne qu'en post-install (jamais post-upgrade). À repasser à false # après la première installation réussie. seedJob: enabled: false backoffLimit: 0 # Applique backend/migrations (embarquées dans l'image) sur DATABASE_URL en # hook pre-install/pre-upgrade, via l'image officielle golang-migrate. # `migrate up` est idempotent -- rien n'empêche de le laisser actif à chaque # upgrade, contrairement au seed Job ci-dessus. migrationJob: enabled: true backoffLimit: 2 image: repository: migrate/migrate tag: v4.18.1 pullPolicy: IfNotPresent livenessProbe: httpGet: path: /health port: http initialDelaySeconds: 10 periodSeconds: 20 readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 5 periodSeconds: 10 podSecurityContext: runAsNonRoot: true runAsUser: 101 runAsGroup: 101 fsGroup: 101 seccompProfile: type: RuntimeDefault securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: false capabilities: drop: - ALL podAnnotations: {}