docs: design simplified Docker configuration

This commit is contained in:
2026-07-12 10:54:42 +02:00
parent 0b65135153
commit a6b195b8ae
@@ -0,0 +1,98 @@
# Design: configurazione Docker semplificata
## Obiettivo
Ridurre l'installazione a un file di configurazione `.env` interno al clone e a un solo file
contenente tutti i secret, mantenendo il comando operativo standard:
```sh
docker compose up --build -d
```
Il comportamento di default deve essere determinato dai file presenti nella directory radice
`ThothII/`, senza obbligare l'operatore a ricordare `-f`, `--env-file` o profili Compose.
## Struttura installativa
```text
ThothII/
├── .env # configurazione non segreta e default Compose
├── .env.example # template versionato
├── compose.yaml # file Compose principale, usabile senza -f
├── deploy/
│ ├── secrets/thothii.secrets # unico file secret, escluso da Git
│ └── workspaces/ # workspace YAML versionati
└── data/ # dati persistenti solo se bind mount esplicito
```
`.env` contiene host, endpoint, profilo scelto, `COMPOSE_FILE`, `COMPOSE_PROFILES` e il percorso
del bundle secret. Non contiene valori secret. Il file viene creato copiando `.env.example` e
rimane nella directory `ThothII/`.
Il bundle `deploy/secrets/thothii.secrets` usa righe `NOME=VALORE`, con nomi documentati e
validazione rigorosa. Non sono ammesse espansioni shell, comandi, URL con credenziali o righe
duplicate. Il file deve essere `0600` sull'host e viene montato read-only nei soli servizi che
ne hanno bisogno.
## Default Compose
`compose.yaml` diventa il file principale per il profilo applicativo esterno: `core` e
`frontend` non sono nascosti dietro un profilo obbligatorio. Il `.env` seleziona eventuali
overlay tramite la variabile Compose standard `COMPOSE_FILE` e il profilo tramite
`COMPOSE_PROFILES`.
Esempi:
- server con DWH/vector esterni: `COMPOSE_FILE=compose.yaml:deploy/compose.production.yaml`;
- Mac/Windows con pgvector locale: `COMPOSE_FILE=compose.yaml:deploy/compose.local-vector.yaml` e
`COMPOSE_PROFILES=local-vector`;
- preprocessing locale: aggiunta dell'overlay preprocess nel valore `COMPOSE_FILE`.
Quando `.env` è configurato, il comando non cambia tra i contesti:
```sh
docker compose up --build -d
```
I comandi con `-f` e `--env-file` restano documentati solo come override diagnostico, non come
percorso normale di installazione.
## Bundle secret e runtime
Il core riceve `THT_SECRETS_FILE=/run/secrets/thothii.secrets`. Un loader comune:
1. apre il bundle con `O_NOFOLLOW`, verifica owner, permessi e inode;
2. rifiuta chiavi sconosciute, duplicate, vuote o provider composti non supportati;
3. espone i singoli valori solo in memoria al componente che ne ha bisogno;
4. non stampa il bundle, non lo inserisce in `settings.json`, argv, health o log.
Per pgvector locale, il servizio di inizializzazione e le migrazioni usano lo stesso loader; non
si creano più file `bootstrap`, `reader`, `writer` e `migrator`. Le password non vengono passate
come argomenti URL. I workspace ricevono riferimenti logici al secret bundle, mai valori.
La compatibilità temporanea con le variabili `THT_*_SECRET_FILE` viene mantenuta come fallback
esplicito per installazioni già esistenti, ma il template e la documentazione nuovi usano solo
`THT_SECRETS_FILE`.
## Compatibilità e sicurezza
- `docker compose config --quiet` deve funzionare dalla radice senza opzioni aggiuntive;
- il default non deve avviare pgvector locale se il `.env` seleziona servizi esterni;
- i profili local-vector e preprocess devono aggiungere solo i servizi necessari;
- il bundle secret deve essere escluso da `.gitignore` e dai build context Docker;
- errori di secret mancanti o non validi devono terminare prima dell'avvio applicativo, con messaggi
sanitizzati;
- i test devono coprire sia il percorso standard `docker compose up --build -d` sia gli override
legacy con file secret separati.
## Verifica prevista
La verifica finale comprende:
1. rendering Compose del default e dei quattro preset `.env.example`;
2. test unitari del parser bundle e della compatibilità legacy;
3. build delle immagini core/frontend;
4. smoke health/SSE/persistenza;
5. smoke local-vector con un solo bundle e migrazioni;
6. smoke preprocess con il default selezionato dal `.env`;
7. controllo che nessun secret compaia in `docker compose config`, log, argv o immagini.