Docker
Docker è il metodo più semplice per una distribuzione in stile produzione su un singolo server.
Per un'installazione su un singolo server raggiungibile da Internet, inizia da
Distribuzione remota privata. Il relativo modello Compose
non pubblica porte dell'applicazione, usa per impostazione predefinita l'immagine main e aggiunge un limite esterno
Cloudflare Access, controlli dell'host, backup e limiti dei container.
Disponibilità di Work
Work è abilitato per impostazione predefinita nei file Compose del repository. L'immagine include la
CLI Docker e Compose monta /var/run/docker.sock, quindi i container delle attività Work
sono fratelli del container Libre WebUI. Compaiono in docker ps sull'host.
Un processo che accede a quel socket dispone di un controllo dell'host Docker equivalente a quello di root. Abilitare Work per impostazione predefinita è una scelta deliberata: Work è una funzionalità essenziale e non può funzionare senza accesso al daemon. La conseguenza è che ogni amministratore di Libre WebUI è di fatto un amministratore dell'host. Pianifica di conseguenza:
- Mantieni lo stack su un host i cui amministratori siano già persone fidate.
- Non esporre la porta pubblicata a una rete non attendibile.
- Rimuovi il mount di
/var/run/docker.sockquando Work non serve. La pagina Work segnalerà Runtime non disponibile.
Su Linux, il socket appartiene al gruppo docker invece che a root, quindi l'utente
non root dell'app richiede l'ID di quel gruppo. Impostalo una volta:
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
Leggilo attraverso un container come mostrato. Un host macOS segnala un valore diverso da quello visto dal container, perché Docker Desktop inoltra il socket tramite una VM. Se il gruppo è errato, la pagina Work indica il problema anziché non riuscire senza spiegazioni. Consulta Work: aree di lavoro isolate.
Le anteprime di Work e il Work Computer pubblicano porte casuali solo su
un'interfaccia privata dell'host. Con Docker Desktop bastano i valori
predefiniti di Compose: loopback dell'host per il bind e host.docker.internal
per la connessione del backend. Docker Engine nativo non riesce a raggiungere un
listener sul loopback dell'host da un container fratello: imposta invece il bind
sul gateway non pubblico del bridge Docker.
echo "WORK_PREVIEW_BIND=$(docker network inspect bridge \
--format '{{(index .IPAM.Config 0).Gateway}}')" >> .env
echo "WORK_DOCKER_PUBLISHED_HOST=host.docker.internal" >> .env
docker compose up -d --force-recreate libre-webui
I file Compose mappano host.docker.internal tramite host-gateway. Non usare
mai WORK_PREVIEW_BIND=0.0.0.0: pubblicherebbe su ogni interfaccia dell'host le
porte effimere delle attività, prive di autenticazione, invece di tenerle dietro
il proxy firmato di Libre WebUI.
Ollama incluso
Esegue Libre WebUI e Ollama in un unico stack Compose:
docker compose up -d
Apri http://localhost:8080.
Per impostazione predefinita, la porta della WebUI viene associata all'interfaccia di loopback dell'host. Imposta
WEBUI_BIND_ADDRESS=0.0.0.0 solo quando deve essere raggiunta da una LAN attendibile o da un proxy inverso
dell'host e limita la porta con il firewall dell'host.
Ollama rimane privato nella rete Compose. Per renderlo disponibile alle applicazioni dell'host tramite loopback, aggiungi l'override esplicito per l'host:
docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d
Imposta OLLAMA_BIND_ADDRESS solo quando Ollama deve essere raggiunto da un'altra macchina e
proteggi la porta con un firewall e un proxy dotato di autenticazione.
GPU NVIDIA
Usa il file Compose per GPU quando Docker dispone dell'accesso al runtime NVIDIA:
docker compose -f docker-compose.gpu.yml up -d
Se i modelli continuano a essere eseguiti sulla CPU, verifica l'accesso alla GPU dal container Ollama.
Ollama esterno
Usa questa configurazione quando Ollama è già in esecuzione sull'host o su un altro server:
docker compose -f docker-compose.external-ollama.yml up -d
Se necessario, sostituisci l'URL di Ollama:
OLLAMA_BASE_URL=http://192.168.1.10:11434 docker compose -f docker-compose.external-ollama.yml up -d
Work con socket isolato
I file Compose standard montano il socket Docker nel container Libre WebUI affinché Work possa eseguire i container delle attività; questo mount offre un controllo equivalente a quello di root dell'host Docker. Per mantenere Work senza assegnare il socket all'applicazione web, usa la variante con proxy del socket:
docker compose -f docker-compose.socket-proxy.yml up -d
Un proxy del socket su una rete interna detiene /var/run/docker.sock e
inoltra solo le sezioni API usate da Work (container, immagini, volumi,
reti, exec, info). Gli endpoint Swarm, secret, configurazioni, build e sistema
vengono negati dal proxy. Libre WebUI lo raggiunge tramite
DOCKER_HOST=tcp://docker-socket-proxy:2375: nessun mount del socket, nessun
DOCKER_GID, mentre il terminale interattivo e la diagnostica di sistema funzionano
senza variazioni. Consulta la documentazione sulle aree di lavoro per capire che cosa copre e
che cosa non copre questo limite.
Persistenza dei dati
Libre WebUI archivia i dati del backend in /app/backend/data all'interno del container. I file Compose montano quel percorso come volume con nome.
Anche l'immagine usa quel percorso per impostazione predefinita quando viene avviata direttamente con
docker run; l'area temporanea per la verifica preliminare del database rimane separata in
/app/backend/temp. Monta /app/backend/data ogni volta che il container potrebbe essere
ricreato.
Per la produzione, imposta secret stabili:
JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters
Esegui insieme il backup del volume dei dati e della chiave di cifratura.
Prima di rimuovere un container avviato direttamente e creato da un'immagine precedente,
verifica che esista /app/backend/data/.encryption_key oppure annota il valore configurato di
ENCRYPTION_KEY. Le immagini precedenti potevano scrivere una chiave generata automaticamente soltanto
nel livello del container; eliminando quel container si elimina anche l'unica chiave in grado
di decifrare il database persistente.
Se gestisci un runtime personalizzato che supporta Work, i file delle attività risiedono in volumi
Docker con nome separati e non sono inclusi nel normale backup di
/app/backend/data.
Accesso pubblico
I file Compose del repository associano la WebUI al loopback e impostano direttamente CORS_ORIGIN.
Un valore nel file .env o nella shell non sostituisce tale valore letterale. Modifica la
voce libre-webui.environment oppure salva un override esplicito come
compose.origin.yml:
services:
libre-webui:
environment:
CORS_ORIGIN: https://your-domain.example
BASE_URL: https://your-domain.example
Applica l'override insieme al file Compose del repository selezionato:
docker compose -f docker-compose.yml -f compose.origin.yml up -d
Quindi colloca Libre WebUI dietro HTTPS usando un proxy inverso o un bilanciatore di carico
della piattaforma. Imposta WEBUI_BIND_ADDRESS sull'interfaccia esatta richiesta dal proxy; non
pubblicare la porta su tutte le interfacce, a meno che non sia il firewall a richiederlo.
Il server distribuisce già in modo efficiente il frontend compilato: i bundle con hash sotto
/js/ e /assets/ vengono inviati compressi con brotli o gzip e con una durata di cache
immutable di un anno, mentre index.html e il service worker sono contrassegnati no-cache
così che una nuova release venga rilevata al caricamento successivo. Un proxy non deve
ricomprimere né memorizzare in cache questi percorsi; lascia passare Accept-Encoding.
Comandi utili
docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d