Files
SIRH/doc/deployment-docker.md

6.4 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

Verifier que Nginx tourne :

sudo systemctl enable nginx
sudo systemctl start nginx

Premier deploiement

1. Creer le dossier de deploiement

sudo mkdir -p /var/www/sirh
sudo chown -R $(whoami):$(whoami) /var/www/sirh
cd /var/www/sirh

2. 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 app php bin/console doctrine:migrations:migrate --no-interaction

echo "==> Clearing cache..."
docker compose exec -T app php bin/console cache:clear --env=prod
docker compose exec -T 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

3. 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 bare metal)
DATABASE_URL="postgresql://sirh_user:password@host.docker.internal:5432/sirh?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/"

4. Generer les cles JWT

mkdir -p config/jwt
docker run --rm -v $(pwd)/config/jwt:/jwt php:8.4-cli bash -c \
  "apt-get update -qq && apt-get install -y -qq openssl > /dev/null && \
   openssl genpkey -algorithm RSA -out /jwt/private.pem -pkeyopt rsa_keygen_bits:4096 && \
   openssl rsa -pubout -in /jwt/private.pem -out /jwt/public.pem"

5. Creer le dossier uploads

mkdir -p uploads

6. Se connecter au registry Docker de Gitea

Pour que la machine puisse telecharger les images Docker depuis Gitea, il faut se connecter au registry une fois :

docker login gitea.malio.fr

Docker va demander :

  • 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.

7. Configurer Nginx systeme

Creer /etc/nginx/sites-available/sirh.conf :

server {
    listen 80;
    server_name sirh.malio-dev.fr;

    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;
    }
}

Activer le site :

sudo ln -sf /etc/nginx/sites-available/sirh.conf /etc/nginx/sites-enabled/sirh.conf
sudo nginx -t && sudo systemctl reload nginx

8. Deployer

./deploy.sh

Structure finale du dossier

/var/www/sirh/
├── docker-compose.yml
├── deploy.sh
├── .env
├── config/jwt/
│   ├── private.pem
│   └── public.pem
└── uploads/

Deployer une release

cd /var/www/sirh
./deploy.sh           # deploie la derniere version (latest)
./deploy.sh v0.1.61   # deploie une version specifique

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 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

Migration depuis l'ancien deploiement (tar.gz)

Si l'application tourne deja en bare metal :

  1. Installer Docker (voir pre-requis)
  2. Creer le dossier /var/www/sirh-docker/ (ne pas ecraser l'ancien)
  3. 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
    
  4. Creer docker-compose.yml et deploy.sh dans /var/www/sirh-docker/ (voir etape 2 ci-dessus)
  5. Editer /var/www/sirh-docker/.env : changer DATABASE_URL pour utiliser host.docker.internal au lieu de 127.0.0.1
  6. Se connecter au registry Gitea (voir etape 6 ci-dessus)
  7. Mettre a jour Nginx systeme avec la conf reverse proxy (voir etape 7 ci-dessus)
  8. Arreter l'ancien PHP-FPM : sudo systemctl stop php8.4-fpm
  9. Deployer : cd /var/www/sirh-docker && ./deploy.sh
  10. Verifier que tout marche, puis renommer le dossier : mv /var/www/sirh-docker /var/www/sirh