Практический контур: как поднять локальную LLM через Ollama и Open WebUI и подключить её к Codex CLI, чтобы код и данные не уходили в облако. Это не обзор одного инструмента, а сборка рабочего пайплайна от установки модели до её использования в кодинг-агенте.
Что решает этот контур
Облачные модели удобны, но каждый запрос уходит на чужие серверы. Для части задач это неприемлемо: персональные данные клиентов, внутренние документы, коммерческая тайна, код под NDA.
Локальный контур закрывает три проблемы:
- Приватность. Промпты и файлы не покидают вашу машину.
- Стоимость на объёме. Нет оплаты за токены: платите один раз за железо.
- Автономность. Работает без интернета и не зависит от лимитов и блокировок провайдера.
Взамен вы берёте на себя железо, обновления моделей и то, что локальная модель слабее топовой облачной.
Как выглядит контур
Три звена: рантайм модели, интерфейс для людей и кодинг-агент. Все обращаются к одной локальной модели по единому API.
flowchart LR
A["Ваше железо<br>Mac / Linux / VPS"] --> B["Ollama<br>рантайм модели"]
B --> C["OpenAI-совместимый API<br>localhost:11434"]
C --> D["Open WebUI<br>чат и RAG для команды"]
C --> E["Codex CLI<br>кодинг-агент"]
E --> F["Код и данные<br>остаются локально"]Пререквизиты
До старта проверьте, что готово:
- Железо под модель. Главное ограничение — память. Ориентиры в таблице ниже.
- Docker — для Open WebUI, ставится одной командой.
- Codex CLI — установлен и авторизован.
- Выбранная модель — под кодинг берите модель с поддержкой tool calling (например, семейство Qwen Coder).
| Размер модели | Нужно памяти (RAM/VRAM) | Подходит для |
| 7–8B | ~8 ГБ | ноутбук, быстрые черновики |
| 14B | ~16 ГБ | баланс качества и скорости |
| 32B | ~24–32 ГБ | серьёзный кодинг |
| 70B+ | 48 ГБ и выше | максимум качества, нужна станция |
Шаг 1. Поднять модель в Ollama
Установите рантайм Ollama и скачайте модель:
# macOS и Linux
curl -fsSL https://ollama.com/install.sh | sh
# скачать кодинг-модель (пример)
ollama pull qwen2.5-coder:14bНа macOS есть и второй путь — приложение с сайта (.dmg); оба варианта ставят одну и ту же CLI ollama.
Ollama запускается как фоновый сервис и слушает порт 11434. Проверьте, что модель отвечает по OpenAI-совместимому API:
curl http://localhost:11434/v1/modelsЕсли в ответе есть ваша модель — рантайм готов.
Шаг 2. Поднять Open WebUI
Open WebUI даёт человеческий интерфейс к локальной модели: чат, историю, доступ для команды и RAG по вашим документам. Запуск через Docker:
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
ghcr.io/open-webui/open-webui:mainОткройте http://localhost:3000 и создайте локальную учётную запись администратора. Open WebUI сам находит Ollama по адресу host.docker.internal:11434. Если модель не подхватилась, пропишите адрес вручную в настройках подключений.
Шаг 3. Подключить Codex CLI к локальной модели
Codex CLI умеет работать с любым OpenAI-совместимым провайдером. Сначала опишите локального провайдера в ~/.codex/config.toml:
# Локальный провайдер поверх Ollama
[model_providers.ollama]
name = "Ollama (local)"
base_url = "http://localhost:11434/v1"
# Ollama не проверяет ключ, но поле может быть обязательным — подойдёт любая строка
env_key = "OLLAMA_API_KEY"Сам профиль в свежих версиях Codex CLI описывается отдельным файлом рядом с конфигом — например ~/.codex/local.config.toml. Ключи кладутся на верхний уровень, без вложенной таблицы:
model = "qwen2.5-coder:14b"
model_provider = "ollama"[profiles.local] прямо в config.toml. В свежих версиях Codex CLI такой формат не читается, а устаревший блок иногда мешает запуску — профиль должен лежать отдельным файлом <имя>.config.toml. Точные имена полей сверяйте с актуальной документацией, они меняются между версиями.Запустите Codex на локальном профиле:
export OLLAMA_API_KEY="local"
codex --profile localЕсли вам хватает открытых моделей gpt-oss, есть путь короче: флаг --oss сам поднимает связку с Ollama без ручной правки конфига.
codex --oss -m gpt-oss:20bТот же контур в Codex App и IDE
CLI — не единственный клиент Codex. Десктопное приложение и расширение для редактора читают тот же конфиг ~/.codex/config.toml, поэтому подключаются к локальной модели теми же настройками.
- Codex App (macOS/Windows). Проще всего поднять через Ollama — команда сама пропишет локальный эндпоинт и откроет приложение:
ollama launch codex-app
# с конкретной моделью
ollama launch codex-app --model qwen2.5-coder:14bПоддержка Codex App появилась в Ollama версии 0.24.0 и новее.
- IDE-расширение (VS Code / Codium). Работает на том же
config.toml: откройте настройки Codex → «Open config.toml» и укажите локального провайдера. Переключение модели пока только через правку конфига с перезапуском редактора — штатного селектора для локальных моделей нет.
Шаг 4. Проверить, что всё работает
curl http://localhost:11434/v1/models возвращает вашу модельlocal выполняет простую задачу (например, объясняет файл)api.openai.com (проверьте в мониторе сети)Последний пункт — главный: он подтверждает, что данные действительно остаются локально.
Сценарии использования
Куда локальный контур встаёт лучше всего:
- Код под NDA и приватные репозитории. Ревью, рефакторинг и объяснение легаси-кода, который нельзя отправлять в облако. Codex на профиле
localчитает и правит файлы прямо в рабочей папке. - Чувствительные данные. Логи с персональными данными, выгрузки из БД, внутренние отчёты: попросите Codex написать и прогнать скрипт обработки — сами данные не покидают машину.
- Приватный чат по внутренней базе. Open WebUI с RAG превращает локальную модель в справочную по вашим документам для всей команды, без утечки содержимого.
- Работа офлайн и в изолированном контуре. Самолёт, объект без интернета, air-gapped-сеть — модель уже на вашем железе и не зависит от связи.
- Рутина на объёме. Генерация тестов, докстрингов, черновых коммит-сообщений и однотипных правок, где не хочется платить за токены и упираться в лимиты.
- Гибридный день. Чувствительное и рутинное — на локальной модели, сложную архитектуру — переключением на облачный Codex. Один инструмент, разные профили.
codex --profile local в папке с файлом и просите: «прочитай access.log, найди топ-20 IP по числу ошибок 5xx и собери CSV». Модель читает файл, пишет скрипт и отдаёт результат — лог никуда не уходит.Типичные ошибки
- Модель не влезает в память. Система уходит в своп, ответы идут минутами. Возьмите модель на размер меньше или квантованную версию.
- Codex молчит или падает на инструментах. Кодинг-агенту нужна модель с поддержкой tool calling. Обычные чат-модели не подойдут.
- Open WebUI не видит Ollama. Чаще всего дело в сети Docker: проверьте флаг
--add-host=host.docker.internal:host-gatewayи адрес подключения. - Порт 11434 недоступен снаружи. Так и должно быть: доступ закрыт по умолчанию. Открывайте его только через VPN или туннель.
Когда это оправдано
Антипаттерны
- ❌ Ставить 70B на ноутбук и ждать нормальной скорости — упрётесь в память
- ❌ Брать чат-модель для кодинг-агента без поддержки tool calling
- ❌ Выставлять Ollama в интернет ради удалённого доступа вместо VPN
- ❌ Полностью отказываться от фронтира — на сложном коде локальная модель проседает
- ❌ Грузить приватные документы в облачный RAG, когда весь смысл контура в локальности
По теме
Если вы работаете с чувствительными данными или просто не хотите зависеть от облака, локальный контур даёт спокойствие: модель, код и документы остаются на вашем железе.
Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov
Если хотите разобрать свою задачу — напишите мне Если хотите разобрать свою задачу — напишите мне.
Можно прийти с идеей, черновым контекстом или уже живой задачей. Помогу быстро понять, где реальный следующий шаг, а где лишний шум.
Обычно хватает 2–3 сообщений, чтобы понять, могу ли я здесь реально помочь и в каком формате лучше двигаться дальше.