8.5 KiB
Deploiement Docker — SIRH
Pre-requis
Docker
# Ubuntu
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
Se deconnecter/reconnecter pour que le groupe docker prenne effet.
Nginx
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
PostgreSQL
PostgreSQL tourne dans un conteneur Docker separe (voir le repo infra-postgres).
Il doit etre installe et accessible avant de deployer SIRH.
Creer la base de donnees pour SIRH :
cd /var/www/postgres
docker compose exec postgres psql -U admin
-- Si le user n'existe pas encore
CREATE USER malio WITH PASSWORD 'motdepasse';
-- Creer la base
CREATE DATABASE sirh_prod OWNER malio;
\q
Premiere installation (nouvelle machine)
Guide complet pour mettre en ligne SIRH sur une machine vierge. Inclut les pre-requis, la BDD et l'app.
1. Installer les pre-requis
Installer Docker, Nginx et PostgreSQL (voir section Pre-requis ci-dessus).
2. Creer le dossier de deploiement
sudo mkdir -p /var/www/sirh
sudo chown -R $(whoami):$(whoami) /var/www/sirh
cd /var/www/sirh
3. Se connecter au registry Docker de Gitea
docker login gitea.malio.fr
- Username : le nom d'utilisateur du compte organisation Gitea
MALIO-DEV - Password : le token REGISTRY_TOKEN dispo dans le bitwarden
Le login est sauvegarde dans ~/.docker/config.json, pas besoin de le refaire a chaque deploiement.
4. Creer les fichiers de deploiement
Creer docker-compose.yml :
services:
app:
image: gitea.malio.fr/malio-dev/sirh:${SIRH_IMAGE_TAG:-latest}
container_name: sirh-app
env_file: .env
ports:
- "8080:80"
volumes:
- ./config/jwt:/var/www/html/config/jwt:ro
- ./uploads:/var/www/html/var/uploads
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stopped
Creer deploy.sh :
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
TAG="${1:-latest}"
export SIRH_IMAGE_TAG="$TAG"
echo "==> Deploying sirh:${TAG}..."
echo "==> Pulling image..."
docker compose pull
echo "==> Starting container..."
docker compose up -d
echo "==> Waiting for container to be ready..."
sleep 3
echo "==> Running migrations..."
docker compose exec -T -u www-data app php bin/console doctrine:migrations:migrate --no-interaction
echo "==> Clearing cache..."
docker compose exec -T -u www-data app php bin/console cache:clear --env=prod
docker compose exec -T -u www-data app php bin/console cache:warmup --env=prod
VERSION=$(docker compose exec -T app cat config/version.yaml | grep 'app.version' | awk -F"'" '{print $2}')
echo "==> Deployed v${VERSION}"
Rendre executable :
chmod +x deploy.sh
5. Configurer l'environnement
Creer .env avec les variables suivantes :
# Symfony
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=<generer avec: openssl rand -hex 32>
# Database (host.docker.internal = la machine hote, ou le PG tourne en Docker)
DATABASE_URL="postgresql://malio:password@host.docker.internal:5432/sirh_prod?serverVersion=16&charset=utf8"
# JWT
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=<generer avec: openssl rand -hex 32>
JWT_COOKIE_SECURE=1
JWT_COOKIE_SAMESITE=lax
JWT_TOKEN_TTL=86400
JWT_COOKIE_TTL=86400
# CORS
CORS_ALLOW_ORIGIN='^https?://sirh\.malio-dev\.fr$'
# App
DEFAULT_URI=https://sirh.malio-dev.fr
APP_SHARE_DIR=var/share
RTT_START_DATE=2026-02-23
HOLIDAY_URL="https://calendrier.api.gouv.fr/jours-feries/"
6. Generer les cles JWT
mkdir -p config/jwt
openssl genpkey -algorithm RSA -out config/jwt/private.pem -pkeyopt rsa_keygen_bits:4096
openssl rsa -pubout -in config/jwt/private.pem -out config/jwt/public.pem
Rendre les cles lisibles par le conteneur (www-data = uid 33) :
sudo chown 33:33 config/jwt/private.pem config/jwt/public.pem
sudo chmod 644 config/jwt/private.pem config/jwt/public.pem
7. Creer le dossier uploads
mkdir -p uploads
8. Configurer Nginx systeme
Creer /etc/nginx/sites-available/sirh.conf :
server {
listen 80;
server_name sirh.malio-dev.fr;
root /var/www/sirh/public;
# Maintenance mode
if (-f /var/www/sirh/maintenance.on) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
location = /maintenance.html {
internal;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Copier la page de maintenance et activer le site :
cp deploy/maintenance.html /var/www/sirh/public/maintenance.html
sudo ln -sf /etc/nginx/sites-available/sirh.conf /etc/nginx/sites-enabled/sirh.conf
sudo nginx -t && sudo systemctl reload nginx
9. Deployer
./deploy.sh
10. Importer les donnees (optionnel)
Si tu as un dump SQL a importer :
# Depuis ton PC, envoyer le dump vers le serveur
scp sirh.sql user@serveur:/tmp/sirh.sql
# Sur le serveur, vider la base puis importer
cd /var/www/postgres
docker compose exec -T postgres psql -U malio sirh_prod -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
docker compose exec -T postgres psql -U malio sirh_prod < /tmp/sirh.sql
# Creer les tables manquantes (si le dump a des erreurs de syntaxe)
cd /var/www/sirh
docker compose exec -u www-data app php bin/console doctrine:schema:update --force --env=prod
# Nettoyer
rm /tmp/sirh.sql
Structure finale du dossier
/var/www/sirh/
├── docker-compose.yml
├── deploy.sh
├── .env
├── config/jwt/
│ ├── private.pem
│ └── public.pem
├── public/
│ └── maintenance.html
└── uploads/
Deployer une nouvelle version
Quand l'app est deja installee, deployer une mise a jour :
cd /var/www/sirh
./deploy.sh # deploie la derniere version (latest)
./deploy.sh v0.1.61 # deploie une version specifique
Le script active automatiquement la maintenance pendant le deploy et la desactive a la fin.
Maintenance manuelle
Activer la maintenance (sans deployer) :
cd /var/www/sirh
touch maintenance.on
Desactiver :
rm maintenance.on
Rollback
Image seule (pas de changement de schema BDD)
./deploy.sh v0.1.60
Avec rollback de migration
# 1. Rollback schema (pendant que la version actuelle tourne encore)
docker compose exec -T -u www-data app php bin/console doctrine:migrations:migrate prev --no-interaction
# 2. Deployer l'ancienne version
./deploy.sh v0.1.60
Voir les logs
cd /var/www/sirh
docker compose logs -f # tous les logs
docker compose logs -f --tail=100 # 100 dernieres lignes
Logs Symfony :
docker compose exec app cat var/log/prod.log
Migration depuis l'ancien deploiement (tar.gz)
Si l'application tourne deja en bare metal :
- Installer Docker (voir pre-requis)
- Creer le dossier
/var/www/sirh-docker/(ne pas ecraser l'ancien) - Copier les fichiers existants :
cp /var/www/sirh/.env /var/www/sirh-docker/.env cp -a /var/www/sirh/config/jwt /var/www/sirh-docker/config/jwt cp -a /var/www/sirh/var/uploads /var/www/sirh-docker/uploads - Creer
docker-compose.ymletdeploy.shdans/var/www/sirh-docker/(voir etape 4 ci-dessus) - Editer
/var/www/sirh-docker/.env: changerDATABASE_URLpour utiliserhost.docker.internalau lieu de127.0.0.1 - Se connecter au registry Gitea (voir etape 3 ci-dessus)
- Mettre a jour Nginx systeme avec la conf reverse proxy (voir etape 8 ci-dessus)
- Arreter l'ancien PHP-FPM :
sudo systemctl stop php8.4-fpm - Deployer :
cd /var/www/sirh-docker && ./deploy.sh - Verifier que tout marche, puis renommer le dossier :
mv /var/www/sirh-docker /var/www/sirh