Files
AggloSign/docs/02-deploiement.md
2026-09-30 17:06:16 +02:00

6.4 KiB

02 — Déploiement sur le serveur Debian DMZ

Cible : serveur Debian 13 existant en DMZ, déjà équipé de Docker, de Nginx Proxy Manager et d'autres applications. La stack « signature » est isolée : projet Compose signature, conteneurs signature_*, réseau signature_net, volumes dédiés, ports choisis parmi les ports libres. Elle ne touche à aucune autre application.

Internet ──443──► Stormshield ──► Nginx Proxy Manager (TLS wildcard) ──http──► signature_nginx ──► signature_app (PHP-FPM)
                                                                                                  └► signature_db (MariaDB)
signature_scheduler : synchro Graph toutes les 15 min + complète la nuit

TLS est terminé par Nginx Proxy Manager (NPM), qui porte déjà le certificat wildcard. La stack ne parle qu'en HTTP interne :

  • mode recommandé : signature_nginx est raccordé au réseau Docker de NPM, aucun port n'est publié sur l'hôte ;
  • mode de repli (NPM sur un autre hôte ou sans réseau Docker) : un port HTTP hôte est publié et NPM y pointe.

L'IP réelle des clients est transmise par NPM (X-Forwarded-For) et reprise par Nginx (set_real_ip_from) et par Laravel (TRUSTED_PROXIES) : le filtrage de /admin s'applique donc à l'IP du poste, pas à celle de NPM.

1. Pousser le projet dans le dépôt Git interne (poste de dev)

Le dépôt doit contenir le back-office complet (après install-backend.ps1), sans vendor, sans .env.

cd C:\laragon\www\AddinOutlook
git init -b main
git add .
git status            # vérifier : ni backend\.env, ni addin\.env, ni vendor, ni node_modules, ni certificats
git commit -m "Signatures CABM : lots 0 et 1"
git remote add origin <URL du dépôt interne>
git push -u origin main

2. Prérequis réseau

Élément Valeur
DNS public signature.beziers-mediterranee.fr → IP publique déjà publiée vers NPM
Stormshield aucun changement si le 443 public arrive déjà sur NPM
Filtrage entrant 443 depuis Internet vers NPM (OWA et Outlook mobile sont utilisés hors réseau)
Sortant serveur 443 vers login.microsoftonline.com, graph.microsoft.com + Docker Hub, npm, Packagist, dépôts Debian (build)
Vers le LAN aucun flux

3. Première installation (serveur)

sudo git clone <URL du dépôt interne> /opt/signature
cd /opt/signature
sudo ./deploy/deploy.sh

Le script, interactif :

  1. vérifie les prérequis et détecte le conteneur Nginx Proxy Manager et son réseau Docker ;
  2. propose de raccorder la stack à ce réseau (sinon, choisit un port HTTP libre sur l'hôte) et génère docker-compose.override.yml et deploy.env (mot de passe MariaDB aléatoire) ;
  3. demande les identifiants Entra (tenant, back-office, secret masqué, add-in) et les réseaux autorisés pour /admin ;
  4. génère backend/.env (production, TRUSTED_PROXIES), addin/.env (URL publiques) et docker/nginx/admin-allow.inc ;
  5. construit l'image (add-in compilé + back-office), démarre la stack, vérifie la configuration Nginx et attend /up ;
  6. initialise la base (tenant, template par défaut) et lance une synchro annuaire complète ;
  7. contrôle le manifeste et l'absence d'en-tête X-Frame-Options sur /addin, puis affiche la cible à saisir dans NPM.

deploy.env, docker-compose.override.yml, backend/.env, addin/.env et admin-allow.inc sont propres au serveur et ignorés par Git.

Proxy Host dans Nginx Proxy Manager

Champ Valeur
Domain Names signature.beziers-mediterranee.fr
Scheme / Forward Hostname / Port http / signature_nginx / 80 (mode recommandé) — ou l'IP et le port affichés par le script
Block Common Exploits oui
Websockets Support non
SSL certificat wildcard existant, Force SSL, HTTP/2, HSTS
Advanced rien ; surtout pas d'en-tête X-Frame-Options (Outlook charge /addin en iframe)

Pas besoin d'Access List NPM : /admin est déjà filtré par la stack (Nginx + Laravel) sur l'IP réelle du poste.

Ensuite :

  • Logo : sudo docker compose --env-file deploy.env cp logo-cabm.png app:/var/www/html/public/img/logo-cabm.png
  • Entra : ajouter l'URI https://signature.beziers-mediterranee.fr/auth/callback (plateforme Web) à l'inscription Back-office.
  • Test externe (4G) : https://signature.beziers-mediterranee.fr/up → 200, /addin/manifest.xml → XML, puis /admin depuis le LAN.

4. Pilote DSI

  1. Créer le groupe signature_pilote (membres DSI) et attendre la synchro.
  2. Centre d'admin M365 > Paramètres > Applications intégrées > Charger des applications personnalisées > Complément Office > Fournir le lien https://signature.beziers-mediterranee.fr/addin/manifest.xml.
  3. Affecter au groupe signature_pilote, puis retirer SignITC pour ces mêmes utilisateurs.
  4. Propagation : jusqu'à 24 h, parfois plus.
  5. Retirer le complément chargé manuellement (localhost) dans Outlook web des testeurs, pour éviter un doublon.

5. Mise à jour

cd /opt/signature && sudo ./deploy/deploy.sh

git pull, reconstruction, redémarrage ; migrations et caches rejoués au démarrage de signature_app. Un échec de migration n'empêche pas le conteneur de démarrer : il est signalé dans les logs.

Si le manifeste change (nouveaux événements, boutons), incrémenter <Version> dans addin/manifest.xml puis mettre à jour le complément dans Applications intégrées. Une modification de template ne demande aucune mise à jour.

6. Exploitation

Besoin Commande (dans /opt/signature)
Logs sudo docker compose --env-file deploy.env logs -f app scheduler nginx
Logs Laravel sudo docker compose --env-file deploy.env exec app tail -f storage/logs/laravel-$(date +%F).log
Artisan sudo docker compose --env-file deploy.env exec -u www-data app php artisan <commande>
Synchro manuelle bouton du tableau de bord, ou … exec -u www-data app php artisan signature:sync --full
Sauvegarde base sudo docker compose --env-file deploy.env exec -T db sh -c 'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE"' > signature-$(date +%F).sql
Supervision LibreNMS : HTTP(S) sur /up et expiration du certificat
Certificat géré par Nginx Proxy Manager (wildcard existant)

Sauvegarde : la VM est sauvegardée par Veeam ; ajouter le dump quotidien ci-dessus en tâche cron pour une restauration fine.