docs(beta): runbook portail aligné sur le déploiement prod réel (app.aivanov.eu)
- §0 nouveau : état réel (domaine app.aivanov.eu, NPM + Let's Encrypt Force SSL, APP_ENV=production, .env 600, cookie Secure confirmé live = fix 884661a en prod). - §1 : pré-requis EXE copié sur serveur + commande avec env prod chargé + vérif SHA via /api/v1/version avant diffusion. - §5 : sécurité indispensable marquée en place (HTTPS/secrets/cookie Secure ✅). - §5bis : dépôt modèles EDS/GLiNER préparé mais NON ACTIF (pack à compléter+tester). Vérifié live : /login 200 HTTPS, http→301, /api/v1/version 404 (pas encore publié). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,14 +8,32 @@ récupérer la GUI et d'activer sa licence.
|
|||||||
> C'est le niveau adéquat : le portail ne contient **aucune donnée patient**
|
> C'est le niveau adéquat : le portail ne contient **aucune donnée patient**
|
||||||
> (licences + compteurs agrégés uniquement). Pas besoin de VPN/IP allowlist.
|
> (licences + compteurs agrégés uniquement). Pas besoin de VPN/IP allowlist.
|
||||||
|
|
||||||
|
## 0. État réel du déploiement (2026-06-18, en place)
|
||||||
|
- Domaine public : **`app.aivanov.eu`** (DNS → `82.64.97.95`).
|
||||||
|
- App servie en tmux `app_aivanov_web` : `uvicorn app.main:app --host 0.0.0.0 --port 8088`,
|
||||||
|
`APP_ENV=production`, secrets forts dans `/home/dom/ai/app_aivanov/.env` (perms `600`).
|
||||||
|
SQLite `data/app_aivanov.db`, artefacts `data/artifacts`, clés licences `data/keys`.
|
||||||
|
- Reverse proxy **NPM** : proxy host `11` → `http://172.18.0.1:8088`, certificat
|
||||||
|
Let's Encrypt (exp. 2026-09-16), **Force SSL + HTTP/2 + Block Common Exploits** ON.
|
||||||
|
- Vérifié live : `http://…/login` → 301 HTTPS ; `https://…/login` → 200 ;
|
||||||
|
login admin → 303 `/admin`, **cookie `Secure` + `HttpOnly` + `SameSite=Lax`**
|
||||||
|
(le cookie Secure confirme que le fix `884661a` tourne — APP_ENV=production).
|
||||||
|
|
||||||
## 1. Publier l'installateur GUI comme artefact actif
|
## 1. Publier l'installateur GUI comme artefact actif
|
||||||
Sur le serveur portail :
|
**Pré-requis : l'EXE Windows doit d'abord être copié sur le serveur Linux** (il est
|
||||||
|
aujourd'hui sur la machine de build Windows, non diffusé). Une fois sur le serveur,
|
||||||
|
depuis `/home/dom/ai/app_aivanov` avec l'environnement prod chargé :
|
||||||
```bash
|
```bash
|
||||||
|
cd /home/dom/ai/app_aivanov
|
||||||
|
set -a; source .env; set +a # APP_ENV=prod + secrets → même DB que le serveur
|
||||||
python3 scripts/publish_artifact.py --version 2026.06.18.1203 \
|
python3 scripts/publish_artifact.py --version 2026.06.18.1203 \
|
||||||
--file /chemin/vers/Anonymisation-Setup.exe --active
|
--file /chemin/vers/Anonymisation-Setup.exe --active
|
||||||
```
|
```
|
||||||
(ou via le back-office admin → « Publier une version » : version, canal, fichier, « rendre active »).
|
(ou via le back-office admin → « Publier une version » : version, fichier, « rendre active »).
|
||||||
Le SHA-256 est recalculé côté serveur — **vérifier qu'il == `8B437346…DED2F`**.
|
Le script copie le fichier dans `data/artifacts/`, recalcule le SHA-256 côté serveur,
|
||||||
|
crée/active la version (canal `beta`) et **désactive** l'éventuelle version active précédente.
|
||||||
|
**Vérification après publication** (étape 4) : `GET /api/v1/version` doit renvoyer
|
||||||
|
`2026.06.18.1203` + SHA-256 **`8B437346…DED2F`**. Sinon, ne pas diffuser.
|
||||||
|
|
||||||
## 2. Créer / valider le compte client bêta
|
## 2. Créer / valider le compte client bêta
|
||||||
- Option A — auto-inscription : le client va sur `/register` (organisation, e-mail, mot de passe ≥ 8) → compte **en attente**.
|
- Option A — auto-inscription : le client va sur `/register` (organisation, e-mail, mot de passe ≥ 8) → compte **en attente**.
|
||||||
@@ -40,12 +58,12 @@ et **compteurs d'usage agrégés**. Le seul actif sensible = l'installateur publ
|
|||||||
et les actions admin. Le niveau adéquat est donc **HTTPS + login/mot de passe fort**,
|
et les actions admin. Le niveau adéquat est donc **HTTPS + login/mot de passe fort**,
|
||||||
pas un durcissement de banque.
|
pas un durcissement de banque.
|
||||||
|
|
||||||
**À faire avant exposition client (cheap, indispensable) :**
|
**Indispensable — état actuel (tout ✅ en place, cf. §0) :**
|
||||||
- **HTTPS** via reverse proxy (obligatoire). Le cookie de session passe
|
- **HTTPS** : ✅ NPM + Let's Encrypt, Force SSL ON. Cookie de session `Secure`
|
||||||
automatiquement en `Secure` dès que `APP_ENV` ≠ `dev`/`test` (fait — commit `884661a`).
|
automatiquement (`APP_ENV` ≠ `dev`/`test`, fix `884661a` qui tourne en prod).
|
||||||
- **Secrets forts** en variables d'environnement : `APP_SECRET_KEY`, `ADMIN_PASSWORD`
|
- **Secrets forts** : ✅ `APP_SECRET_KEY` + `ADMIN_PASSWORD` dans `.env` (`600`),
|
||||||
(ne **jamais** laisser les défauts dev `dev-change-me-INSECURE` / `change-me`).
|
défauts dev (`dev-change-me-INSECURE` / `change-me`) écartés. C'est le vrai point :
|
||||||
C'est le vrai point : un admin compromis pourrait publier un faux installateur.
|
un admin compromis pourrait publier un faux installateur.
|
||||||
|
|
||||||
**Déjà couvert / non bloquant :**
|
**Déjà couvert / non bloquant :**
|
||||||
- **CSRF** : le cookie est en `SameSite=Lax`, ce qui bloque déjà l'envoi du cookie
|
- **CSRF** : le cookie est en `SameSite=Lax`, ce qui bloque déjà l'envoi du cookie
|
||||||
@@ -58,6 +76,16 @@ pas un durcissement de banque.
|
|||||||
**Hygiène (non urgent) :** sortir l'e-mail admin par défaut (`dom@aivanov.fr`) du
|
**Hygiène (non urgent) :** sortir l'e-mail admin par défaut (`dom@aivanov.fr`) du
|
||||||
code source vers `.env`.
|
code source vers `.env`.
|
||||||
|
|
||||||
|
## 5bis. Dépôt modèles EDS/GLiNER (préparé, NON actif)
|
||||||
|
Arborescence de réception créée côté serveur (vide pour l'instant) :
|
||||||
|
- `data/depot/models/eds-pseudo-public/incoming/`
|
||||||
|
- `data/depot/models/gliner_multi_pii-v1/incoming/`
|
||||||
|
|
||||||
|
⚠️ **EDS-Pseudo et GLiNER restent NON ACTIFS** dans la bêta : ne les annoncer comme
|
||||||
|
disponibles qu'une fois le pack **complet ET testé** (chargement réel vérifié), pas
|
||||||
|
sur la simple présence d'un dossier. La GUI bêta tourne avec **CamemBERT-bio + règles/gazetteers**
|
||||||
|
uniquement (moteurs honnêtes). L'auto-download GUI des modèles = chantier séparé.
|
||||||
|
|
||||||
## 6. Données / RGPD
|
## 6. Données / RGPD
|
||||||
- Le portail ne reçoit **jamais** de contenu patient : uniquement licences, activations de postes, et **compteurs d'usage agrégés** (nb traitements/documents/pages).
|
- Le portail ne reçoit **jamais** de contenu patient : uniquement licences, activations de postes, et **compteurs d'usage agrégés** (nb traitements/documents/pages).
|
||||||
- Le dashboard admin « Utilisation par client » affiche ces compteurs (clients sans usage inclus, à 0).
|
- Le dashboard admin « Utilisation par client » affiche ces compteurs (clients sans usage inclus, à 0).
|
||||||
|
|||||||
Reference in New Issue
Block a user