TQ-Slator/.env
Stephan Morand ad104c82d7 Rendre le déploiement possible : image de production, amorçage, langues
L'image de production existait mais n'était jamais partie. Quatre manques la
rendaient inexploitable, tous silencieux — l'application démarrait dans les
quatre cas.

Le front n'était pas dans l'image
    public/build et public/index.html sont gitignorés, et le Dockerfile n'avait
    pas d'étage Node. L'API répondait, chaque URL de l'interface renvoyait 503 :
    une panne partielle, donc plus déroutante qu'une panne franche. Étage
    app_frontend ajouté, avec une vérification au build qui échoue si le front
    manque.

Aucune migration n'était appliquée
    Seul l'entrypoint de dev le faisait. docker/entrypoint.prod.sh applique les
    migrations sous garde RUN_MIGRATIONS et refuse de démarrer sur un APP_SECRET
    vide, un DATABASE_URL absent ou un BACK_OFFICE_URL sur localhost — cette
    dernière valeur ne casse rien de visible, elle casse la réception des
    invitations, ailleurs, plusieurs jours plus tard.

Aucun moyen de créer le premier compte
    Les comptes s'obtiennent par invitation, et inviter demande d'être connecté.
    Les fixtures sont une dépendance de dev. Il ne restait que l'INSERT à la
    main. app:create-super-admin crée l'organisation et le premier compte, refuse
    une adresse connue, exige douze caractères.

Le référentiel de langues était vide
    Créé par les fixtures, donc absent en production. Sans langue source à
    choisir, aucun projet ne pouvait être créé. Passé en migration : c'est une
    donnée de référence, pas un jeu d'exemple.

Au passage : l'expéditeur des courriels était en dur sur no-reply@tq-slator.local,
qu'un relais SMTP réel rejette. Devenu MAILER_FROM.

compose.prod.yaml est un fichier distinct, et c'est le point qui compte : Docker
fusionne compose.override.yaml dès que le principal s'appelle compose.yaml, si
bien que Mailpit et les ports publiés seraient partis en production sans que
personne ne l'ait demandé.

Parcours vérifié sur une pile neuve : connexion, création de projet, plateforme,
push de clés, publication, clé API, fichier livré.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 10:53:17 +02:00

82 lines
3.6 KiB
Bash

# In all environments, the following files are loaded if they exist,
# the latter taking precedence over the former:
#
# * .env contains default values for the environment variables needed by the app
# * .env.local uncommitted file with local overrides
# * .env.$APP_ENV committed environment-specific defaults
# * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
#
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
# https://symfony.com/doc/current/configuration/secrets.html
#
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=
APP_SHARE_DIR=var/share
###< symfony/framework-bundle ###
###> symfony/routing ###
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
DEFAULT_URI=http://localhost
###< symfony/routing ###
###> nelmio/cors-bundle ###
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
###< nelmio/cors-bundle ###
###> symfony/mailer ###
# Mailpit en local : toutes les invitations sont capturées sur http://localhost:8025
MAILER_DSN=smtp://mailer:1025
# Expéditeur des invitations. En production, un domaine réellement délivrable :
# un « .local » est rejeté par les relais SMTP, ou classé indésirable.
MAILER_FROM=no-reply@tq-slator.local
###< symfony/mailer ###
###> symfony/messenger ###
# Choose one of the transports below
# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages
# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages
MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
###< symfony/messenger ###
###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
DATABASE_URL="mysql://tqslator:tqslator@database:3306/tqslator?serverVersion=11.4.0-MariaDB&charset=utf8mb4"
###< doctrine/doctrine-bundle ###
###> tq-slator ###
# Organisation unique en v1 (décision 1 : interne, schéma SaaS-ready).
# Le Doctrine filter s'appuie dessus tant qu'aucun contexte utilisateur n'est établi (CLI, workers).
DEFAULT_ORGANIZATION_SLUG=tranquilys
# Racine de stockage des captures d'écran de contexte (décision 7 : stockage local).
# Monté sur un volume Docker ; passer à un adaptateur S3 se fait derrière AssetStorageInterface.
ASSET_STORAGE_PATH=%kernel.project_dir%/var/storage
# Rétention des releases : on conserve toujours celles référencées par un environnement,
# plus les N plus récentes non référencées (décision 6 : « une version de test »).
RELEASE_RETENTION_UNREFERENCED=1
# URL publique du back-office, utilisée dans les liens d'invitation. Elle ne peut
# pas être déduite de la requête : les courriels partent depuis un worker, hors
# contexte HTTP.
BACK_OFFICE_URL=http://localhost:8080
# Durée de validité d'une invitation. Les prestataires externes ont une fenêtre
# plus courte : leur accès porte sur des libellés produit avant annonce, et une
# invitation qui traîne dans une boîte mail est une porte ouverte.
INVITATION_TTL=P7D
INVITATION_TTL_EXTERNAL=P2D
###< tq-slator ###
###> snc/redis ###
REDIS_URL=redis://cache:6379
###< snc/redis ###