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_nginxest 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 :
- vérifie les prérequis et détecte le conteneur Nginx Proxy Manager et son réseau Docker ;
- 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.ymletdeploy.env(mot de passe MariaDB aléatoire) ; - demande les identifiants Entra (tenant, back-office, secret masqué, add-in) et les réseaux autorisés pour
/admin; - génère
backend/.env(production,TRUSTED_PROXIES),addin/.env(URL publiques) etdocker/nginx/admin-allow.inc; - construit l'image (add-in compilé + back-office), démarre la stack, vérifie la configuration Nginx et attend
/up; - initialise la base (tenant, template par défaut) et lance une synchro annuaire complète ;
- 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/admindepuis le LAN.
4. Pilote DSI
- Créer le groupe
signature_pilote(membres DSI) et attendre la synchro. - 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. - Affecter au groupe
signature_pilote, puis retirer SignITC pour ces mêmes utilisateurs. - Propagation : jusqu'à 24 h, parfois plus.
- 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.