# Deploiement Docker — SIRH ## Pre-requis ### Docker ```bash # 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 ```bash sudo apt install -y nginx ``` Verifier que Nginx tourne : ```bash sudo systemctl enable nginx sudo systemctl start nginx ``` ## Premier deploiement ### 1. Creer le dossier de deploiement ```bash 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` : ```yaml 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` : ```bash #!/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 : ```bash chmod +x deploy.sh ``` ### 3. Configurer l'environnement Creer `.env` avec les variables suivantes : ```env # Symfony APP_ENV=prod APP_DEBUG=0 APP_SECRET= # 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= 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 ```bash 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 ```bash 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 : ```bash 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` : ```nginx 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 : ```bash sudo ln -sf /etc/nginx/sites-available/sirh.conf /etc/nginx/sites-enabled/sirh.conf sudo nginx -t && sudo systemctl reload nginx ``` ### 8. Deployer ```bash ./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 ```bash 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) ```bash ./deploy.sh v0.1.60 ``` ### Avec rollback de migration ```bash # 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 ```bash 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 : ```bash 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`