xpeditis2.0/infra/prod/k8s/base/03-secrets.template.yaml
2026-09-14 11:19:29 +02:00

171 lines
6.7 KiB
YAML

# =============================================================================
# GABARIT de secrets -- NE JAMAIS COMMITTER CE FICHIER RENSEIGNE
# =============================================================================
# Mode d'emploi :
#
# 1. cp 03-secrets.template.yaml /tmp/secrets.yaml
# 2. renseigner chaque REMPLACER (voir 06-secrets-sops.md)
# 3. sops -e /tmp/secrets.yaml > k8s/base/03-secrets.sops.yaml
# 4. shred -u /tmp/secrets.yaml
# 5. git add k8s/base/03-secrets.sops.yaml <-- celui-la est chiffre, il se commit
#
# Application sur le cluster : bash scripts/secrets-apply.sh
#
# Generation d'une valeur aleatoire :
# openssl rand -base64 48 | tr -d '\n'
#
# RAPPEL : aucune valeur de preprod ne doit etre reprise. Les secrets presents
# dans infra/preprod/docker-stack.preprod.yml sont dans l'historique Git, donc
# compromis (cf. 13-securite-durcissement.md).
---
apiVersion: v1
kind: Secret
metadata:
name: xpeditis-backend-secrets
namespace: xpeditis-prod
labels:
app.kubernetes.io/name: xpeditis-backend
app.kubernetes.io/part-of: xpeditis
type: Opaque
stringData:
# --- Base de donnees -------------------------------------------------------
DATABASE_USER: "xpeditis"
DATABASE_PASSWORD: "REMPLACER" # identique a POSTGRES_PASSWORD de db-01
# Certificat PUBLIC PEM de db-01 (/var/lib/xpeditis/certs/server.crt),
# obtenu via un canal d'administration authentifie. Jamais server.key.
# Necessaire pour authentifier le certificat auto-signe de PostgreSQL.
DATABASE_SSL_CA: |
REMPLACER_PAR_LE_CERTIFICAT_PUBLIC_PEM_DE_DB_01
# --- Redis -----------------------------------------------------------------
REDIS_PASSWORD: "REMPLACER" # identique a REDIS_PASSWORD de db-01
# --- JWT -------------------------------------------------------------------
# Minimum 32 caracteres (valide par Joi au demarrage). Le changer invalide
# toutes les sessions en cours : a faire en dehors des heures ouvrees.
JWT_SECRET: "REMPLACER_64_CARACTERES_MINIMUM"
# Derive les mots de passe des documents transporteurs. S'il est absent, le
# code retombe sur JWT_SECRET -- et une rotation du JWT rendrait alors
# illisibles tous les documents deja emis. On le definit donc explicitement,
# et on ne le change JAMAIS sans plan de migration.
DOCUMENT_PASSWORD_SECRET: "REMPLACER_32_CARACTERES_MINIMUM"
# --- SMTP (Brevo) ----------------------------------------------------------
# Creez une cle SMTP dediee a la production dans Brevo. Celle de la preprod
# est publiee dans le depot : elle doit etre revoquee.
SMTP_USER: "REMPLACER"
SMTP_PASS: "REMPLACER"
# --- Stockage objet Hetzner (documents applicatifs) ------------------------
# Jeu de cles DISTINCT de celui utilise par WAL-G pour les sauvegardes :
# une fuite cote application ne doit pas donner acces aux sauvegardes.
AWS_ACCESS_KEY_ID: "REMPLACER"
AWS_SECRET_ACCESS_KEY: "REMPLACER"
# --- Stripe ----------------------------------------------------------------
# ATTENTION : cles LIVE en production (sk_live_..., whsec_...).
STRIPE_SECRET_KEY: "REMPLACER_sk_live"
STRIPE_WEBHOOK_SECRET: "REMPLACER_whsec"
# Noms exacts attendus par le code (app.module.ts / subscriptions).
# Le stack de preprod utilise STARTER/PRO/ENTERPRISE : ces noms-la ne sont lus
# par personne, les identifiants de tarif y sont donc silencieusement absents.
# Ne pas reproduire l'erreur ici.
STRIPE_SILVER_MONTHLY_PRICE_ID: "REMPLACER_price_"
STRIPE_SILVER_YEARLY_PRICE_ID: "REMPLACER_price_"
STRIPE_GOLD_MONTHLY_PRICE_ID: "REMPLACER_price_"
STRIPE_GOLD_YEARLY_PRICE_ID: "REMPLACER_price_"
STRIPE_PLATINIUM_MONTHLY_PRICE_ID: "REMPLACER_price_"
STRIPE_PLATINIUM_YEARLY_PRICE_ID: "REMPLACER_price_"
# --- Premier administrateur (FACULTATIF) -----------------------------------
# LAISSEZ VIDE dans le cas nominal.
#
# Vide + BOOTSTRAP_ADMIN_EMAIL renseigne dans le ConfigMap : le compte ADMIN
# est cree sans mot de passe utilisable, et vous definissez le votre via
# « mot de passe oublie ». Aucun secret n'existe nulle part -- rien a faire
# fuiter, et la reception du courriel prouve au passage que SMTP fonctionne.
#
# Ne renseignez ce champ que si vous devez pouvoir vous connecter AVANT que
# l'envoi de courriels ne soit operationnel. Dans ce cas :
# cd apps/backend && node scripts/setup/generate-admin-hash.js
# Le hash reste attaquable hors ligne : changez le mot de passe des la
# premiere connexion, puis RETIREZ cette valeur et reappliquez le Secret.
#
# Un mot de passe en clair place ici fait echouer la migration : la valeur
# doit commencer par "$argon2".
BOOTSTRAP_ADMIN_PASSWORD_HASH: ""
# --- Pappers (registre SIRET) ----------------------------------------------
# Facultatif : sans cle, la verification SIRET est simplement ignoree
# (pappers-siret.adapter.ts emet un avertissement au demarrage).
PAPPERS_API_KEY: "REMPLACER"
# --- Documentation Swagger -------------------------------------------------
# Laisser les deux valeurs VIDES en production : main.ts desactive alors
# completement /api/docs. Ne les renseigner que si vous avez vraiment besoin
# d'exposer la documentation, auquel cas elle passe derriere Basic Auth.
SWAGGER_USERNAME: ""
SWAGGER_PASSWORD: ""
# --- Connecteurs transporteurs (facultatifs) -------------------------------
# A renseigner uniquement quand les contrats API sont signes. Un connecteur
# sans identifiants est ignore, il ne fait pas planter le demarrage.
MAERSK_API_KEY: ""
MAERSK_API_BASE_URL: ""
MSC_API_KEY: ""
MSC_API_URL: ""
CMACGM_CLIENT_ID: ""
CMACGM_CLIENT_SECRET: ""
CMACGM_API_URL: ""
HAPAG_API_KEY: ""
HAPAG_API_URL: ""
ONE_USERNAME: ""
ONE_PASSWORD: ""
ONE_API_URL: ""
---
# Token API Cloudflare utilise par cert-manager pour le defi DNS-01.
# Permissions minimales : Zone / DNS / Edit sur la seule zone xpeditis.com.
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token
namespace: cert-manager
labels:
app.kubernetes.io/part-of: xpeditis
type: Opaque
stringData:
api-token: "REMPLACER"
---
# Acces a Grafana. Mot de passe long : l'interface est exposee sur Internet,
# meme si elle est filtree par IP en amont.
apiVersion: v1
kind: Secret
metadata:
name: grafana-admin
namespace: monitoring
labels:
app.kubernetes.io/part-of: xpeditis
type: Opaque
stringData:
admin-user: "REMPLACER"
admin-password: "REMPLACER"
---
# Webhook Discord utilise par Alertmanager. Dans un Secret et non dans le
# ConfigMap : une URL de webhook permet de publier n'importe quoi dans le canal.
apiVersion: v1
kind: Secret
metadata:
name: alertmanager-secrets
namespace: monitoring
labels:
app.kubernetes.io/part-of: xpeditis
type: Opaque
stringData:
discord-webhook: "https://discord.com/api/webhooks/REMPLACER"