Ugrás a fő tartalomra

Privát távoli telepítés

Egy Docker hoston fut Libre WebUI, Ollama és Cloudflare Tunnel publikus portok nélkül. Cloudflare Access a külső identity boundary, Libre auth a belső. Work és Watchtower külön root-equivalent opt-in.

Egyreplikás solo: SQLite, helyi encrypted blobs, embedded vectors, local coordination és embedded worker közös data volume-on. Ne csináljon teamet .env selectorokkal. Teamhez docker-compose.team.yml és Worknél docker-compose.team.work.yml kell PostgreSQL/PGVector, versioned S3, Redis, external worker és gateway együtt.

Kiindulás: deploy/private/docker-compose.yml, default main:

LIBRE_WEBUI_IMAGE=ghcr.io/libre-webui/libre-webui:main

dev csak explicit development, nem kliensdefault.

Biztonsági modell

  • Cloudflare Access védi a teljes hostnevet, /api/* és WebSocket upgrade-ot. Nincs public bypass.
  • API current accountot, model lifecycle és Work admin DB role-t kér.
  • App, Ollama, SearXNG, cloudflared csak private Compose network, host port nélkül.
  • Bundled SearXNG ad opcionális web search, internal és admin aktiválásig inert. Állítsa SEARXNG_SECRET-et.
  • App non-root, read-only rootfs, no capabilities, no-new-privileges és limits.
  • Work override nélkül off; containerek read-only root, dropped caps, limits, volume, default-deny network.

Base stack nem mountol socketet. docker-compose.work-proxy.yml esetén internal proxy tartja és csak containers/images/volumes/networks/exec/info API-t enged; swarm, secrets, build, system tiltott. Appnak nincs socket/group. Proxy csökkenti surface-t, nem blast radiust: container create host pathot mountolhat. Hardening, nem multi-tenant isolation.

Raw docker-compose.work.yml/Watchtower arbitrary API és host control. Read-only mount nem teszi read-onlyvá az API-t. Backup helper raw socketet elutasít; migráljon proxyra.

Bootstrap

  1. Non-root sudo operator és SSH key ellenőrzés root SSH kikapcsolása előtt.
  2. deploy/private/.env.example/opt/libre-webui/.env, mode 0600, egyedi secrets, BLOB_QUOTA_BYTES_PER_USER. BLOB_QUOTA_RESERVATION_TTL_MS elhagyott reservationt egy óra alatt lejárat.
  3. Worknél DOCKER_GID a /var/run/docker.sock numerikus csoportja.
  4. Tunnel token /opt/libre-webui/secrets/tunnel-token, mode 0640 vagy szigorúbb.
  5. Cloudflare Access app teljes hostname-ra, 24h session, kívánt identities, Protect with Access. Public healthhez külön /health/live policy. Soha blanket Bypass.
  6. ENABLE_SIGNUP=false. Védelem után első local admin; üres DB egy bootstrap accountot enged. Registration csak szándékos ablakban.
  7. Turnstile hostname és exact TURNSTILE_EXPECTED_HOSTNAME.
cd /opt/libre-webui
docker compose config --quiet
docker compose up -d
docker compose ps

Work proxy:

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

Raw változat elérhető a fenti trust következményekkel.

Access mellett CLI test service tokent kér shell historyn kívül:

curl --fail --silent --show-error \
-H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \
-H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \
https://your-hostname.example/api/auth/system-info

Unauthenticated API 401:

curl --output /dev/null --write-out '%{http_code}\n' \
-H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \
-H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \
https://your-hostname.example/api/work/tasks

Host hardening

sshd drop-in és fail2ban. Előbb másik sudo session és sshd -t. UFW default deny, rate-limited SSH:

ufw default deny incoming
ufw default allow outgoing
ufw limit OpenSSH
ufw enable

Tartsa security update-et, kapcsolja ki X11/agent/TCP forwardingot dokumentált igény nélkül.

Backup és helyreállítás

Backup előtt read-only inventory a running containerben az exact version/env/volume miatt:

docker exec libre-webui \
libre-webui recovery-check --json --data-dir /app/backend/data

Exit 0 nincs blocker, 1 blocker JSON, 2 nem fut. Csak key fingerprint és secret-presence flags, érték soha. Tartsa a backuppal.

Dedicated encryption/signing keys exact image-dzsel, app volume-on kívül és protected helyre másolva:

install -d -m 0700 /etc/libre-webui/backup-keys
image_ref=$(docker inspect libre-webui --format '{{.Image}}')
docker run --rm --user 0:0 --read-only --network none --cap-drop ALL \
--security-opt no-new-privileges \
--mount type=bind,src=/etc/libre-webui/backup-keys,dst=/backup-keys \
--entrypoint /usr/local/bin/libre-webui "$image_ref" \
backup keygen \
--directory /backup-keys

Existing output elutasított. Kulcs elvesztése használhatatlanná teszi recovery proofot.

Scripts és timer:

install -d -m 0700 /var/backups/libre-webui
install -m 0750 deploy/private/libre-webui-backup \
/usr/local/sbin/libre-webui-backup
install -m 0750 deploy/private/libre-webui-restore \
/usr/local/sbin/libre-webui-restore
install -m 0644 deploy/private/libre-webui-backup.{service,timer} \
/etc/systemd/system/
systemctl daemon-reload
systemctl enable --now libre-webui-backup.timer

Maintenance override /etc/libre-webui/backup.env, nem app .env:

install -d -m 0750 /etc/libre-webui
install -m 0600 /dev/null /etc/libre-webui/backup.env

LIBRE_WEBUI_STACK_DIR, LIBRE_WEBUI_BACKUP_RETENTION_DAYS, LIBRE_WEBUI_CONTAINER_NAME, LIBRE_WEBUI_BACKUP_KEY_DIR, root/mode 0600.

LIBRE_WEBUI_BACKUP_DIR a systemd write boundaryt is változtatja. Miután LIBRE_WEBUI_BACKUP_DIR=/srv/backups/libre-webui van a backup.env fájlban:

install -d -m 0700 /srv/backups/libre-webui
systemctl edit libre-webui-backup.service
[Service]
ReadWritePaths=/srv/backups/libre-webui
systemctl daemon-reload
systemctl start libre-webui-backup.service

ReadWritePaths= nélkül ProtectSystem=strict blokkol.

Backup max hat óra. Helper host lockot vesz, csak futó appot állít le és quiesced volume-ról exact image-dzsel archivál. Signed manifest, operator-encrypted payload data/runtime/ secrets tartalommal, independent verification és atomic metadata. Read-only maintenance private writable /tmp tmpfs-sel, persistent plaintext nélkül. Másolja off-host.

Work proxynál recovery bizonyítja minden DB volume létezését. DOCKER_HOST alapján azonos live Compose proxy és egyetlen közös internal network actual attachmentsből. Compose project prefix miatt ne hardcodeolja. Csak archive container csatlakozik filtered proxyhoz raw socket nélkül; verification --network none. Missing/unexpected/external/ ambiguous/raw socket hiba stop/publish előtt.

Új volume teszt:

LIBRE_WEBUI_RESTORE_IMAGE="$image_ref" \
libre-webui-restore \
/var/backups/libre-webui/libre-webui-integrated-YYYYMMDDTHHMMSSZ.lwb \
libre-webui-restore-drill

Restore elutasít existing célt, disposable storage-ban validál, adatot másol és private runtime.json/secrets.json-t ír. Nem indítja live stacket. Inspect és isolated test.

Ollama újratölthető. Docker Work volumes, Kubernetes PVC és host folders külön snapshot/retention.

Frissítések

Stateful még mutable taggel. Base Compose kizárja Watchtowerből. Csak koordinált upgrade:

  1. Running image ID és immutable reviewed digest.
  2. libre-webui recovery-check, backup service és új verified archive/report.
  3. LIBRE_WEBUI_IMAGE digest, pull és csak libre-webui recreate, data volume soha.
  4. /health/ready, sign-in, history, document, Work smoke; hiba esetén rollback és állapot/backup megőrzés.

Manual host sequence, legújabb .lwb/.json ellenőrzéssel:

docker inspect libre-webui --format '{{.Config.Image}} {{.Image}}'
docker exec libre-webui \
libre-webui recovery-check --json --data-dir /app/backend/data
systemctl start libre-webui-backup.service
systemctl --no-pager --full status libre-webui-backup.service
ls -lt /var/backups/libre-webui/libre-webui-integrated-* | head

# Set LIBRE_WEBUI_IMAGE=ghcr.io/libre-webui/libre-webui@sha256:REVIEWED_DIGEST
# in the root-owned .env, then recreate only the application.
docker compose pull libre-webui
docker compose up -d --no-deps libre-webui
docker inspect libre-webui --format '{{.State.Health.Status}} {{.Image}}'

Watchtower override csak labeled sidecars:

docker compose \
-f docker-compose.yml \
-f docker-compose.watchtower.yml \
up -d

30 percenként Ollama/SearXNG, data/config volumes-ban. Nem frissít Libre/cloudflared/ proxy/sandboxot. Client main, experiment :dev, de ugyanaz manual backup-gated upgrade. Solo stacket ne kössön team persistence-hez; használjon teljes team topológiát.