Docker
Docker adalah penerapan bergaya produksi termudah untuk satu server.
Untuk pemasangan satu server yang dapat diakses internet, mulai dengan Penerapan Jarak Jauh Privat. Templat Compose tidak menerbitkan port aplikasi, memakai image main, dan menambahkan batas Cloudflare Access, kendali host, cadangan, serta batas kontainer.
Ketersediaan Work
Work aktif secara bawaan di berkas Compose. Image memuat Docker CLI dan Compose memasang /var/run/docker.sock, sehingga kontainer tugas Work adalah saudara kontainer Libre WebUI. Kontainer muncul di docker ps host.
Proses yang mengakses soket memiliki kendali setara root atas host Docker. Work aktif dengan sengaja karena merupakan fitur inti yang memerlukan layanan Docker. Akibatnya setiap administrator Libre WebUI pada praktiknya administrator host:
- Jalankan tumpukan pada host dengan administrator tepercaya.
- Jangan buka port ke jaringan tidak tepercaya.
- Hapus pemasangan
/var/run/docker.sockjika Work tidak diperlukan. Work melaporkan Runtime unavailable.
Di Linux, soket milik grup docker, bukan root; pengguna aplikasi memerlukan ID grup. Tetapkan sekali:
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
Baca melalui kontainer seperti contoh. Docker Desktop memproksikan soket melalui mesin virtual sehingga nilai macOS berbeda. Jika grup salah, Work menyebut masalahnya. Lihat Work: Ruang Kerja Terisolasi.
Pratinjau Work dan Work Computer menerbitkan port acak hanya pada antarmuka host privat. Docker Desktop bekerja dengan bawaan Compose: loopback host untuk bind dan host.docker.internal untuk koneksi backend. Docker Engine native tidak dapat menjangkau listener di loopback host dari kontainer saudara. Setel bind ke gateway bridge Docker yang non-publik sebagai gantinya:
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
Berkas Compose memetakan host.docker.internal melalui host-gateway. Jangan pernah memakai WORK_PREVIEW_BIND=0.0.0.0; itu akan menerbitkan port tugas sementara tanpa autentikasi di setiap antarmuka host, bukan menjaganya di balik proksi bertanda tangan Libre WebUI.
Ollama Terbundel
Menjalankan Libre WebUI dan Ollama dalam satu tumpukan:
docker compose up -d
Buka http://localhost:8080.
Port WebUI terikat ke loopback host. Tetapkan WEBUI_BIND_ADDRESS=0.0.0.0 hanya jika LAN tepercaya atau proksi balik memerlukan akses, lalu batasi dengan tembok api.
Ollama tetap privat dalam jaringan Compose. Untuk akses aplikasi host melalui loopback, tambahkan penimpaan:
docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d
Tetapkan OLLAMA_BIND_ADDRESS hanya jika komputer lain memerlukan Ollama dan lindungi port dengan tembok api serta proksi terautentikasi.
GPU NVIDIA
Gunakan berkas Compose GPU jika Docker memiliki runtime NVIDIA:
docker compose -f docker-compose.gpu.yml up -d
Jika model tetap di CPU, verifikasi akses GPU dari kontainer Ollama.
Ollama Eksternal
Gunakan saat Ollama sudah berjalan di host atau server lain:
docker compose -f docker-compose.external-ollama.yml up -d
Timpa URL jika perlu:
OLLAMA_BASE_URL=http://192.168.1.10:11434 docker compose -f docker-compose.external-ollama.yml up -d
Work dengan Soket Terisolasi
Berkas standar memasang soket agar Work menjalankan kontainer; ini memberi kendali setara root. Untuk mempertahankan Work tanpa memberi soket langsung, gunakan proksi:
docker compose -f docker-compose.socket-proxy.yml up -d
Proksi internal memegang /var/run/docker.sock dan meneruskan hanya bagian API Work (containers, images, volumes, networks, exec, info). Swarm, secrets, configs, build, system ditolak. Libre WebUI mengakses melalui DOCKER_HOST=tcp://docker-socket-proxy:2375 tanpa soket atau DOCKER_GID; terminal dan diagnostik tetap sama.
Persistensi Data
Libre WebUI menyimpan data backend di /app/backend/data dalam kontainer. Compose memasangnya sebagai volume bernama.
Image juga memakai jalur itu untuk docker run; pemeriksaan sementara berada di /app/backend/temp. Selalu pasang /app/backend/data jika kontainer dapat dibuat ulang.
Tetapkan rahasia stabil untuk produksi:
JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters
Cadangkan volume dan kunci bersama.
Sebelum menghapus kontainer image lama, pastikan /app/backend/data/.encryption_key ada atau simpan ENCRYPTION_KEY. Image lama mungkin menyimpan kunci otomatis hanya pada lapisan kontainer; penghapusan menghilangkan satu-satunya kunci dekripsi.
Berkas Work khusus berada di volume Docker lain dan tidak masuk cadangan /app/backend/data.
Akses Publik
Berkas Compose mengikat WebUI ke loopback dan menetapkan CORS_ORIGIN langsung. Nilai shell atau .env tidak menggantinya. Sunting libre-webui.environment atau buat compose.origin.yml:
services:
libre-webui:
environment:
CORS_ORIGIN: https://your-domain.example
BASE_URL: https://your-domain.example
Terapkan bersama berkas Compose:
docker compose -f docker-compose.yml -f compose.origin.yml up -d
Tempatkan Libre WebUI di belakang HTTPS dengan proksi balik atau penyeimbang. Tetapkan WEBUI_BIND_ADDRESS ke antarmuka yang tepat; jangan buka semua antarmuka tanpa kebutuhan tembok api.
Server sudah mengirim frontend hasil build secara efisien: bundel berhash di bawah /js/ dan /assets/ dikirim terkompresi brotli atau gzip dengan masa cache immutable satu tahun, sedangkan index.html dan service worker ditandai no-cache sehingga rilis baru terambil pada pemuatan berikutnya. Proksi tidak perlu mengompresi ulang atau menyimpan cache jalur tersebut; teruskan Accept-Encoding apa adanya.
Perintah Berguna
docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d