50
This commit is contained in:
@@ -38,9 +38,10 @@ Reporter :
|
||||
## 2. Inscription « CABM Signatures - Back-office »
|
||||
|
||||
1. **Nom** : `CABM Signatures - Back-office` — mono-tenant.
|
||||
2. **Authentification** > plateforme **Web**, URI de redirection :
|
||||
2. **Authentification** > plateforme **Web** (surtout pas « Application monopage » : sinon erreur
|
||||
AADSTS9002325, car Laravel échange le code côté serveur), URI de redirection :
|
||||
- `https://signature.beziers-mediterranee.fr/auth/callback`
|
||||
- (dev Laragon) `https://addinoutlook.test/auth/callback`
|
||||
- (dev) `http://localhost:8000/auth/callback`
|
||||
3. **Certificats et secrets** > Nouveau secret client, durée 24 mois → `GRAPH_CLIENT_SECRET`.
|
||||
Créer un rappel GLPI deux mois avant l'expiration.
|
||||
4. **Autorisations de l'API** (Microsoft Graph) :
|
||||
|
||||
+37
-23
@@ -1,15 +1,22 @@
|
||||
# 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.
|
||||
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 (NAT) ──► serveur DMZ :HTTPS_PORT ──► signature_nginx ──► signature_app (PHP-FPM)
|
||||
└► signature_db (MariaDB)
|
||||
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`.
|
||||
@@ -28,42 +35,49 @@ git push -u origin main
|
||||
|
||||
| É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) |
|
||||
| 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** |
|
||||
|
||||
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 <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`.
|
||||
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.
|
||||
|
||||
Les fichiers `deploy.env`, `backend/.env`, `addin/.env` et la clé du certificat sont en `chmod 600` et ignorés par Git.
|
||||
`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.
|
||||
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.
|
||||
- **Test externe** (4G) : `https://signature.beziers-mediterranee.fr/up` → 200, `/addin/manifest.xml` → XML, puis `/admin` depuis le LAN.
|
||||
|
||||
## 4. Pilote DSI
|
||||
|
||||
@@ -95,6 +109,6 @@ puis mettre à jour le complément dans Applications intégrées. Une modificati
|
||||
| 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` |
|
||||
| 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.
|
||||
|
||||
Reference in New Issue
Block a user