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
- Non-root sudo operator és SSH key ellenőrzés root SSH kikapcsolása előtt.
deploy/private/.env.example→/opt/libre-webui/.env, mode0600, egyedi secrets,BLOB_QUOTA_BYTES_PER_USER.BLOB_QUOTA_RESERVATION_TTL_MSelhagyott reservationt egy óra alatt lejárat.- Worknél
DOCKER_GIDa/var/run/docker.socknumerikus csoportja. - Tunnel token
/opt/libre-webui/secrets/tunnel-token, mode0640vagy szigorúbb. - Cloudflare Access app teljes hostname-ra, 24h session, kívánt identities, Protect
with Access. Public healthhez külön
/health/livepolicy. Soha blanket Bypass. ENABLE_SIGNUP=false. Védelem után első local admin; üres DB egy bootstrap accountot enged. Registration csak szándékos ablakban.- 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:
- Running image ID és immutable reviewed digest.
libre-webui recovery-check, backup service és új verified archive/report.LIBRE_WEBUI_IMAGEdigest, pull és csaklibre-webuirecreate, data volume soha./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.