247 lines
14 KiB
Markdown
247 lines
14 KiB
Markdown
# Handoff — rilascio coordinato ThothII / Omics
|
||
|
||
**Rilasciato il 26 settembre 2026; accettazione automatica superata alle 19:35 Europe/Rome.**
|
||
Per riprendere, leggere il [report di esecuzione](2026-09-26-server-release-execution.md):
|
||
servizi avviati, maintenance inattiva, backup verificato e rollback disponibile.
|
||
La finestra era stata confermata esplicitamente dall’utente; non richiederla di
|
||
nuovo per completare il collaudo già autorizzato. Il 27 settembre l’utente ha
|
||
confermato accesso, controlli dell’interfaccia e avvio/interruzione/ripresa di una
|
||
sessione: collaudo funzionale positivo. Per le verifiche residue usare il
|
||
[nuovo handoff del 27 settembre](2026-09-27-server-acceptance-handoff.md), con
|
||
passi e registro delle prove. L’utente le ha affidate a un’attività successiva.
|
||
|
||
Usare lo script corretto documentato nel report: durante il rilascio è stata
|
||
corretta soltanto la lettura degli header Cache-Control ripetuti nel controllo.
|
||
Non rieseguire le fasi pre-deploy sullo stato già rilasciato.
|
||
|
||
## Snapshot storico della sospensione delle 17:40
|
||
|
||
Il resto di questo file conserva lo stato precedente alla ripresa e al rilascio.
|
||
Il report di esecuzione sostituisce le indicazioni operative e le attività residue
|
||
qui sotto; il [piano approvato](2026-09-26-server-release-plan.md) descrive le scelte.
|
||
|
||
## Prima azione alla ripresa
|
||
|
||
Leggere questo handoff, quindi `AGENTS.md`, `PROJECT_STATE.md`,
|
||
`docs/operations/server-codex-handoff.md`, `docs/install/authentication-upstream.md`
|
||
e `docs/testing/authentication-manual-acceptance.md`. Per l'inventario completo
|
||
e i digest delle immagini operative, leggere
|
||
`docs/reports/2026-09-26-server-release-preflight.md`.
|
||
Quel preflight è storico: la correzione proxy allora mancante è ora preparata e
|
||
testata **soltanto in isolamento**, come descritto sotto.
|
||
|
||
La prossima attività è **revisionare e completare lo script di rilascio in bozza**,
|
||
validare il piano senza mutazioni operative e presentarlo all'utente con backup
|
||
e rollback. Solo dopo la sua conferma eseguire le fasi operative e il collaudo.
|
||
|
||
## Richiesta dell'utente e confini
|
||
|
||
- Aggiornare ThothII e Omics secondo il runbook, preservando dati, workspace,
|
||
Pi, provider, modelli e credenziali già presenti sul server.
|
||
- Usare main ThothII includente `497ab84031e285464fdbb73e6e0ce9252687e3ab`;
|
||
conservare i progressi server Omics successivi alla consegna GitHub `fca10901…`.
|
||
- Conservare checkout sporchi e file locali. Nessun reset, force push, rimozione
|
||
volumi o `tht setup --complete`; non usare `codex/guided-standalone-install`.
|
||
- L'utente ha autorizzato preparazione, correzione e test isolati. Prima del
|
||
fermo/proxy/migrazioni/recreate operativi vuole vedere il piano risolto e
|
||
confermare la finestra. Il suo «procediamo, fai la tua parte» ha avviato la
|
||
preparazione, non approvato uno script ancora inesistente/incompleto.
|
||
- L'utente può fare il collaudo da browser: avvisarlo quando sarà il momento
|
||
e fornire prove precise. Non chiedergli password in chat.
|
||
- Ha autorizzato a cercare credenziali di `akadmin` / `mpancotti`: trovata solo
|
||
la presenza di `AUTHENTIK_BOOTSTRAP_PASSWORD` in
|
||
`/home/chirone/chirone-authentik/docker/.env`. Valore non mostrato, non copiato,
|
||
**nessun login tentato e validità attuale non verificata**. Nessuna password
|
||
mpancotti trovata. I due utenti sono locali Authentik, non LDAP.
|
||
|
||
## Stato operativo, invariato
|
||
|
||
- Checkout di lavoro `/home/chirone/Thoth`: main `497ab840…`, allineata Gitea;
|
||
il report `2026-09-14-server-embedded-omics-release.md` era già non tracciato.
|
||
Sono stati aggiunti solo i report locali di questa attività.
|
||
- Checkout ThothII operativo `/srv/thothii-v2/source/ThothII`: main
|
||
`b1723c34c467980d007094af078d966d460cde2b`, 30 file modificati + due non tracciati,
|
||
preservato integralmente. Le modifiche sono già recepite dalla nuova main,
|
||
che contiene anche le correzioni successive.
|
||
- Omics operativo `/home/chirone/omics_portal`: master pulito
|
||
`1cf7ea90a669a26bf3bc51749eab4d07981da472`. Comprende la consegna shell GitHub
|
||
`fca10901a73666ca257d8f4cc4b77066295c400a` e la correzione Superset successiva.
|
||
**Non ripetere l'integrazione e non tornare a fca10901.**
|
||
- Core ancora `thothii-v2-core:49333a2d-session-memory-fix`; frontend ancora
|
||
`thothii-v2-frontend:b1723c34-session-dialogs-20260914`; Omics web ancora
|
||
`omics_portal-web` image ID `sha256:27aa100690b110bf596322b1b0a31acc178ca9d1c709bc10382cbeecbfb5aeca`.
|
||
- Ultimo controllo: zero processi Pi RPC, maintenance `active=false`, admissions 0.
|
||
Ricontrollare alla ripresa e prima del fermo.
|
||
- Backup nuovo `/srv/thothii-v2/backups/20260926-coordinated-release` **non esiste**.
|
||
Backup storico 14 settembre verificato (14 checksum, tar e indici dump), non
|
||
un backup dello stato odierno, nessuna prova di restore eseguita.
|
||
|
||
## Installazione e preservazione comprovata
|
||
|
||
Descrittore effettivo, il cui **percorso va mantenuto** per preservare project identity:
|
||
`/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml`.
|
||
Project `thothii-7f901b48fe35`, schema 2, profile server, embedded/en/omics-portal,
|
||
upstream, session storage local, `THOTH_PUBLIC_EXPOSURE=false` già preesistente.
|
||
Non cambiare modalità auth o disattivare controlli per far partire l'app.
|
||
|
||
Preservati e confrontati:
|
||
|
||
- default interaction `zai/glm-5.3`;
|
||
- `deepseek/deepseek-v4-pro`, `deepseek/deepseek-v4-flash`;
|
||
- `local-qwen/qwen3.6-35b-a3b`;
|
||
- embedding `ollama/qwen3-embedding:0.6b`, dimensione 1024;
|
||
- `catalog.json`, `pi/models.json`, `pi/settings.json`, `frontend/config.js`:
|
||
proiezioni nuove **identiche byte per byte** a quelle operative;
|
||
- Compose candidato: environment, reti, porte, secret/config mount e mount
|
||
persistenti uguali. Solo due bind di script versionati identici cambiano
|
||
percorso seguendo il nuovo checkout (`catalog-db-init.sql`, `embedding-model-init.sh`).
|
||
|
||
Il CLI rifiuta correttamente i segreti se eseguito da UID diverso da 10001.
|
||
Per diagnostica usare UID 10001 con gruppi operator/Docker e DOCKER_CONFIG
|
||
leggibile; non cambiare ownership dei segreti. Esempio verificato:
|
||
|
||
```bash
|
||
sudo -n setpriv --reuid=10001 --regid=10001 --groups=1014,988 \
|
||
env DOCKER_CONFIG=/srv/thothii-v2/operator/releases/20260926-coordinated/docker-config \
|
||
/usr/local/bin/tht \
|
||
--installation /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml \
|
||
doctor --json
|
||
```
|
||
|
||
## Correzione proxy pronta, non applicata
|
||
|
||
Il proxy operativo è ancora vulnerabile: senza cookie,
|
||
`/datamart-builder/assets/api/me` con header `X-Thoth-Trusted-*` inventati
|
||
restituisce 200 e principal sintetico. API canonica restituisce 403.
|
||
Confermato anche via nginx HTTPS host con CA verificata e DNS locale.
|
||
Il test ha usato un soggetto inesistente, nessun dato reale o scrittura.
|
||
|
||
Causa: il prefisso pubblico degli asset inoltra alla radice del frontend,
|
||
che espone `/api/` e converte gli header Trusted in principal del core.
|
||
|
||
Correzione candidata Omics:
|
||
|
||
- branch `codex/thothii-assets-proxy-isolation`;
|
||
- commit locale **`928f7e9fff2aba895416776fecf5668ee957d237`**;
|
||
- parte da `1cf7ea90…`, nessun push eseguito;
|
||
- checkout stabile pulito:
|
||
`/srv/thothii-v2/releases/omics-928f7e9fff2aba895416776fecf5668ee957d237`;
|
||
- clone di lavoro: `/tmp/thothii-release-20260926/omics-source`;
|
||
- sei file cambiati: nginx, test statico, tre file di test dinamico, docs integrazione.
|
||
|
||
Il filtro accetta solo file Vite con hash ed estensioni previste, alla radice
|
||
o sotto `assets/` per compatibilità. Le route pubbliche config/asset rimuovono
|
||
Cookie, Authorization e tutte le famiglie di header identità; solo GET/HEAD.
|
||
Il frontend attuale emette file alla **radice**, non tutti in `assets/`:
|
||
il primo filtro eccessivamente stretto è stato corretto grazie al test reale.
|
||
|
||
Test completati:
|
||
|
||
- test dinamico nuovo riproduceva il difetto prima della correzione;
|
||
- **6/6** test della catena nginx Omics → nginx frontend reale → core/Django
|
||
sintetici, rete Docker interna, senza porte host o volumi operativi;
|
||
- verificati traversal codificati, canonical auth, Origin esatta, config,
|
||
tutti i file del manifest reale, diniego scritture alle route statiche;
|
||
- gli stessi **6/6** passano anche con l'immagine frontend precedente:
|
||
il rollback può e deve mantenere la correzione del proxy;
|
||
- suite Omics shell/auth/nginx/Superset **28/28** dopo la modifica;
|
||
- nessun container/rete `omics-proxy-check-*` rimasto al momento della sospensione.
|
||
|
||
Esecuzione test ripetibile, solo se necessaria per nuove modifiche:
|
||
|
||
```bash
|
||
cd /srv/thothii-v2/releases/omics-928f7e9fff2aba895416776fecf5668ee957d237
|
||
THOTHII_TEST_FRONTEND_IMAGE=thothii-v2-frontend:497ab840-preflight \
|
||
OMICS_TEST_IMAGE=omics-portal:proxy-isolation-tests \
|
||
OMICS_TEST_NGINX_IMAGE=sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14 \
|
||
python3 test_support/thothii/run_proxy_integration.py
|
||
```
|
||
|
||
## Artefatti pronti e bozza da revisionare
|
||
|
||
Directory stabile: `/srv/thothii-v2/operator/releases/20260926-coordinated`.
|
||
Contiene:
|
||
|
||
- `descriptor.next.yaml`: cambia soltanto projectDirectory verso la nuova main
|
||
e il percorso del suo overlay git-ssh; modelCatalog/auth/shell/workspace invariati.
|
||
- `operator.next.env`: cambia soltanto tag immagini in `497ab840-preflight`.
|
||
- `compose.portal-upstream.next.yaml`: aggiorna anche il tag frontend letterale,
|
||
che non seguiva la variabile del core.
|
||
- `baseline.json`: hash protetti dei file operativi per rilevare drift prima
|
||
della finestra; non contiene valori segreti.
|
||
- `compose-preservation.json`: esito positivo del confronto Compose candidato.
|
||
- `tht.next`: nuovo binario non installato; SHA256
|
||
`0d39a93fb0a3b2147541a746c75832db20302f3a604bf6510da69d3731bcd783`.
|
||
- `nginx.safe.conf`: copia della configurazione candidata testata.
|
||
- `proxy-green.log`, `proxy-rollback-test.log`, `omics-proxy-tests.log`.
|
||
- **`release.DRAFT.py`**: bozza appena scritta, **non revisionata, non compilata,
|
||
non eseguita neppure in modalità check**. Non lanciarla prima di una revisione
|
||
completa e della conferma della finestra per le fasi mutanti.
|
||
|
||
Originale della bozza: `/tmp/thothii-release-20260926/release.py`.
|
||
Non trattare il flag `--window-confirmed` come un'approvazione dell'utente.
|
||
|
||
Sorgenti ThothII pronti, main pulita e fetch Gitea con divergenza 0/0:
|
||
`/srv/thothii-v2/releases/497ab84031e285464fdbb73e6e0ce9252687e3ab`.
|
||
Vecchio checkout dirty lasciato al suo posto per rollback.
|
||
|
||
Immagini candidate già costruite, non distribuite:
|
||
|
||
- core `thothii-v2-core:497ab840-preflight`,
|
||
`sha256:182f4e0d63404cb7ed6a0e272441e9c55ed27e2bb16fdbf4d7162f892ac76dc7`;
|
||
- frontend `thothii-v2-frontend:497ab840-preflight`,
|
||
`sha256:5f5a4f81139432d0ac41025c3006edaf1258b623ce388242700b1b20fcce6421`.
|
||
|
||
Test ThothII già superati: 782 frontend, 152 backend su Node 24.16, 31 browser,
|
||
build/typecheck core/frontend, build CLI e generazione isolata, doctor attuale 13/13.
|
||
Log in `/tmp/thothii-release-20260926`. La sottodirectory `generation` contiene
|
||
copie sensibili protette root:root 0600 sotto directory 0700: non pubblicarla.
|
||
|
||
## Lavoro residuo e criteri per avanzare
|
||
|
||
1. **Revalidare solo ciò che può essere cambiato** durante la pausa: immagini,
|
||
SHA/stato checkout operativo, configurazioni contro baseline, processi Pi,
|
||
migrazioni Omics pendenti e raggiungibilità. Se c'è drift, preservarlo e
|
||
aggiornare il piano prima di proseguire.
|
||
2. **Revisionare lo script DRAFT**, inclusi escaping del controllo processi Pi,
|
||
gestione errori/parzialità backup, health/readiness reale Omics (il suo
|
||
healthcheck verifica solo catalogo, non Gunicorn), generazione con UID corretto,
|
||
digest image vs container, conservazione proprietari e dati, rollout/rollback
|
||
della correzione proxy. Validare sintassi e fase read-only solo dopo revisione.
|
||
Aggiungere prove HTTPS locali, risoluzione alias dopo recreate e controllo
|
||
log redatto: la bozza non copre ancora integralmente il runbook.
|
||
3. **Finalizzare scelta lifecycle Omics.** La bozza mantiene l'esatta immagine
|
||
web operativa perché l'unica modifica applicabile è nginx (shell/Superset
|
||
già presenti); fa fast-forward del checkout al fix, stop/start web per backup
|
||
consistente e recreate nginx. Lo start riesegue il suo entrypoint, compresi
|
||
migrate/compilemessages/collectstatic. Spiegare questa scelta nel piano finale.
|
||
Se si decide di ricostruire web, il suo `.dockerignore` è minimale: creare un
|
||
contesto pulito, aggiungere il catalogo Superset reale valido, escludere segreti.
|
||
4. **Finalizzare backup odierno.** La bozza salva immagini/code/config, ferma
|
||
ingressi e applicativi dopo maintenance e controllo Pi, crea dump catalogo
|
||
e PostgreSQL Omics condiviso, ferma supporti ThothII per snapshot raw coerenti,
|
||
archivia bind/volumi e verifica checksum/tar/indici dump. Valutare spazio e
|
||
interruzioni; il vecchio backup verificato non basta. Il DB Omics è condiviso
|
||
(`postgres` su `supabase-db`, app in `kokoro`, metadata in `chirone_meta`):
|
||
un restore dell'intero DB non fa parte del rollback ordinario.
|
||
5. **Presentare piano risolto, comandi, backup e rollback all'utente**, chiedendo
|
||
conferma della finestra. Solo allora installare CLI/config, generare proiezioni,
|
||
ricreare le app e applicare nginx. Nessuna migrazione nuova rilevata finora.
|
||
6. **Collaudare e poi coinvolgere l'utente.** Login unico, `/me` e ruoli,
|
||
IT/EN, tema/fullscreen, logout/seconda scheda, sessione fittizia con Pi/SSE,
|
||
stop/save/ripresa e lingua immutabile, diniego cross-origin autenticato,
|
||
Database/Memory/Evidence e accesso HTTPS da postazione esterna.
|
||
|
||
Rollback: ripristinare immagini ThothII, CLI, descriptor/env/override e
|
||
proiezioni salvati; preservare dati e **mantenere il fix proxy**, già testato
|
||
col frontend precedente. Ripristinare il vecchio nginx riaprirebbe il bypass.
|
||
Nessun restore dati automatico, reset Git o eliminazione volumi.
|
||
|
||
## Ambiente strumenti
|
||
|
||
La sandbox exec fallisce prima dell'avvio (`bwrap: loopback … Operation not
|
||
permitted`): i comandi sono stati eseguiti con `require_escalated` e motivazione.
|
||
Auto-review li ha consentiti; nessun rifiuto pendente. Non sono stati usati
|
||
subagenti. Skill applicate: `diagnosing-bugs`, `writing-for-agents` per questo handoff.
|
||
Nessun goal formale attivo. Per lo stato successivo alla ripresa, usare il piano revisionato collegato in apertura.
|