Sari la conținutul principal

Docker

Docker este cea mai simplă instalare de tip producție pentru un singur server. Pentru un server accesibil de pe Internet, începeți cu Instalare privată la distanță, care nu publică porturi și adaugă Cloudflare Access, protecții pentru host, backup-uri și limite pentru containere.

Disponibilitatea Work

Work este activat implicit în fișierele Compose ale repository-ului. Imaginea include Docker CLI, iar Compose montează /var/run/docker.sock, astfel încât containerele Work sunt surori ale containerului Libre WebUI și apar în docker ps pe host.

Accesul la socket oferă control asupra host-ului echivalent cu root. Fiecare administrator Libre WebUI este, practic, administrator al host-ului. Folosiți un host de încredere, nu expuneți portul unei rețele nesigure și eliminați mount-ul dacă Work nu este necesar; pagina va afișa atunci Runtime unavailable.

Pe Linux, utilizatorul aplicației are nevoie de ID-ul grupului socket-ului. Imaginea implicită este main; salvați DOCKER_GID în .env, iar grupul Linux se numește docker.

echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env

Citiți valoarea din interiorul unui container. Un host macOS raportează altă valoare din cauza VM-ului Docker Desktop. Dacă grupul este greșit, Work indică problema. Consultați Work: spații izolate.

Previzualizările Work și Work Computer publică porturi aleatorii doar pe o interfață privată a host-ului. Docker Desktop funcționează cu valorile implicite din Compose: loopback-ul host-ului pentru bind și host.docker.internal pentru conexiunea dinspre backend. Docker Engine nativ nu poate ajunge dintr-un container frate la un listener aflat pe loopback-ul host-ului, așa că setați bind-ul la gateway-ul nepublic al punții 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

Fișierele Compose mapează host.docker.internal prin host-gateway. Nu folosiți niciodată WORK_PREVIEW_BIND=0.0.0.0; ar publica porturi efemere de task neautentificate pe fiecare interfață a host-ului, în loc să le păstreze în spatele proxy-ului semnat al Libre WebUI.

Ollama inclus

docker compose up -d

Deschideți http://localhost:8080. Portul WebUI este legat implicit la loopback. Setați WEBUI_BIND_ADDRESS=0.0.0.0 numai pentru un LAN de încredere sau un reverse proxy și restricționați portul cu firewall-ul host-ului.

Ollama rămâne privat în rețeaua Compose. Pentru acces de la aplicațiile host-ului prin loopback:

docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d

Setați OLLAMA_BIND_ADDRESS numai dacă alt sistem trebuie să acceseze Ollama și protejați acel port.

GPU NVIDIA

docker compose -f docker-compose.gpu.yml up -d

Verificați accesul GPU din containerul Ollama dacă modelele rulează încă pe CPU.

Ollama extern

docker compose -f docker-compose.external-ollama.yml up -d

Suprascrieți URL-ul Ollama dacă este necesar:

OLLAMA_BASE_URL=http://192.168.1.10:11434 docker compose -f docker-compose.external-ollama.yml up -d

Work cu socket izolat

Pentru Work fără socket brut în aplicația web:

docker compose -f docker-compose.socket-proxy.yml up -d

Un proxy intern păstrează /var/run/docker.sock și transmite numai containere, imagini, volume, rețele, exec și info. Refuză swarm, secrets, configs, build și system. Libre WebUI îl folosește prin DOCKER_HOST=tcp://docker-socket-proxy:2375, fără socket sau DOCKER_GID. Terminalul și diagnosticarea funcționează la fel. Proxy-ul restrânge API-ul, dar nu oferă izolare completă între chiriași, deoarece crearea containerelor poate face bind-mount pentru căi ale host-ului.

Persistența datelor

Datele backend sunt în /app/backend/data, iar Compose montează calea ca volum nominalizat. Un docker run direct folosește aceeași cale, cu preflight-ul temporar în /app/backend/temp. Montați întotdeauna /app/backend/data când containerul poate fi recreat.

În producție, setați secrete stabile:

JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters

Salvați împreună volumul și cheia de criptare. Înainte de a șterge un container vechi, verificați /app/backend/data/.encryption_key sau păstrați valoarea ENCRYPTION_KEY; imaginile vechi puteau salva singura cheie doar în layer-ul containerului. Fișierele Work din volume separate nu sunt incluse în backup-ul obișnuit.

Acces public

Fișierele Compose leagă WebUI la loopback și setează direct CORS_ORIGIN. Editați libre-webui.environment sau creați compose.origin.yml:

services:
libre-webui:
environment:
CORS_ORIGIN: https://your-domain.example
BASE_URL: https://your-domain.example
docker compose -f docker-compose.yml -f compose.origin.yml up -d

Apoi puneți Libre WebUI în spatele unui reverse proxy HTTPS și setați WEBUI_BIND_ADDRESS la interfața exactă necesară proxy-ului.

Serverul livrează deja eficient frontend-ul compilat: pachetele cu hash din /js/ și /assets/ sunt trimise comprimate brotli sau gzip, cu o durată de cache immutable de un an, în timp ce index.html și service worker-ul sunt marcate no-cache, astfel încât o versiune nouă să fie preluată la următoarea încărcare. Proxy-ul nu trebuie să recomprime sau să pună în cache aceste căi; transmiteți mai departe Accept-Encoding.

Comenzi utile

docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d

Documentație asociată