Lewati ke konten utama

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.sock jika 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

Dokumentasi Terkait