docs: record server release and hand off remaining acceptance checks
Publish documentation / publish (push) Successful in 32s
Publish documentation / publish (push) Successful in 32s
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user