docs: record server release and hand off remaining acceptance checks
Publish documentation / publish (push) Successful in 32s

This commit is contained in:
User
2026-09-27 00:41:37 +02:00
parent 497ab84031
commit 2f53512e4d
7 changed files with 1119 additions and 1 deletions
@@ -0,0 +1,285 @@
# ThothII / Omics — preflight server del 26 settembre 2026
Stato: **rilascio fermo al gate di isolamento del proxy**. Nessuna finestra
richiesta o autorizzata; nessun servizio fermato, ricreato o aggiornato, nessuna
migrazione e nessuna modifica di proxy, descrittore, credenziali, DWH o IdP.
Questo documento è un inventario e piano parziale, **non un piano eseguibile
di rilascio approvato**. Applicare il runbook `docs/operations/server-codex-handoff.md`.
## Blocco verificato
Senza cookie/sessione Omics:
| Ingresso | Richiesta | Risultato |
| --- | --- | --- |
| Nginx Omics, localhost:8080 con Host pubblico | `/datamart-builder/api/me` | 403 |
| Stesso ingresso, principal normalizzato inventato | `/datamart-builder/api/me` | 403 |
| Stesso ingresso, header `X-Thoth-Trusted-*` sintetici | `/datamart-builder/assets/api/me` | **200, JSON `/me` con identità sintetica e permesso** |
| Nginx TLS host, HTTPS con CA verificata e DNS locale | API canonica / percorso alternativo | 403 / **200** |
Il soggetto di prova era `release-probe-nonexistent`, con flag admin falso;
non sono stati usati utenti reali o richieste di scrittura. La risposta alternativa
conteneva issuer/subject, ruoli, permessi e session/CSRF null: non era il fallback HTML.
Causa circoscritta: la location pubblica `/datamart-builder/assets/` inoltra
qualsiasi suffisso alla radice del frontend. Il suffisso `api/me` raggiunge quindi
`/api/me` del frontend, che converte gli header Trusted in principal del core.
Quel percorso non attraversa `auth_request`. La configurazione Omics operativa e
quella della consegna mantengono questo percorso; la nuova immagine frontend
conserva l'endpoint `/api/`. Un aggiornamento di ThothII da solo non corregge il difetto.
Riproduzione non mutante, exit 1 sul difetto:
```bash
python3 /tmp/thothii-release-20260926/evidence/check-proxy.py
```
Serve una revisione candidata Omics del proxy che impedisca l'accesso alle API
attraverso gli asset e rimuova gli header di fiducia dai percorsi pubblici.
Va preparata dal codice server `1cf7ea90…`, collaudata in isolamento includendo
varianti dei percorsi, asset/manifest/config e dinieghi, quindi inclusa nel piano
da approvare **prima** del reload operativo. Nessuna correzione è stata applicata.
Non indebolire auth o Origin, né cambiare le identità degli utenti.
L'origine pubblica via DNS, dal server, va in timeout (HTTP 000, curl exit 28).
Il probe TLS con `--resolve …:443:127.0.0.1` è invece riuscito. Resta da verificare
il percorso completo dal client esterno/bilanciatore; non è attestato dal probe locale.
## Revisioni e conservazione delle modifiche
- Checkout di consegna `/home/chirone/Thoth`: branch `main`, HEAD e `origin/main`
`497ab84031e285464fdbb73e6e0ce9252687e3ab`, fetch Gitea eseguito, divergenza `0 0`;
entrambi gli ancestor richiesti (`497ab840…`, `0d2e573e`) presenti.
- All'inizio non era pulito: solo `docs/reports/2026-09-14-server-embedded-omics-release.md`
non tracciato. Quel file è stato conservato. Questo report è un ulteriore output locale.
- Copia pulita per test `/tmp/thothii-release-20260926/source`, branch `main`, stesso SHA;
clone locale senza hardlink e senza importare il report non tracciato.
- Checkout ThothII operativo `/srv/thothii-v2/source/ThothII`: branch `main`,
HEAD `b1723c34c467980d007094af078d966d460cde2b`, 30 file modificati e due file
non tracciati. Nessun aggiornamento/reset/stash eseguito in questo checkout.
Dei 32 file locali, 29 sono identici alla main approvata; le differenze negli
altri tre sono le nuove correzioni di main a `AppShell.tsx`, al suo test di
gestione sessioni e al test visuale dello scroll. Non occorre ricostruirle a mano.
- Omics `/home/chirone/omics_portal`: `master`, pulito e coincidente col riferimento
locale `origin/master`, HEAD `1cf7ea90a669a26bf3bc51749eab4d07981da472`.
Non è stato eseguito fetch di master: questa coincidenza non attesta il master remoto attuale.
- Fetch esplicito del branch GitHub `codex/thothii-embedded-shell`: esattamente
`fca10901a73666ca257d8f4cc4b77066295c400a`; contiene `95154e179144e2453b37ef2a63a65d6f377e4cf8`
ed è già antenato di HEAD Omics. **Non ripetere il merge e non tornare a fca10901.**
Il commit successivo corregge la risoluzione delle dashboard Superset rispetto
alla lingua. Gli 11 file verificati nel container (shell/auth e correzione
Superset) hanno hash uguali al checkout operativo.
- Il branch incompleto `codex/guided-standalone-install` non è stato usato;
`tht setup --complete` non è stato eseguito.
## Immagini effettivamente operative, non candidate
| Servizio | Tag | Image ID |
| --- | --- | --- |
| core | `thothii-v2-core:49333a2d-session-memory-fix` | `sha256:ff4c435abd67c57e1e91e6e560dae73e67350ca499a5aedca3ffa517b9f59ee0` |
| frontend | `thothii-v2-frontend:b1723c34-session-dialogs-20260914` | `sha256:d2ed3dec42f8a56536ebbc8d74f13892d4c42c9a7f2fb67c476ff39f43fe7af9` |
| Omics web | `omics_portal-web` | `sha256:27aa100690b110bf596322b1b0a31acc178ca9d1c709bc10382cbeecbfb5aeca` |
| Omics nginx | `nginx:alpine` | `sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14` |
| catalog-db | PostgreSQL 17.6 bookworm | `sha256:f3bd19c606e442c3d7bdfa8002e03fe260a1023351e0ea4598032022b68dd6e3` |
| qdrant | v1.18.2 | `sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c` |
| embedding | Ollama 0.32.0 | `sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a` |
Il frontend dichiara revision `b1723c34-working-tree`; core e Omics non hanno
label OCI revision. Perciò lo SHA esatto del sorgente baked del core non può
essere certificato dalla sola immagine: tag, ID e checkout sono evidenze distinte.
CLI operativo `/usr/local/bin/tht`, binario root:root 0755; non sostituito.
## Installazione, Compose e persistenza
Descrittore invariato:
`/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml`.
Schema 2, profile server, file 0600 owner UID/GID 10001, projectDirectory
`/srv/thothii-v2/source/ThothII`, envFile `/srv/thothii-v2/operator/operator.env`.
Shell già `embedded/en/omics-portal`. Project Compose `thothii-7f901b48fe35`.
Ordine dei file applicativi, ricavato dalle label dei container:
1. `/srv/thothii-v2/source/ThothII/compose.yaml`
2. `/srv/thothii-v2/source/ThothII/deploy/compose.server.yaml`
3. `/srv/thothii-v2/source/ThothII/deploy/compose.git-ssh.yaml`
4. `/srv/thothii-v2/operator/compose.portal-upstream.yaml`
5. `/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/generated/compose.models.yaml`
I supporti sono stati creati con i primi quattro file. Il percorso del descrittore
determina l'identità Compose nel CLI: mantenerlo anche usando in futuro una
directory sorgente pulita distinta. Non spostare il descrittore in un nuovo checkout.
L'override contiene un tag frontend letterale: il solo cambio di
`THTII_RELEASE_IMAGE_TAG` non aggiorna entrambe le immagini.
Core: `AUTH_MODE=upstream`, `THT_AUTH_CONFIG_FILE=/run/thothii-auth/upstream-disabled.yaml`,
nessuno dei due file auth (`auth.yaml`, `upstream-disabled.yaml`) presente;
directory host `/srv/thothii-v2/operator/auth`, nessuna runtime auth projection.
`THOTH_PUBLIC_EXPOSURE=false`, `THT_SESSION_STORAGE=local`: configurazione
preesistente, non modificata. Non è una prova di isolamento: il gate proxy è fallito.
Se si decide di impostare public exposure true, serve prima un piano separato
per storage sessioni PostgreSQL; non attivare l'overlay come falsa migrazione automatica.
Bind e archivi:
- `/srv/thothii-v2/data` → `/data`: settings, sessioni, artifact, indici e workspace secrets.
- Sessioni PSD: `/data/sessions/psd-clinical/{sessions,artifacts,indexes,memory}`;
snapshot catalogo `/data/sessions/psd-clinical/preprocessing/catalog-metadata.json`.
- `/srv/thothii-v2/workspace-registry` → `/data/workspace-registry`; workspace
`psd-clinical`, installation ID `psd-server-v2`. Evidence local archive
`/data/workspace-registry/repo/psd-clinical`.
- `/srv/thothii-v2/pi-state` → `/home/thoth/.pi`; auth provider read-only
`/srv/thothii-v2/secrets/pi-auth.json` → `/home/thoth/.pi/agent/auth.json`.
- Bundle `/srv/thothii-v2/secrets/thothii.secrets`; chiavi workspace SSH,
known-hosts e password catalogo in `/srv/thothii-v2/secrets/`, valori mai riportati.
- Generated catalog/Pi/frontend sotto il descrittore; `config.js` montato read-only.
- Catalogo e Memory autorevoli PostgreSQL nel volume
`thothii-7f901b48fe35_catalog-data`; indici derivati
`thothii-7f901b48fe35_qdrant-data`; modelli `thothii-7f901b48fe35_embedding-models`.
- Binding DWH diretto già operativo verso `host.docker.internal:5438`, utente
read-only `thoth_dwh_reader`. Nessuna query DWH o sincronizzazione avviata.
Omics: project `omics_portal`, file ordinati
`/home/chirone/omics_portal/docker-compose.yml`,
`/home/chirone/omics_portal/docker-compose.override.yml`, env `.env.docker`.
Volumi `omics_portal_static_volume` e `omics_portal_media_volume`; mount CA
`/etc/nginx/ssl/policlinicosandonato.it.fullchain.crt` read-only.
Database portale: `supabase-db`, database `postgres`, search_path `kokoro,public`,
endpoint host 5438. Non confonderlo con il DWH o col catalogo ThothII.
Il server PostgreSQL è condiviso: un eventuale restore dell'intero database
non è un rollback ordinario di Omics e richiede un piano separato.
Reti: core su `thothii-7f901b48fe35_thothii`, `omics_portal_omics_network`
(alias `thothii-core`) e `localllm_default`; frontend su prime due reti (alias
`thothii-frontend`). Nessuna porta host core; frontend `127.0.0.1:18020`.
Omics web solo porta interna 8000; nginx `0.0.0.0:8080`. TLS host nginx su 443
per `https://aritmolab.policlinicosandonato.it`, poi localhost:8080.
File host `/etc/nginx/sites-available/policlinicosandonato`, collegato in sites-enabled;
SSE canonico con buffering disabilitato e timeout 86400 su entrambi gli nginx.
La mappa Origin esatta HTTPS→HTTP è presente. Il tratto esterno non è verificato.
Inventario JSON filtrato completo (label, mount, reti, porte):
`/tmp/thothii-release-20260926/inventory.json`.
## Verifiche eseguite e candidati
- ThothII frontend: **782/782** test, build/typecheck riusciti.
- Browser isolato: **31/31** scenari visuali Playwright riusciti. Il primo
tentativo non aveva il binario Chromium; installato soltanto nello staging
`/tmp/thothii-release-20260926/browsers`, quindi suite rieseguita con successo.
- Backend: build/typecheck riusciti; **152/152** test mirati su Node 24.16 in
container senza rete o dati operativi. I tentativi host Node 23 fallivano
per Argon2 non disponibile; i primi container di test avevano UID/mount
incompleti. Il risultato valido è `backend-node24-tests.log`.
- Omics shell/auth/nginx isolati: **15/15**; regressioni Superset: **12/12**,
entrambe le esecuzioni con `--network none`, SQLite in-memory, nessun volume operativo.
- Omics operativo: `migrate --check` exit 0, catalogo Superset valido (32 dashboard),
`nginx -t` exit 0. Warning allauth deprecati presenti.
- CLI corrente: status exit 0, doctor **13/13**, maintenance `active=false`, admissions 0.
Il primo tentativo con sudo/root era rifiutato dal controllo ownership dei segreti.
Con UID 10001 e gruppi 1014,988, più DOCKER_CONFIG leggibile, nessun errore:
non mancavano credenziali e non sono stati cambiati permessi.
- CLI aggiornato costruito in `/tmp/thothii-release-20260926/cli/tht-linux-amd64`;
generazione riuscita su copie root:root 0600 in directory 0700
`/tmp/thothii-release-20260926/generation` (contiene copie sensibili, non pubblicare).
Proiezione frontend `/api`, shell embedded/en/omics-portal corretta.
- Immagine core candidata `thothii-v2-core:497ab840-preflight`:
`sha256:182f4e0d63404cb7ed6a0e272441e9c55ed27e2bb16fdbf4d7162f892ac76dc7`.
- Immagine frontend candidata `thothii-v2-frontend:497ab840-preflight`:
`sha256:5f5a4f81139432d0ac41025c3006edaf1258b623ce388242700b1b20fcce6421`.
Entrambe portano la revision OCI `497ab84031e285464fdbb73e6e0ce9252687e3ab`.
**Costruite, non distribuite**. Non è stata costruita una nuova immagine Omics operativa.
Log dei test e build in `/tmp/thothii-release-20260926/`; log Omics
`/tmp/omics-release-tests-20260926.log` e `/tmp/omics-release-superset-tests-20260926.log`.
Log browser: `/tmp/thothii-release-20260926/browser-tests.log`.
## Backup e rollback: stato e vincoli
Backup storico `/srv/thothii-v2/backups/20260914-pre-embedded-release`:
directory root:root 0700, file 0600. Verificati **14 checksum**, leggibilità di
sette archivi tar.gz e indice dei due dump con `pg_restore --list`: tutto exit 0.
**Non è stata eseguita una prova di restore e non è un backup dello stato odierno.**
Contiene anche dati condivisi/sensibili: accesso protetto, nessun contenuto mostrato.
Altri backup presenti: `20260914-session-memory-fix`, `20260914-session-dialogs`,
`memory-evidence-20260910`; non attestati dai controlli del primo backup.
Il nuovo punto di rollback andrà creato nella finestra, dopo gestione delle
sessioni in corso e quiescenza delle scritture dei due applicativi. Percorso
previsto `/srv/thothii-v2/backups/20260926-coordinated-release` (non creato).
Deve includere:
1. Binario CLI, descriptor/env/override/generated, checkout operativo dirty
completo o bundle Git + patch + file non tracciati, configurazioni Omics,
catalogo Superset runtime e configurazione nginx host; proprietari/permessi preservati.
2. Immagini attuali core/frontend/web/nginx per ID e checksum dell'archivio.
3. Bind data, registry, Evidence, Pi, secrets/settings e volumi static/media Omics.
4. Dump coerente del catalogo e backup portale con ambito esplicito rispetto
al database PostgreSQL condiviso; snapshot Qdrant/Ollama e, se richiesto,
snapshot raw catalogo **solo a database fermo**. Non archiviare un PGDATA live
come se fosse un backup consistente.
5. SHA256SUMS, elenco integrale archivi senza errori, `pg_restore --list` e
restore isolato prima di eventuali migrazioni non reversibili.
Fra il riferimento operativo core `49333a2d` e la main approvata non risultano
nuove migrazioni catalogo/sessioni; Omics `migrate --check` non segnala pendenti.
Rivalutare dopo l'eventuale nuova revisione proxy: nessuna migrazione autorizzata ora.
L'entrypoint Omics esegue anche `makemigrations`, `migrate`, creazione superuser,
`compilemessages`, `collectstatic`: non usarlo come test preliminare su dati operativi.
Il `.dockerignore` Omics è minimale: preparare un contesto di build pulito che
includa il catalogo valido ed escluda env/backup/segreti prima della build operativa.
Rollback applicativo previsto: ripristino della coppia core/frontend e Omics
sopra registrata, del CLI e dei file di configurazione/proiezione salvati,
con gli stessi project name, bind e volumi; ricreazione mirata delle sole app,
`nginx -t`, aggiornamento DNS/reload del proxy e collaudo accesso/manifest/SSE.
Non fare downgrade dati, restore dell'intero Supabase o cancellazioni di volumi.
**Il ritorno alla vecchia configurazione proxy ripristinerebbe il bypass noto:**
il rollback approvato deve conservare una chiusura di sicurezza verificata,
oppure mantenere indisponibile Datamart Builder fino alla correzione.
## Comandi ricostruiti e piano da completare
Queste funzioni ricostruiscono il lifecycle corrente; non sono state usate per mutazioni:
```bash
thoth_compose() {
sudo -n docker compose --project-name thothii-7f901b48fe35 \
--project-directory /srv/thothii-v2/source/ThothII \
--env-file /srv/thothii-v2/operator/operator.env \
-f /srv/thothii-v2/source/ThothII/compose.yaml \
-f /srv/thothii-v2/source/ThothII/deploy/compose.server.yaml \
-f /srv/thothii-v2/source/ThothII/deploy/compose.git-ssh.yaml \
-f /srv/thothii-v2/operator/compose.portal-upstream.yaml \
-f /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/generated/compose.models.yaml "$@"
}
omics_compose() {
docker compose --project-name omics_portal \
--project-directory /home/chirone/omics_portal \
-f /home/chirone/omics_portal/docker-compose.yml \
-f /home/chirone/omics_portal/docker-compose.override.yml "$@"
}
# Sola diagnostica, con identità del proprietario dei file protetti:
sudo -n setpriv --reuid=10001 --regid=10001 --groups=1014,988 \
env DOCKER_CONFIG=/tmp/thothii-release-20260926/docker-config \
/usr/local/bin/tht \
--installation /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml \
doctor --json
```
Prima di chiedere la finestra occorre risolvere il gate proxy, selezionare la
nuova revisione Omics, completare il contesto di build e il backup odierno,
e verificare il rollback che non riapra il bypass. La revisione ThothII pulita
può essere collocata in `/srv/thothii-v2/releases/497ab84031e285464fdbb73e6e0ce9252687e3ab`
senza modificare il checkout dirty; mantenendo invariato il percorso del
descrittore, il project name CLI resta uguale. Questo trasferimento e gli
aggiornamenti del descriptor/override non sono stati eseguiti.
Solo dopo questi prerequisiti presentare comandi finali risolti (nuovo CLI,
generazione, build/up mirati, proxy, verifiche e rollback) e chiedere conferma
della finestra. La sospensione attuale deriva dall'istruzione dell'operatore
e dal runbook: «Ferma il passaggio interessato se manca … un prerequisito;
non aggirare i controlli» e «Nessuna route diretta aggira il proxy».
Restano aperti tutti i gate reali con account Omics autorizzati: login unico,
ruoli/capability, tema/IT-EN/fullscreen, logout e seconda scheda, sessione di
prova e SSE/ripresa, rifiuto cross-origin autenticato, lettura amministrazione
e accesso HTTPS da client esterno. I test isolati non li sostituiscono.