# ============================================================================= # 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"