# 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.