feat(deploy): Dockerfiles de production + compose + guide Coolify

- frontend/Dockerfile.prod : Next.js standalone (294 Mo), régénère les assets DSFR,
  injecte NEXT_PUBLIC_API_URL au build (npm ci --ignore-scripts pour le postinstall)
- backend/Dockerfile.prod + docker/entrypoint.sh : API Laravel, migrations + seed
  idempotent + serveur, génération de secrets en fallback
- docker-compose.prod.yml : Postgres + API + Front pour déploiement Coolify
- next.config.ts : output standalone ; .dockerignore back/front
- DEPLOIEMENT_COOLIFY.md : guide + variables d'environnement

Images de prod testées (build + smoke-test DSFR OK).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Azmog
2026-06-19 09:15:35 +02:00
parent 6de41bb6ce
commit 9b63dc8809
8 changed files with 258 additions and 3 deletions
+33
View File
@@ -0,0 +1,33 @@
#!/bin/sh
set -e
cd /app
# Laravel a besoin d'un fichier .env (les variables d'env du conteneur,
# définies par Coolify, ont la priorité sur ce fichier).
[ -f .env ] || cp .env.example .env
# Clés générées au démarrage si absentes (À DÉFINIR EN PROD via Coolify :
# APP_KEY et JWT_SECRET, pour qu'elles restent stables entre déploiements).
if [ -z "$APP_KEY" ]; then
echo "[entrypoint] APP_KEY absent — génération (pensez à la fixer dans Coolify)."
php artisan key:generate --force
fi
if [ -z "$JWT_SECRET" ]; then
echo "[entrypoint] JWT_SECRET absent — génération (pensez à le fixer dans Coolify)."
php artisan jwt:secret --force
fi
# Base de données : migrations + seed (les seeders sont idempotents).
echo "[entrypoint] Migrations..."
php artisan migrate --force
echo "[entrypoint] Seed (idempotent)..."
php artisan db:seed --force || true
# Optimisation (les routes ne dépendent pas de l'env ; on évite config:cache
# pour ne pas figer des variables d'environnement par erreur).
php artisan route:cache || true
php artisan view:cache || true
echo "[entrypoint] Démarrage de l'API sur le port 8000."
exec php artisan serve --host=0.0.0.0 --port=8000