Зачем это нужно? Потому что ваш AI не должен шпионить
Каждый раз, отправляя запрос в ChatGPT или Claude, вы закладываете кирпичик в чужую стену. Ваши данные, ваши идеи, ваш контекст. Платите за это деньгами и приватностью. Звучит несправедливо, да?
Локальный запуск модели - это не просто "крутая техническая игрушка". Это возвращение контроля. Вы можете обрабатывать внутренние документы, писать код, генерировать контент, и ни один байт не уйдет за пределы вашего железа. Особенно актуально для юристов, врачей, стартапов на ранней стадии.
Но есть и обратная сторона: производительность. Llama 3.1 70B на ноутбуке 2018 года - это не разговор с ассистентом, а медитативное наблюдение за прогресс-баром. Требуются ресурсы.
Стек: почему именно эта связка?
Можно собрать llama.cpp в LXC, можно мучиться с Oobabooga. Но для быстрого, чистого и поддерживаемого стенда я выбрал три компонента:
- Ollama - бесспорный король локального запуска LLM. Качает модели, управляет контекстом, предоставляет API. Проще некуда.
- Open WebUI (раньше Ollama WebUI) - открытый клон интерфейса ChatGPT. Работает с Ollama API, хранит историю, поддерживает RAG. Красиво и функционально.
- Docker & Docker Compose - изоляция и воспроизводимость. Через полгода вы вспомните меня добрым словом, когда нужно будет перенести весь стенд на новый сервер.
Эта связка дает баланс между простотой и гибкостью. Не такая нативная, как прямой запуск в LXC, но в разы удобнее для ежедневного использования.
1Железо: что вам понадобится на самом деле
Забудьте про "минимальные системные требования" из официальной документации. Вот реальная картина:
| Модель | Оперативная память (минимум) | VRAM (для GPU) | Скорость генерации (приблизительно) |
|---|---|---|---|
| Llama 3.1 8B | 8 ГБ | 6 ГБ | 15-25 токенов/сек (на CPU) |
| Llama 3.1 70B | 40 ГБ | 2x24 ГБ (очень желательно) | 5-10 токенов/сек (на GPU) |
Если у вас меньше 16 ГБ оперативки, смотрите в сторону более легких моделей для слабого железа. 70B-версия без двух топовых видеокарт - это боль.
2Устанавливаем Docker и Docker Compose
Если Docker у вас уже стоит, пропускайте этот шаг. Если нет - вот команды для Ubuntu/Debian (для других ОС смотрите официальный сайт).
# Обновляем пакеты и ставим зависимости
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# Добавляем официальный GPG-ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Добавляем репозиторий
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Устанавливаем Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# Добавляем текущего пользователя в группу docker (чтобы не писать sudo перед каждой командой)
sudo usermod -aG docker $USER
newgrp docker
# Проверяем установку
docker --version
# Устанавливаем Docker Compose (отдельный плагин)
sudo apt install -y docker-compose-plugin
docker compose versionПосле этого нужно выйти из системы и зайти снова, чтобы изменения в группах вступили в силу. Или выполнить newgrp docker в текущей сессии.
3Создаем Docker Compose файл для всего стека
Вот где магия. Один файл, две службы. Создайте папку для проекта, например, ~/llama-stack, и внутри файл docker-compose.yml.
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
volumes:
- ollama_data:/root/.ollama # Персистентное хранение моделей
ports:
- \"11434:11434\" # API порт Ollama
networks:
- ollama-network
# Ключевые настройки для производительности:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu] # Передаем все GPU в контейнер
# Если нет GPU, закомментируйте блок deploy выше
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
depends_on:
- ollama
volumes:
- open-webui_data:/app/backend/data # Персистентное хранение чатов, пользователей
ports:
- \"3000:8080\" # Веб-интерфейс будет на localhost:3000
environment:
- OLLAMA_BASE_URL=http://ollama:11434 # Внутренняя ссылка на сервис Ollama
- WEBUI_SECRET_KEY=your_secret_key_here_change_me # Смените на случайную строку!
networks:
- ollama-network
extra_hosts:
- \"host.docker.internal:host-gateway\"
networks:
ollama-network:
driver: bridge
volumes:
ollama_data:
open-webui_data:Это базовая конфигурация. Она создает сеть, два тома для данных и связывает контейнеры. Обратите внимание на WEBUI_SECRET_KEY - замените на что-то свое, можно сгенерировать через openssl rand -hex 32.
Если у вас нет NVIDIA GPU, или вы не хотите его использовать, обязательно закомментируйте или удалите блок deploy: в сервисе ollama. Иначе контейнер не запустится.
4Запускаем и загружаем модель
Перейдите в папку с docker-compose.yml и выполните:
# Запускаем контейнеры в фоновом режиме
docker compose up -d
# Смотрим логи Ollama, чтобы убедиться, что все работает
docker compose logs -f ollamaЕсли в логах нет ошибок, можно загружать модель. Откройте новый терминал и используйте CLI Ollama внутри контейнера:
# Загружаем Llama 3.1 8B (самая сбалансированная версия для начала)
docker exec -it ollama ollama pull llama3.1:8b
# Или, если хватит ресурсов, 70B (готовьтесь ждать и иметь много места)
# docker exec -it ollama ollama pull llama3.1:70bЗагрузка может занять время (несколько гигабайт). Модель сохранится в том ollama_data, так что при пересоздании контейнера заново качать не придется.
5Настройка Open WebUI и первый запрос
Откройте браузер и перейдите по адресу http://localhost:3000 (или http://ваш-ip-сервера:3000).
Первым делом - регистрация. Создайте учетную запись. (Да, локальный AI все равно требует логин. Это для многопользовательского режима и хранения истории.)
После входа нужно добавить модель:
- В левом нижнем углу нажмите на значок настроек (шестеренка).
- Перейдите в раздел "Models".
- Вы должны увидеть загруженную модель
llama3.1:8b. Если нет, нажмите "Refresh". - Выберите ее и нажмите "Load Model".
Все. Можете открывать новый чат и начинать общение. Интерфейс почти один в один с ChatGPT. Попробуйте задать вопрос на русском - Llama 3.1 с ним справляется неплохо.
Где собака зарыта: нюансы и грабли
Теперь о том, что обычно умалчивают в гайдах.
Производительность GPU
Если вы передали GPU в контейнер, Ollama должен автоматически использовать CUDA. Проверить можно так:
docker exec -it ollama ollama run llama3.1:8b \"Hello\"В начале вывода будет строка типа pulling manifest - там же можно увидеть, используется ли cuda. Или внутри веб-интерфейса в логах загрузки модели.
Память и своп
Если модели не хватает оперативной памяти, Ollama начнет использовать своп-файл. Это убьет производительность. Следите за использованием памяти через htop или docker stats.
Для 70B модели на системе с 64 ГБ ОЗУ я рекомендую создать огромный файл подкачки (swap) - лишние 50 ГБ на SSD. Медленно, но хотя бы не упадет.
Безопасность и доступ из сети
По умолчанию стенд доступен только локально (localhost:3000). Чтобы открыть доступ в локальную сеть, нужно изменить настройки Docker сети или использовать reverse proxy (Nginx, Traefik).
Никогда не выставляйте порты 11434 (Ollama API) или 3000 (WebUI) напрямую в интернет без пароля и HTTPS. Open WebUI имеет встроенную аутентификацию, но API Ollama - нет. Если нужно дать доступ извне, посмотрите гайд по безопасному доступу через reverse proxy.
Обновление
Чтобы обновить Open WebUI или Ollama до последней версии:
# Останавливаем контейнеры
docker compose down
# Тянем новые образы
docker compose pull
# Запускаем снова
docker compose up -dВаши модели и данные чатов останутся в томах Docker.
А что если...? (FAQ от того, кто уже наступил на все грабли)
Модель не загружается, пишет "error pulling model manifest"
Скорее всего, проблемы с сетью или Docker. Попробуйте:
- Запустить pull команду с флагом
--insecure(если у вас проблемы с SSL). - Проверить, что контейнер ollama имеет доступ в интернет (
docker exec -it ollama curl https://ollama.com). - Вручную скачать модель в формате GGUF и поместить в том Ollama (сложный путь).
Open WebUI не видит модель, хотя она загружена в Ollama
Проверьте переменную окружения OLLAMA_BASE_URL в docker-compose файле. Она должна указывать на http://ollama:11434. Затем перезапустите Open WebUI: docker compose restart open-webui.
Очень медленная генерация, хотя GPU используется
Возможно, модель загружена только частично в VRAM, остальное в ОЗУ. Для 8B модели на карте с 8 ГБ VRAM это нормально. Можно попробовать квантованную версию (например, llama3.1:8b-q4_K_M), которая занимает меньше памяти. Скачать ее можно так же: docker exec -it ollama ollama pull llama3.1:8b-q4_K_M.
Хочу использовать другую модель, не Llama
Ollama поддерживает десятки моделей: Mistral, Gemma, Qwen, DeepSeek. Просто замените llama3.1:8b на, например, mistral:7b или qwen2.5:7b. Полный список: docker exec -it ollama ollama list (после загрузки хотя бы одной).
Итог: что вы получили
Вы развернули полностью автономный AI-стенд. Он не позвонит маме (то есть в облако), даже если его попросить. Вы можете обрабатывать конфиденциальные данные, интегрировать его в свои приложения через API, или просто использовать как умный блокнот.
Следующий шаг - добавить RAG (Retrieval-Augmented Generation) для работы с вашими документами. Open WebUI имеет встроенную поддержку загрузки файлов и семантического поиска. Но это тема для отдельного разговора.
Главный совет, который вы не найдете в мануалах: не гонитесь за самой большой моделью. 8B параметров с хорошим контекстом часто полезнее 70B, которая думает минуту на каждый ваш вопрос. Начните с малого, почувствуйте, как AI вписывается в ваш workflow, а потом уже решайте, стоит ли покупать новую видеокарту.
И да, теперь вы можете спрашивать у AI, как починить сервер, не боясь, что он посоветует вам rm -rf /* из чистого любопытства. Хотя... локальные модели тоже иногда галлюцинируют. Никогда не верьте им слепо.