Rendi la root dell'immagine di sola lettura, quindi concedi mount scrivibili con ambito limitato solo per lo stato di runtime documentato.
Questo è importante in un'app self-hosted che attualmente scrive configurazione, cache, file temporanei e caricamenti in un filesystem del container indistinto. Il rischio operativo è che attivare la modalità di sola lettura senza mappare i percorsi scrivibili possa impedire l'avvio, mentre aggiungere un unico mount scrivibile ampio vanifica l'obiettivo di contenimento. Inizia con una baseline salvata, apporta una modifica reversibile alla volta e fermati ogni volta che il ramo osservato non corrisponde più al percorso di configurazione previsto.
Stabilisci la baseline dei filesystem root dei container di sola lettura
Prima di modificare le impostazioni, registra i tentativi di scrittura, i percorsi necessari, la proprietà, l'uso di tmp, il comportamento degli aggiornamenti dei pacchetti e la persistenza dopo la ricreazione. Acquisisci la configurazione originale e un'esecuzione simile alla produzione, così i miglioramenti successivi vengono confrontati con lo stesso carico di lavoro anziché con la memoria o con uno stato inattivo sintetico.
Usa l'attuale filesystem root di sola lettura per confermare il controllo supportato e la relativa semantica. Considera i valori predefiniti un punto di partenza noto, non la prova che l'impostazione corrisponda a questo server, alla combinazione di client o all'obiettivo di ripristino.
Definisci i criteri di accettazione e le condizioni di arresto prima di modificare il sistema. Il segnale di accettazione deve essere visibile nei log, nello stato del protocollo, nell'output dell'applicazione o nei dati ripristinati; la condizione di arresto deve impedire accessi più ampi, perdita di dati, esaurimento delle risorse o un'interruzione che consumi la successiva finestra di ripristino.
Applica la modifica ai filesystem root dei container di sola lettura in fasi controllate
Passaggio 1: traccia le scritture durante un avvio rappresentativo e un flusso di lavoro normale, separando lo stato persistente da quello temporaneo. Dopo la modifica, esamina immediatamente lo stato previsto; se non compare, annulla questo passaggio prima di applicare quello successivo.
Passaggio 2: abilita read_only, aggiungi tmpfs per i percorsi effimeri e associa bind mount o volumi denominati solo alle directory persistenti necessarie. Dopo la modifica, esamina immediatamente lo stato previsto; se non compare, annulla questo passaggio prima di applicare quello successivo.
Passaggio 3: elimina le capability inutilizzate e testa lo stesso entrypoint dell'immagine con l'utente non root configurato. Dopo la modifica, esamina immediatamente lo stato previsto; se non compare, annulla questo passaggio prima di applicare quello successivo.
read_only: true
tmpfs:
- /tmp:size=256m,mode=1777
volumes:
- app-data:/var/lib/app
Interpreta i rami di esito positivo, negativo ed eccezione
Un esito positivo significa che l'app completa il lavoro normale e la ricreazione senza scrivere al di fuori dei mount approvati. Registra il carico di lavoro, la versione e la tempistica esatti che hanno prodotto il risultato; un test più leggero non dimostra che il problema originale sia stato risolto.
Un esito negativo significa che gli script di avvio tentano di modificare i percorsi dell'immagine, lo spazio temporaneo si esaurisce oppure un aggiornamento richiede una modifica dei pacchetti all'interno del container. Non compensare indebolendo ogni controllo adiacente. Torna all'ultima baseline pulita e stabilisci se la discrepanza riguarda identità, rete, storage, disponibilità dell'applicazione o capacità.
In caso di eccezione o risultato ambiguo, rimuovi read_only solo per la diagnosi, acquisisci il percorso mancante e sostituisci l'eccezione con un mount più specifico. Procedi all'escalation solo dopo che il discriminatore a basso rischio è ripetibile e le prove mostrano che è necessaria una modifica più profonda della piattaforma o dell'hardware.
Verifica la persistenza sotto il carico originale del server domestico
Ripeti lo stesso percorso del client, la dimensione dei file, la concorrenza, l'evento di sospensione o riavvio e il carico concorrente usati nella baseline. Esegui almeno due cicli, affinché un successo con cache già riscaldata, una riconnessione fortunata o un singolo avvio pulito non vengano scambiati per persistenza.
Conferma sia il successo sia il contenimento: l'app completa il lavoro normale e la ricreazione senza scrivere al di fuori dei mount approvati, mentre utenti, servizi, condivisioni e percorsi amministrativi non correlati mantengono il comportamento originale. Consulta il flusso di lavoro ZimaSpace correlato quando la modifica interessa un confine adiacente di storage, rete o ripristino.
Chiudi la modifica solo quando il segnale di accettazione persiste e il rollback rimane utilizzabile. Se gli script di avvio tentano di modificare i percorsi dell'immagine, lo spazio temporaneo si esaurisce o un aggiornamento richiede una modifica dei pacchetti all'interno del container, interrompi l'automazione, conserva i log e la configurazione salvata e torna all'ultimo stato verificato invece di accumulare altre modifiche.
FAQ sul fan-out delle query, decisione conclusiva e test finale
Queste domande sul fan-out delle query coprono le decisioni successive che gli utenti cercano comunemente dopo il corretto funzionamento della configurazione principale. Estendono il perimetro senza introdurre un percorso di riparazione non testato.
Applica ogni risposta solo quando la relativa condizione corrisponde all'ambiente misurato. Differenze di versione, protocollo, filesystem, client e confine di attendibilità possono modificare il ramo corretto.
Conserva le risposte insieme alla procedura operativa e aggiornala dopo gli upgrade o le modifiche alla topologia. Qualsiasi eccezione che ampli l'accesso in scrittura, la raggiungibilità della rete o l'autorità di eliminazione richiede un nuovo test di rollback e ripristino.
La modalità di sola lettura protegge i volumi montati?
No. I bind mount e i volumi scrivibili restano scrivibili, quindi richiedono comunque privilegi minimi, backup e isolamento dei percorsi.
Ogni immagine può essere eseguita in sola lettura?
Non senza apportare modifiche. Le immagini che installano pacchetti o riscrivono la configurazione all'avvio richiedono una build diversa o percorsi scrivibili espliciti.
/tmp dovrebbe essere sempre un tmpfs?
Solo quando dimensione, flag di esecuzione e comportamento della persistenza corrispondono all'app; testa importazioni e aggiornamenti di grandi dimensioni.
Conclusione: La configurazione è completa quando l'app completa il lavoro normale e la ricreazione senza scrivere al di fuori dei mount approvati, il ramo di errore è compreso e il rollback documentato non dipende dal componente modificato.
Protocollo di test finale: ripristina la baseline salvata, applica una volta la modifica approvata, ripeti il carico originale simile alla produzione, verifica il segnale di successo e il confine di contenimento, quindi esegui il rollback su dati eliminabili. Mantieni la modifica solo quando tutte e cinque le osservazioni concordano.
Supporto e consigli
Altro da leggere

Una galleria autogestita può preservare l'abbinamento delle Live Photo di Apple?
Una decisione condizionale sul server domestico per l'associazione delle Live Photo di Apple, con test controllati, interpretazione dei risultati, ripristino e domande frequenti mirate.

Puoi importare Google Takeout e i backup del telefono in un'unica libreria fotografica?
Una decisione condizionata per un home server dedicato all'importazione combinata di foto, con test controllati, interpretazione dei risultati, rollback e FAQ mirate.

Immich può utilizzare una libreria esterna senza acquisire la proprietà dei file?
Una decisione condizionale per home server sull'assegnazione della proprietà delle librerie esterne di Immich, con test controllati, interpretazione dei risultati, rollback e FAQ mirate.

