# 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`. ```powershell 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 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) ```bash sudo git clone /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 ```bash 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 `` 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 ` | | 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.