⚙️ Développement

Stack Docker complète — Symfony + Next.js + Nginx + MariaDB + Redis

📅 19 juin 202525 min de lecture
dockersymfonynext-jsmariadbredisnginx

Architecture réseau

Traefik (HTTPS)
  traefik-network
   Nginx (port 80)
  ignis-network
  ├── /api/* ignis_php (PHP-FPM)
  └── /* ignis_node (Next.js)
 
Réseaux :
  traefik-network  (bridge)           → Traefik ↔ Nginx
  ignis-network    (bridge)           → Nginx ↔ PHP ↔ Node (accès internet OK)
  ignis-db-network (bridge --internal)→ PHP ↔ MariaDB ↔ Redis (isolé)

Pourquoi 3 réseaux ? PHP a besoin d'internet pour Composer — ignis-network n'est pas --internal. MariaDB et Redis n'ont jamais besoin d'internet — ignis-db-network est --internal.

Créer les réseaux Docker

# Réseau public — Traefik ↔ Nginx
docker network create \
  --driver bridge \
  --subnet 172.247.193.0/24 \
  --gateway 172.247.193.254 \
  --opt com.docker.network.bridge.name=traefik-br \
  traefik-network
 
# Réseau applicatif — Nginx ↔ PHP ↔ Node
docker network create \
  --driver bridge \
  --subnet 172.247.194.0/24 \
  --gateway 172.247.194.254 \
  --opt com.docker.network.bridge.name=ignis-br \
  ignis-network
 
# Réseau données — PHP ↔ MariaDB ↔ Redis (isolé)
docker network create \
  --driver bridge --internal \
  --subnet 172.247.195.0/24 \
  --gateway 172.247.195.254 \
  --opt com.docker.network.bridge.name=ignis-db-br \
  ignis-db-network

Structure du projet

/opt/docker-data/ignis/
├── docker-compose.yml
├── .env
├── backend/ code Symfony
├── frontend/ code Next.js
└── docker/
    ├── php/
   ├── Dockerfile
   ├── entrypoint.sh
   ├── conf.d/custom.ini
   └── php-fpm/zz-custom.conf
    ├── nginx/
   ├── Dockerfile
   ├── nginx.conf
   └── default.conf
    ├── node/
   ├── Dockerfile
   └── init-nextjs.sh
    ├── redis/
   ├── Dockerfile
   └── config/redis.conf
    └── mariadb/
        ├── Dockerfile
        └── config/my.cnf

Initialisation automatique

Le script init-ignis.sh crée toute la structure. À lancer une seule fois :

# Donner les droits à admin_docker
sudo sh 01-setup-ignis.sh
 
# Basculer et initialiser
sudo machinectl shell admin_docker@
sh /opt/docker-data/init-ignis.sh

Configuration .env

cp /opt/docker-data/ignis/.env.example /opt/docker-data/ignis/.env
nano /opt/docker-data/ignis/.env
COMPOSE_PROJECT_NAME=ignis
DOMAIN_NAME=ignis-fox.fr
 
MYSQL_ROOT_PASSWORD=mot_de_passe_fort
MYSQL_DATABASE=ignis
MYSQL_USER=ignis_user
MYSQL_PASSWORD=mot_de_passe_db
 
REDIS_PASSWORD=mot_de_passe_redis
 
APP_ENV=dev
APP_SECRET=chaine_aleatoire_32_caracteres
JWT_PASSPHRASE=passphrase_jwt

Générer des valeurs sécurisées openssl rand -hex 32 pour APP_SECRET openssl rand -base64 24 pour les mots de passe

Permissions

À lancer avec sudo après le premier démarrage des conteneurs :

sudo sh /opt/docker-data/ignis/setup-permissions.sh
DossierPropriétaireModePourquoi
backend/admin_docker:developers2775IDE + www-data écrit var/
backend/var/www-data:developers2775PHP runtime files
frontend/admin_docker:developers2775IDE + node écrit
docker/admin_docker:developers2775IDE modifie les configs
.envadmin_docker:developers660Secrets — non lisible par autres

Démarrage de la stack

cd /opt/docker-data/ignis
docker compose up -d
 
# Suivre les logs du premier démarrage
docker compose logs -f ignis_php
docker compose logs -f ignis_node

Premier démarrage PHP installe Symfony + bundles (2-3 min). Node installe les dépendances npm. Les démarrages suivants sont quasi instantanés.

✅ Vérification
docker compose ps
# Tous les services doivent être "Up (healthy)"

Migrations et fixtures

# Générer la migration depuis les entités
docker compose exec ignis_php php bin/console make:migration
 
# Appliquer les migrations
docker compose exec ignis_php php bin/console doctrine:migrations:migrate
 
# Charger les données de test
docker compose exec ignis_php php bin/console doctrine:fixtures:load

Commandes utiles

docker compose up -d              # Démarrer
docker compose down               # Arrêter
docker compose down -v            # Arrêter + supprimer volumes (⚠️ efface la BDD)
 
# Shells
docker compose exec ignis_php sh
docker compose exec ignis_mariadb mariadb -u ignis_user -p ignis
 
# Symfony
docker compose exec ignis_php php bin/console cache:clear
docker compose exec ignis_php php bin/console make:entity
docker compose exec ignis_php php bin/console debug:router
 
# Rebuild après modif Dockerfile
docker compose build ignis_php
docker compose up -d ignis_php

Erreurs fréquentes

ErreurCauseSolution
vendor/autoload.php not foundComposer pas encore terminéAttendre la fin des logs PHP
Connection refused MariaDBMariaDB pas encore prêteL'entrypoint attend automatiquement
next: not foundnode_modules absent ou corrompuSupprimer frontend/node_modules et redémarrer
Page blanche Next.jsErreur de compilationVoir docker compose logs ignis_node
No route found SymfonyRoutes non chargéesVérifier config/routes.yaml et php bin/console debug:router