Docker
Docker — найпростіший варіант розгортання в стилі виробничого середовища на одному сервері.
Для доступного з інтернету встановлення почніть із Приватного віддаленого розгортання. Його шаблон Compose не публікує порти програми, типово використовує образ main і додає зовнішню межу Cloudflare Access, контроль хоста, резервні копії та ліміти контейнерів.
Доступність Work
Work типово ввімкнено у файлах Compose репозиторію. Образ містить Docker CLI, а Compose підключає /var/run/docker.sock, тому контейнери завдань Work є сусідніми з контейнером Libre WebUI. Вони видимі в docker ps на хості.
Процес із доступом до сокета має контроль над Docker-хостом, еквівалентний root. Work увімкнено навмисно: це основна функція, яка не може працювати без доступу до демона. Наслідок: кожен адміністратор Libre WebUI фактично є адміністратором хоста. Ураховуйте це:
- Розміщуйте стек на хості, адміністраторам якого довіряєте.
- Не відкривайте опублікований порт недовіреній мережі.
- Вилучіть підключення
/var/run/docker.sock, якщо Work не потрібен. Сторінка Work повідомить Runtime unavailable.
У Linux сокет належить групі docker, а не root, тому непривілейованому користувачу програми потрібен ID групи. Задайте його один раз:
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
Зчитуйте значення через контейнер, як показано. Хост macOS повідомляє інше значення, ніж бачить контейнер, оскільки Docker Desktop проксіює сокет через віртуальну машину. За неправильної групи Work явно назве проблему. Див. Work: ізольовані робочі простори.
Попередній перегляд Work і Work Computer публікують випадкові порти лише на приватному інтерфейсі хоста. Docker Desktop працює з типовими значеннями Compose: loopback хоста для прив’язки та host.docker.internal для з’єднання з бекендом. Нативний Docker Engine не дістає до слухача на loopback хоста із сусіднього контейнера. Натомість задайте прив’язку на його непублічний шлюз мосту 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
Файли Compose відображають host.docker.internal через host-gateway. Ніколи не використовуйте WORK_PREVIEW_BIND=0.0.0.0: так неавтентифіковані тимчасові порти завдань потрапили б на кожен інтерфейс хоста замість того, щоб залишатися за підписаним проксі Libre WebUI.
Вбудована Ollama
Запускає Libre WebUI й Ollama в одному стеку Compose:
docker compose up -d
Відкрийте http://localhost:8080.
Порт WebUI типово прив’язаний до loopback хоста. Задавайте WEBUI_BIND_ADDRESS=0.0.0.0 лише для доступу довіреної LAN або зворотного проксі хоста й обмежуйте порт брандмауером.
Ollama залишається приватною для мережі Compose. Щоб надати її програмам хоста через loopback, додайте явне перевизначення:
docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d
Задавайте OLLAMA_BIND_ADDRESS тільки для доступу іншого комп’ютера й захищайте порт брандмауером і проксі з автентифікацією.
GPU NVIDIA
Використовуйте файл Compose GPU, якщо Docker має доступ до середовища NVIDIA:
docker compose -f docker-compose.gpu.yml up -d
Якщо моделі все ще працюють на CPU, перевірте GPU з контейнера Ollama.
Зовнішня Ollama
Використовуйте, якщо Ollama вже працює на хості або іншому сервері:
docker compose -f docker-compose.external-ollama.yml up -d
За потреби перевизначте адресу:
OLLAMA_BASE_URL=http://192.168.1.10:11434 docker compose -f docker-compose.external-ollama.yml up -d
Work з ізольованим сокетом
Стандартні файли Compose підключають сокет до контейнера Libre WebUI, щоб Work запускав завдання; це надає контроль над хостом, еквівалентний root. Щоб зберегти Work без прямого сокета у вебпрограмі, використовуйте варіант із проксі:
docker compose -f docker-compose.socket-proxy.yml up -d
Проксі у внутрішній мережі володіє /var/run/docker.sock і передає лише розділи API Work (containers, images, volumes, networks, exec, info). Кінцеві точки Swarm, secrets, configs, build і system заборонено. Libre WebUI підключається через DOCKER_HOST=tcp://docker-socket-proxy:2375 — без сокета й DOCKER_GID, а термінал і діагностика не змінюються. Документація робочих просторів пояснює можливості й обмеження межі.
Постійність даних
Libre WebUI зберігає дані серверної частини в /app/backend/data усередині контейнера. Compose підключає шлях як іменований том.
Образ також використовує цей шлях типово під час прямого docker run; тимчасові дані перевірки бази розташовані окремо в /app/backend/temp. Підключайте /app/backend/data, якщо контейнер може бути створений наново.
Для виробничого середовища задайте сталі секрети:
JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters
Копіюйте том даних разом із ключем шифрування.
До видалення безпосередньо запущеного контейнера зі старого образу переконайтеся, що існує /app/backend/data/.encryption_key, або запишіть ENCRYPTION_KEY. Старі образи могли зберегти автоматично створений ключ тільки в шарі контейнера; видалення контейнера видалить єдиний ключ для розшифрування постійної бази.
У нестандартному середовищі Work файли завдань містяться в окремих іменованих томах Docker і не входять до звичайної копії /app/backend/data.
Публічний доступ
Файли Compose репозиторію прив’язують WebUI до loopback і безпосередньо задають CORS_ORIGIN. Значення в оболонці чи .env не замінює цей літерал. Змініть libre-webui.environment або збережіть перевизначення як compose.origin.yml:
services:
libre-webui:
environment:
CORS_ORIGIN: https://your-domain.example
BASE_URL: https://your-domain.example
Застосуйте перевизначення разом із вибраним файлом Compose:
docker compose -f docker-compose.yml -f compose.origin.yml up -d
Потім розмістіть Libre WebUI за HTTPS зі зворотним проксі або балансувальником. Задайте WEBUI_BIND_ADDRESS точним інтерфейсом, потрібним проксі; не публікуйте порт на всіх інтерфейсах без вимоги брандмауера.
Сервер уже віддає зібраний фронтенд ефективно: хешовані пакети в /js/ та /assets/ надсилаються стисненими brotli або gzip із річним терміном кешування immutable, а index.html і service worker позначені як no-cache, тож новий випуск підхоплюється під час наступного завантаження. Проксі не потрібно повторно стискати чи кешувати ці шляхи; пропускайте Accept-Encoding без змін.
Корисні команди
docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d