Files
AggloSign/docs/02-deploiement.md
T
2026-09-30 16:27:32 +02:00

5.6 KiB

02 — Déploiement sur le serveur Debian DMZ

Cible : serveur Debian 13 existant en DMZ, déjà équipé de Docker et hébergeant 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 (NAT) ──► serveur DMZ :HTTPS_PORT ──► signature_nginx ──► signature_app (PHP-FPM)
                                                                                     └► signature_db (MariaDB)
signature_scheduler : synchro Graph toutes les 15 min + complète la nuit

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édiée (ou IP partagée dont le 443 est libre)
NAT Stormshield IP publique:443 → serveur DMZ:HTTPS_PORT (proposé par le script, 443 si libre, sinon 8443…)
NAT facultatif IP publique:80 → serveur DMZ:HTTP_PORT (redirection vers HTTPS)
Filtrage entrant 443 depuis Internet (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

Le NAT doit conserver l'IP source (pas de SNAT) : le filtrage de /admin repose sur l'IP du client. Si le Stormshield fait du SNAT, filtrer /admin au niveau du pare-feu.

3. Première installation (serveur)

sudo git clone <URL du dépôt interne> /opt/signature
cd /opt/signature
# Copier le certificat wildcard (PEM chaîne complète + clé) quelque part sur le serveur, puis :
sudo ./deploy/deploy.sh

Le script, interactif :

  1. vérifie les prérequis et détecte les ports déjà pris (système et conteneurs existants) ;
  2. propose les ports HTTPS/HTTP de la stack et génère deploy.env (mot de passe MariaDB aléatoire) ;
  3. installe le certificat dans docker/certs/ et vérifie que certificat et clé correspondent ;
  4. demande les identifiants Entra (tenant, back-office, secret masqué, add-in) ;
  5. génère backend/.env (production) et addin/.env (URL publiques) ;
  6. construit l'image (add-in compilé + back-office), démarre la stack, attend /up ;
  7. initialise la base (tenant, template par défaut) et lance une synchro annuaire complète ;
  8. contrôle le manifeste et l'absence d'en-tête X-Frame-Options sur /addin.

Les fichiers deploy.env, backend/.env, addin/.env et la clé du certificat sont en chmod 600 et ignorés par Git.

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. Les URI localhost de dev peuvent rester pour le poste de développement.
  • Test externe (4G) : https://signature.beziers-mediterranee.fr/up → 200, 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
Renouvellement certificat remplacer les fichiers de docker/certs/ puis sudo docker compose --env-file deploy.env restart nginx

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