openclaw fleet
openclaw fleet gestisce istanze OpenClaw complete denominate celle. Ogni cella dispone di un proprio Gateway, stato, credenziali, account dei canali, container e porta host accessibile solo tramite loopback. Utilizzare una cella per ogni confine di attendibilità tra tenant; non utilizzare un unico Gateway condiviso come confine multi-tenant in presenza di soggetti ostili.
Fleet è sperimentale. I nomi dei comandi, i flag, i formati di output e il profilo del container possono cambiare tra una versione e l’altra senza un periodo di deprecazione.
Fleet supporta Docker e Podman. L’immagine predefinita è ghcr.io/openclaw/openclaw:latest.
Fleet è testato su host Linux e macOS. Gli host Windows non sono attualmente testati.
Avvio rapido
fleet create stampa una sola volta il token Gateway generato insieme all’URL della cella. Archiviare immediatamente il token, quindi configurare gli account dei canali di ciascun tenant all’interno della relativa cella.
ID tenant
Gli ID tenant devono corrispondere a:../acme vengono rifiutati.
L’ID diventa parte del nome del container: openclaw-cell-<tenant>.
fleet create
Creare una cella e avviarla:
--env:
Opzioni di creazione
L’allocazione automatica seleziona la prima porta del registro inutilizzata pari o superiore a
19100. Fleet rifiuta gli ID tenant duplicati e le porte esplicite già assegnate a un’altra cella.
I riferimenti alle immagini vengono passati come un singolo argomento al runtime del container. I riferimenti vuoti e i valori che iniziano con - vengono rifiutati per impedire che un’immagine venga interpretata come un’opzione Docker o Podman.
L’endpoint Docker o Podman selezionato deve essere locale. Fleet rifiuta i contesti Docker remoti, gli endpoint DOCKER_HOST e i servizi Podman remoti prima di riservare una porta o creare lo stato locale. Gli host remoti per le celle non sono supportati.
Quando Fleet avvia una nuova cella, il comando di creazione attende fino a circa un minuto che il relativo Gateway risponda a /healthz. Se la cella non raggiunge uno stato integro, Fleet mantiene intatti il container e la riga del registro per fleet status, fleet logs o la rimozione esplicita. --no-start ignora questo controllo di integrità. Il token Gateway generato per una nuova cella non integra non viene perso: rimane nell’ambiente del container (docker|podman inspect) e, poiché la cella non ha ancora gestito traffico, fleet rm --force seguito da una nuova creazione è sempre un’alternativa sicura.
Blocco tramite digest
I comandi di creazione e aggiornamento accettano riferimenti a immagini bloccati tramite digest, come--image ghcr.io/openclaw/openclaw@sha256:<digest>. Fleet passa il riferimento all’immagine senza modificarlo a Docker o Podman, consentendo all’operatore di mantenere una cella su byte di immagine immutabili anziché su un tag variabile.
Il risultato della creazione include l’ID tenant, il nome del container, la porta host, il token Gateway e l’URL locale. Anche nell’output JSON, trattare il risultato come contenente informazioni riservate perché include il token.
Limiti del disco
--disk limita esclusivamente il livello scrivibile del container. Le directory di stato e autenticazione per tenant montate tramite bind rimangono nello spazio di archiviazione dell’host; utilizzare le quote di progetto del file system host quando anche tali directory richiedono un limite rigido.
Criteri per il traffico in uscita
Per Docker, mantenere la modalità bridge e applicare i criteri per il traffico in uscita mediante regole del firewall host, come la catena
DOCKER-USER.
fleet list
Elencare le celle in ordine di ID tenant:
Le righe del registro rimangono visibili quando Docker o Podman non è disponibile; solo lo stato attuale diventa
unknown.
fleet status
Esaminare una cella:
ok, failed o skipped. /healthz dimostra che il Gateway è attivo, non che ogni canale o Plugin configurato sia completamente pronto. Il probe viene ignorato quando non è disponibile un endpoint locale utilizzabile da controllare.
fleet logs
Trasmettere i log del container di una cella direttamente al terminale:
--follow senza considerare l’interruzione da parte dell’operatore come un errore del comando. L’output dei log viene inoltrato attraverso un filtro di oscuramento che sostituisce il token Gateway corrente della cella con <redacted> prima che qualsiasi contenuto raggiunga il terminale.
fleet logs non dispone di una modalità --json perché i log del container sono un flusso stdout/stderr non elaborato. Per gli script, limitare l’output con --tail e utilizzare il normale reindirizzamento della shell o le pipeline.
fleet start, fleet stop e fleet restart
Controllare una cella esistente con il runtime registrato:
fleet upgrade
Scaricare nuovamente l’immagine registrata e sostituire il container della cella:
--env. Lo stato montato sopravvive alla sostituzione del container; l’ambiente predefinito dell’immagine può cambiare con l’immagine di destinazione.
La sostituzione viene confermata solo dopo che il relativo Gateway risponde a /healthz sulla porta di loopback della cella, in conformità al contratto di integrità usato dal file Compose ufficiale. Una sostituzione che termina, entra in un ciclo di arresti anomali o non diventa integra entro circa un minuto viene rimossa e il container precedente viene ripristinato, così un’immagine non funzionante non rende indisponibile una cella operativa.
Il token del Gateway non viene intenzionalmente memorizzato nel registro di Fleet. Prima di rimuovere il vecchio container, Fleet ne legge l’ambiente e trasferisce OPENCLAW_GATEWAY_TOKEN nel container sostitutivo. Non rimuovere manualmente il vecchio container prima di un aggiornamento se il token non è disponibile altrove sotto il proprio controllo.
fleet backup e fleet restore
Eseguire il backup di una cella arrestata:
0600 e devono essere conservati come credenziali. Il backup rifiuta una cella in esecuzione affinché lo stato SQLite venga acquisito in modo coerente. Il ripristino rifiuta una cella in esecuzione a meno che non venga specificato --force, sostituisce solo lo stato di quel tenant, ruota il token del Gateway e stampa una sola volta il nuovo token. Fleet esegue il backup di un tenant alla volta; il backup di tutti i tenant è un’operazione separata dell’operatore.
Il ripristino richiede un container esistente e arrestato, poiché il profilo del runtime ottenuto dalla relativa ispezione fornisce i limiti, la mappatura dell’utente, la provenienza dell’ambiente e l’immagine per la sostituzione. Se il container registrato è stato rimosso esternamente, eseguire prima fleet rm <tenant> --force senza --purge-data, ricreare la cella con l’immagine prevista e --no-start, quindi riprovare il ripristino. La prima rimozione mantiene intatte entrambe le directory dei dati del tenant.
Entrambi i comandi accettano --max-bytes <bytes> per limitare i dati dei file archiviati o estratti ed entrambi applicano lo stesso limite fisso di un milione di segmenti di percorso dell’archivio, affinché gli archivi malevoli composti solo da metadati non possano esaurire gli inode dell’host e ogni backup accettato rimanga ripristinabile. Il backup accetta --out <path> ed entrambi i comandi supportano --json.
Gli archivi contengono esclusivamente file normali e directory. Il backup non segue né memorizza mai collegamenti simbolici, collegamenti fisici, socket o nodi di dispositivo; il numero di elementi ignorati viene riportato nel risultato. Il ripristino rifiuta gli archivi contenenti qualsiasi altro tipo di voce. Gli alberi di collegamenti simbolici ricreabili, come node_modules dell’area di lavoro, devono essere reinstallati all’interno della cella dopo un ripristino.
fleet doctor
Verificare tutte le celle o un singolo tenant senza modificare lo stato del runtime o del file system:
fleet rm
Rimuovere una cella arrestata dal runtime e dal registro mantenendo i dati del tenant:
--force:
--purge-data richiede --force. Prima dell’eliminazione ricorsiva, Fleet risolve entrambe le radici di proprietà di Fleet ed entrambe le directory per tenant. Ogni destinazione deve essere esattamente la directory terminale prevista per il tenant, trovarsi rigorosamente all’interno della propria radice e non essere un collegamento simbolico. Questi controlli di contenimento impediscono che un percorso del registro danneggiato o un collegamento simbolico tra tenant reindirizzi l’eliminazione altrove.
L’eliminazione definitiva può essere ritentata quando una directory del tenant nel percorso esatto previsto è già assente. Ciò consente a un’esecuzione successiva di completare la pulizia dopo un errore parziale del file system senza rendere meno rigorosi i controlli sui percorsi per le directory ancora esistenti.
Archiviazione e struttura dei container
Lo stato della cella e le chiavi di crittografia dei profili di autenticazione utilizzano percorsi host distinti per ciascun tenant nella directory di stato attiva di OpenClaw:/home/node/.openclaw. La seconda viene montata in /home/node/.config/openclaw, in conformità al montaggio della chiave di crittografia della configurazione Docker ufficiale. La chiave di crittografia non viene quindi esposta sotto il normale montaggio dello stato né inclusa quando viene eseguito il backup o condivisa solo la directory dello stato della cella. Entrambe le directory sopravvivono alla normale rimozione e all’aggiornamento; fleet rm --purge-data --force elimina entrambe dopo controlli di contenimento separati.
Prima del primo avvio, Fleet inizializza la configurazione della cella con gateway.mode=local, l’autenticazione tramite token, l’associazione LAN del container e le origini della Control UI per la porta host allocata. Il valore del token non viene scritto in tale configurazione, ma rimane nell’ambiente del container.
Fleet fissa i percorsi del container dell’immagine ufficiale con questi valori di ambiente:
L’immagine ufficiale usa per impostazione predefinita l’utente non root
node con UID 1000. Fleet mantiene scrivibili i montaggi bind privati 0700 senza renderli accessibili a tutti. Docker rootful esegue la cella con UID e GID dell’utente non root che lo invoca; Docker rootless usa l’UID 0 del container, che viene mappato all’utente host non privilegiato che effettua l’invocazione nello spazio dei nomi utente del daemon. Podman usa keep-id con l’UID e il GID di chi effettua l’invocazione. Quando Fleet viene eseguito come root con un runtime rootful, mantiene l’utente dell’immagine e assegna i file iniziali dei montaggi all’UID/GID 1000.
Sugli host SELinux, i montaggi Docker e Podman ricevono una rietichettatura privata :Z. Se si ripristinano o si spostano i dati della cella, mantenere i percorsi montati tramite bind scrivibili dall’utente effettivo del container. Il profilo è compatibile con la modalità rootless, ma Docker o Podman devono essere già configurati per il funzionamento rootless sull’host; Fleet non converte un daemon rootful in uno rootless.
Profilo di sicurezza
Fleet applica il seguente profilo a ogni cella:
Fleet non monta mai
/var/run/docker.sock, non usa --privileged né la rete host e non aggiunge funzionalità. Il bridge per cella costituisce un confine di separazione tra celle, non un firewall in uscita: le celle mantengono l’accesso alla rete in uscita necessario per provider e canali. Anteporre alla porta di loopback un proxy, un tunnel SSH o una configurazione tailnet adeguata alla distribuzione. http://127.0.0.1:<port> è direttamente raggiungibile solo dall’host di Fleet.
Questo profilo separa i container dei tenant, ma non protegge i tenant dall’operatore di Fleet, dall’amministratore del runtime dei container o da un host compromesso. Consultare Hosting multi-tenant per il modello di attendibilità completo e opzioni di isolamento più efficaci.
Gestione dei token
Per impostazione predefinita,fleet create genera un token del Gateway esadecimale di 32 caratteri crittograficamente casuale e lo stampa una sola volta nel risultato della creazione. Conservarlo nel gestore di segreti approvato ed evitare di acquisire nei log l’output della creazione.
--gateway-token inserisce un token personalizzato negli argomenti del processo locale, che potrebbero essere conservati nella cronologia della shell o visibili negli elenchi dei processi. Preferire il token generato, a meno che un flusso di lavoro esistente per la gestione dei segreti non richieda un valore fornito.
Il token e ogni valore passato con --env risiedono nell’ambiente del container. Fleet li scrive in un file di ambiente temporaneo con modalità 0600, passa a Docker o Podman solo il percorso di tale file e lo rimuove al termine del comando del runtime. I valori digitati esplicitamente in openclaw fleet create --gateway-token ... o --env KEY=VALUE possono comunque essere visibili negli argomenti del processo esterno openclaw e nella cronologia della shell.
I valori dell’ambiente del container non sono nascosti all’operatore host attendibile: gli amministratori di Docker o Podman possono leggerli tramite l’ispezione del container. La nota «mostrato una sola volta» di Fleet descrive il normale output della CLI, non la protezione da un amministratore dell’host.