Files
ThothII/docs/reports/2026-09-26-server-release-preflight.md
T
User 2f53512e4d
Publish documentation / publish (push) Successful in 32s
docs: record server release and hand off remaining acceptance checks
2026-09-27 00:41:37 +02:00

17 KiB

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:

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:

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.