Files
ThothII/docs/reports/2026-09-14-server-embedded-omics-release.md
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

166 lines
7.9 KiB
Markdown

# Rilascio server ThothII embedded in Omics — 2026-09-14
## Esito
Il rilascio tecnico è stato eseguito il 2026-09-14 e i controlli automatici e
server-side descritti sotto sono superati. L'accettazione funzionale non è ancora
chiusa: lingua, tema, fullscreen, logout, ruoli e continuità SSE devono essere
provati da browser con account Omics autorizzati.
Finestra autorizzata dall'operatore e conclusa alle 16:17 CEST. Le ammissioni
ThothII sono state riaperte dopo il collaudo (`active: false`, `admissions: 0`).
## Revisioni e immagini distribuite
- ThothII, checkout operativo `/srv/thothii-v2/source/ThothII`:
`49333a2d35664b7237c3ddc2a9f10a605dcc84ce`, branch `main`, pulito e allineato
a `origin/main`.
- Omics Portal, checkout `/home/chirone/omics_portal`:
`fca10901a73666ca257d8f4cc4b77066295c400a`, branch `master`, pulito e due
commit avanti a `origin/master`. Include la consegna funzionale
`95154e179144e2453b37ef2a63a65d6f377e4cf8`.
- CLI nativo `/usr/local/bin/tht`: commit
`49333a2d35664b7237c3ddc2a9f10a605dcc84ce`, build
`2026-09-14T15:08:47+02:00`, `linux/amd64`.
- Core: `thothii-v2-core:49333a2d`, image ID
`sha256:d62bf17dd1345e6a459edabe4b559333b396ef30c523dedf1b842506c147efbd`.
- Frontend: `thothii-v2-frontend:49333a2d`, image ID
`sha256:dd57745143fc282562ec6d4c2cd8fc493eb2078494eeb17099d49bea8eae218b`.
- Omics web: `omics_portal-web`, image ID
`sha256:11e99905c41b38cd68d0e726f25a4174b8eb65db27fb1d887238a7bd255074da`.
- Nginx: image invariata `sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14`.
## Configurazioni modificate
- `deploy/psd-server-v2/thothii-installation.yaml`: Installation Model Catalog
schema v2; shell `embedded`, locale predefinito `en`, adapter `omics-portal`;
provider DeepSeek unificato e default interaction `zai/glm-5.3`. Percorsi,
profilo server, workspace, DWH e provider reali del server sono stati
preservati.
- `/srv/thothii-v2/operator/compose.portal-upstream.yaml`: `AUTH_MODE=upstream`,
alias `thothii-core` e `thothii-frontend` sulla rete Omics; eliminato il mount
della copia manuale di `config.js`. Nessun `auth.yaml` e nessuna runtime auth
projection.
- `/srv/thothii-v2/operator/operator.env`: tag applicativo aggiornato a
`49333a2d`; nessun valore segreto copiato dal Mac o riportato in questo report.
- `deploy/psd-server-v2/generated/`: proiezioni rigenerate dal descriptor. Il
frontend riceve in sola lettura `generated/frontend/config.js`, che espone
soltanto `backendBaseUrl: /api` e il contratto shell embedded.
- Omics: integrati template embedded, lingua Django, topbar/fullscreen, adapter
JavaScript, traduzioni e test della consegna GitHub.
- `nginx/nginx.conf`: non modificato. La configurazione già presente conteneva
l'`auth_request` Django, derivazione server-side degli header `X-Thoth-*`,
rimozione di cookie/Authorization/header client, origin esatta e SSE senza
buffering.
Configurazione risolta verificata:
- core e frontend usano le immagini `49333a2d`;
- `AUTH_MODE=upstream`;
- core senza porta host pubblicata;
- frontend pubblicato soltanto su `127.0.0.1:18020`;
- alias Omics risolti rispettivamente a `thothii-core` e `thothii-frontend`;
- `config.js` generated montato read-only;
- `THOTH_PUBLIC_EXPOSURE=false` e storage sessioni locale, preservando la
topologia server già approvata.
## Backup e rollback
Backup protetto:
`/srv/thothii-v2/backups/20260914-pre-embedded-release`, directory `0700`, tutti
i file `0600` e owner `root:root`.
Contiene:
- immagini applicative precedenti core/frontend/Omics;
- binario CLI precedente;
- descriptor, override, config manuale e proiezioni precedenti;
- bind `data`, `workspace-registry`, `pi-state`, `operator` e `secrets`;
- snapshot raw dei volumi catalogo, Qdrant ed embedding;
- dump logico PostgreSQL del catalogo ThothII;
- dump logico PostgreSQL del database usato da Omics;
- snapshot dei volumi statici e media Omics;
- `SHA256SUMS`.
Tutti i checksum sono risultati validi. Gli archivi tar sono stati elencati
integralmente senza errori e i due dump sono stati validati con
`pg_restore --list`. Le vecchie immagini restano disponibili; Omics precedente
è inoltre etichettata `omics_portal-web:pre-fca1090-aff75817`.
Non sono state eseguite migrazioni ThothII: tra `82e2c91f` e `49333a2d` non
esistono nuove migrazioni catalogo, Memory o sessioni. L'entrypoint Omics ha
eseguito `migrate` con risultato `No migrations to apply`. Il rollback normale
è quindi applicativo e non richiede ripristino dati; dump e snapshot raw sono
conservati per un recupero separato solo in presenza di corruzione accertata.
## Verifiche superate
### Prima del rilascio
- frontend ThothII: 768/768 test;
- backend auth/config/session/model: 205/205 test mirati;
- estensione Pi, lingua e ripresa: 7/7;
- harness lingua sessione e repository PostgreSQL: 24/24;
- CLI Go: tutte le package superate;
- Omics embedded shell isolata: 15/15;
- build delle tre immagini candidate completata;
- generazione delle proiezioni validata prima in staging isolato;
- build documentale strict completata dopo la scrittura di questo report.
### Sul server distribuito
- `tht status`: exit 0;
- `tht doctor --json`: `ok: true`, 13/13 controlli superati, inclusi descriptor,
proiezioni, permessi, Docker/Compose, autenticazione, health, HTTP, registry,
workflow e Pi;
- core, frontend, catalog-db, Qdrant, embedding e Omics web in stato healthy;
- `nginx -t` superato prima e dopo la ricreazione;
- catalogo Superset Omics valido: 32 dashboard;
- `migrate --check` post-rilascio: exit 0;
- nessun traceback, fatal, panic, HTTP 500 o errore nginx nei log recenti;
- pagina senza sessione: `302` verso `/accounts/login/`;
- `/datamart-builder/api/me` senza sessione: `403`;
- richiesta pubblica con header principal/admin falsificati: ancora `403`;
- `config.js`: `200`, `Cache-Control: no-store`, contenuto embedded corretto;
- manifest Vite risolto da Django: 368 entry; entrypoint corrente
`index-ktEFlKPi.js` e stylesheet `index-BtNkA4QL.css`;
- asset JavaScript attraverso `/datamart-builder/assets/`: `200` e cache
`public, immutable`;
- il core non ascolta sulla porta host 8787; dalla rete interna senza principal
risponde `401`;
- nginx risolve i nuovi indirizzi degli alias, senza dipendere dai precedenti IP
Docker.
Il probe HTTPS verso l'hostname pubblico, eseguito dal server stesso, è andato
in timeout prima della connessione (`HTTP 000`): è un limite di raggiungibilità
hairpin/rete e non viene contato come verifica superata. I probe equivalenti
attraverso nginx locale con Host e forwarded protocol reali sono invece passati.
È rimasto intenzionalmente intatto il container orphan storico
`omics_portal-web-run-a0bc36025e52`, creato circa tre mesi prima del rilascio ed
exited da due settimane; non è stato rimosso perché estraneo alla consegna.
## Prove manuali ancora necessarie
Usare account di prova autorizzati e dati non operativi:
1. utente Omics autorizzato apre Datamart Builder senza secondo login e vede un
solo header, quello Omics;
2. `/datamart-builder/api/me` restituisce issuer `portal`, subject Django stabile,
ruoli corretti e `session`/`csrfToken` null;
3. confronto utente normale/amministratore e rifiuto utente senza capability;
4. IT/EN prima dell'apertura e cambio tramite form Omics, senza tradurre SQL o
contenuti authored;
5. light/dark con popup, menu e griglia aperti;
6. ingresso/uscita fullscreen, compresa uscita con Esc e rifiuto browser;
7. logout Omics, seconda scheda e nuova verifica `/me`;
8. nuova sessione, flusso SSE, riconnessione dopo scadenza, reload senza avvio
automatico e ripresa con `interaction_language` invariata;
9. richiesta cross-origin autenticata su operazione fittizia e comportamento
distinto di un singolo `403` operativo;
10. accesso HTTPS reale da una postazione client, perché il server non raggiunge
l'hostname pubblico in hairpin.
L'installazione non va dichiarata funzionalmente accettata finché questa matrice
manuale non è stata eseguita e registrata.