9b63dc8809
- 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>
3.6 KiB
3.6 KiB
Déploiement CESIZen sur Coolify
Stack de production : PostgreSQL + API Laravel + Frontend Next.js (DSFR). Le mobile (Expo) n'est pas concerné (ce n'est pas une appli web).
Fichiers fournis :
backend/Dockerfile.prod— API Laravel (PHP 8.4, migrations + seed au démarrage)frontend/Dockerfile.prod— Next.js en sortie standalone (image légère)docker-compose.prod.yml— orchestration des 3 servicesbackend/docker/entrypoint.sh— démarrage de l'API
Option recommandée : « Docker Compose » dans Coolify
- Créer une ressource → Docker Compose → connecter le dépôt GitHub
AzmogEx/CesiZen, branchemain. - Compose file :
docker-compose.prod.yml. - Renseigner les variables d'environnement (ci-dessous).
- Domaines : dans Coolify, mapper
- le service frontend (port
3000) sur ton domaine principal (ex.cesizen.tondomaine.fr) - le service backend (port
8000) sur un sous-domaine API (ex.api.cesizen.tondomaine.fr)
- le service frontend (port
- Déployer.
Le frontend lit l'API via
NEXT_PUBLIC_API_URL, injectée au build → elle doit pointer vers l'URL publique du backend (pas l'URL interne Docker).
Variables d'environnement à définir dans Coolify
| Variable | Exemple | Rôle |
|---|---|---|
POSTGRES_DB |
cesizen |
Nom de la base |
POSTGRES_USER |
cesizen |
Utilisateur base |
POSTGRES_PASSWORD |
(mot de passe fort) | Obligatoire |
APP_KEY |
base64:... |
Clé Laravel — voir génération ci-dessous |
JWT_SECRET |
(chaîne aléatoire) | Secret JWT — voir génération |
JWT_TTL |
60 |
Durée de vie du token (min) |
APP_URL |
https://api.cesizen.tondomaine.fr |
URL publique de l'API |
FRONTEND_URL |
https://cesizen.tondomaine.fr |
Origine autorisée (CORS) |
NEXT_PUBLIC_API_URL |
https://api.cesizen.tondomaine.fr/api/v1 |
URL publique de l'API côté navigateur |
Générer les secrets (en local)
# APP_KEY
docker run --rm php:8.4-cli sh -c "php -r 'echo \"base64:\".base64_encode(random_bytes(32)).\"\n\";'"
# JWT_SECRET (64 caractères)
openssl rand -base64 48 | tr -d '\n='
Définis-les une fois dans Coolify pour qu'ils restent stables entre déploiements. Si tu ne les fournis pas, l'entrypoint en génère au démarrage — mais ils changeront à chaque redéploiement (déconnexion de tous les utilisateurs).
Notes
- Migrations & seed : exécutés automatiquement au démarrage du backend. Les seeders sont idempotents (pas de doublons même au redémarrage). La base est peuplée avec les comptes de démo (
admin@cesizen.fr/Admin123!,demo@cesizen.fr/Demo123!) et le référentiel d'émotions. - Cache/queue/session : en
database(aucun Redis requis). Tu peux ajouter un service Redis et repasser ces variables surredissi besoin. - HTTPS : géré par le proxy de Coolify (Traefik). Pense à passer
APP_URL/FRONTEND_URL/NEXT_PUBLIC_API_URLenhttps://. - Serveur PHP : l'API tourne via
php artisan serve(suffisant pour ce projet). Pour une charge réelle, on passerait à php-fpm+nginx ou FrankenPHP/Octane.
Déploiement par services séparés (alternative)
Si tu préfères 3 ressources distinctes dans Coolify :
- PostgreSQL : ressource « Database » Coolify (récupère host/user/password).
- Backend : ressource « Dockerfile », dossier
backend, fichierDockerfile.prod, port8000, + les variablesAPP_*,DB_*,JWT_*,FRONTEND_URL. - Frontend : ressource « Dockerfile », dossier
frontend, fichierDockerfile.prod, port3000, build argNEXT_PUBLIC_API_URL.