Перейти к основному содержимому

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 проксирует сокет через VM. При неверной группе Work явно назовёт проблему. См. Work: изолированные рабочие области.

Превью Work и Work Computer публикуют случайные порты только на приватном интерфейсе хоста. Docker Desktop работает с настройками Compose по умолчанию: loopback хоста для привязки и host.docker.internal для подключения backend. Нативный 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 или reverse proxy хоста и ограничивайте порт брандмауэром.

Ollama остаётся приватной для сети Compose. Чтобы предоставить её приложениям хоста через loopback, добавьте явное переопределение:

docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d

Задавайте OLLAMA_BIND_ADDRESS лишь для доступа другого компьютера и защищайте порт брандмауэром и proxy с аутентификацией.

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

При необходимости переопределите URL:

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 без прямого сокета в веб-приложении, используйте proxy-вариант:

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

Proxy во внутренней сети держит /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, при неизменных терминале и диагностике. Документация Workspaces объясняет возможности и ограничения границы.

Постоянство данных

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. Значение в shell или .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 с reverse proxy или балансировщиком. Задайте WEBUI_BIND_ADDRESS точным интерфейсом, необходимым proxy; не публикуйте порт на всех интерфейсах без требования брандмауэра.

Сервер уже отдаёт собранный фронтенд эффективно: бандлы с хешем в /js/ и /assets/ передаются сжатыми brotli или gzip с годовым сроком кеширования immutable, а index.html и service worker помечены no-cache, поэтому новый выпуск подхватывается при следующей загрузке. Proxy не нужно повторно сжимать или кешировать эти пути; пропускайте заголовок Accept-Encoding.

Полезные команды

docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d

Связанная документация