Заказчик запретил выгружать код куда бы то ни было, а ревью руками съедает по часу на мерж-реквест. Код-ревью на локальной модели снимает вопрос буквально: при работе через Ollama или vLLM из сети не уходит ни одного байта — ни диффа, ни файлов.
Цена такого решения известна заранее и измеряется в гигабайтах и в качестве находок. Разбираю обе стороны.
Что уходит наружу, а что остаётся
ReviewGate ставится внутри вашей сети: бот в Docker-контейнере, очередь на Redis, вебхук от self-hosted GitLab или от GitHub. Единственное исходящее соединение по умолчанию — запрос к модели, которую выбрали вы, вашим же ключом. Вендор продукта диффа не видит вообще.
В сети остаются исходный код и дифф, содержимое файлов, токен платформы и секрет вебхука, имена веток и авторы. Наружу уходит только промпт ревью — дифф плюс ваши правила, а при включённых опциях контекста ещё и целые изменённые файлы с версиями стека из манифестов.
Хранится при этом одна метаинформация: количество находок и их важность, статусы прогонов, вердикт гейта, потраченные токены. Всё это в вашей же базе и вычищается через 90 дней. Код и диффы не пишутся ни в логи, ни в базу — проверяется это на своём же хосте, а не на слово.
Контейнер запускается не от root, с файловой системой только на чтение, со сброшенными Linux-capabilities и no-new-privileges. Обычного входа внутрь нет, скомпрометированная зависимость не закрепится и на диск не запишет.
Как понять, что вам нужен именно закрытый контур
Локальная модель нужна, когда наружу нельзя отдавать сам код, а не только персональные данные. Если у вас уже есть договор с провайдером модели и служба безопасности его согласовала, облачный вариант проще и заметно точнее. Признаки, что пора смотреть в сторону локального инференса:
- Договор с заказчиком прямо запрещает передачу исходного кода третьим лицам, и провайдер модели считается третьим лицом.
- Контур аттестован и исходящие соединения закрыты политикой deny — согласовать новый адрес дольше, чем поставить модель.
- Юрисдикция хранения данных зафиксирована документом, а не пожеланием.
- Вы не готовы добавлять нового субобработчика: в облачной схеме дифф уходит к каждому вендору, чьи модели вы поставили в роли.
- Проверка лицензии продукта в контуре без интернета — она офлайновая, подпись проверяется встроенным публичным ключом, звонков наружу нет.
Что сделать сейчас: модель, три переменные, очередь
Ollama и vLLM отдают OpenAI-совместимый API, и бот ходит в него напрямую, без шлюза. Быстрый старт занимает столько, сколько качается модель:
ollama pull qwen3-coder:30b-a3b-q8_0
Этот тег в библиотеке Ollama весит 32 ГБ при окне контекста 256K — квантование q8_0 у модели на 30B параметров, из которых активны около 3B. Вариант q4_K_M того же семейства занимает 19 ГБ, fp16 — 61 ГБ. Дальше три переменные в окружении бота:
LLM_PROVIDER=ollama
LLM_BASE_URL=http://localhost:11434/v1
LLM_MODEL=qwen3-coder:30b-a3b-q8_0
LLM_TIMEOUT_MS=900000
REVIEW_CONCURRENCY=1
Две последние строки важнее, чем кажутся. Таймаут по умолчанию 600000 мс, и медленной локальной модели его не хватает. Параллельность по умолчанию 3, но Ollama из коробки обслуживает запросы по одному — число выше того, что тянет железо, ревью не ускорит, очередь просто переедет от бота к видеокарте. У vLLM с непрерывной батчёвкой запас больше, ориентируйтесь на реальную пропускную способность и свободную VRAM.
Ещё одна мелочь, на которой теряют вечер: self-hosted GitLab по умолчанию запрещает вебхуки во внутреннюю сеть. Доставка просто не происходит, в Recent events пусто или ошибка соединения. Включается в Admin → Settings → Network → Outbound requests.
И проверьте очередь отдельно: зелёный ответ /api/health ничего не говорит про Redis — ответ строится без обращения к очереди, а клиент подключается лениво, так что бот поднимется и скажет ok при лежащем Redis.
Чем придётся заплатить
Главное вендор говорит прямо: «Локальная модель на 30B заметно слабее облачного Claude на тонких находках — осознанный размен ради того, чтобы код не покидал сеть». Публичных замеров, насколько именно слабее, нет — ни числа находок, ни времени прогона на локальном железе не опубликовано, так что мерить придётся на своём дифе.
Второе: строгость формата. vLLM держит JSON-схему принудительно, Ollama — свободнее, и продукт подстраховывается устойчивым парсером и повторным запросом. Третье: окно контекста. На модели с небольшим окном придётся снижать бюджет диффа и потолок ответа, а генерируемый код честнее сразу убрать в ignore — он в разы объёмнее рукописного, и ревьюить его смысла нет.
Промежуточный вариант, если своего железа нет, а данные должны остаться в юрисдикции — Yandex AI Studio как OpenAI-совместимый провайдер. Бот шлёт заголовок x-data-logging-enabled: false, так что на стороне провайдера запросы не логируются, но это всё-таки не «ничего не уходит». Учтите при подсчёте расходов: Яндекс публикует цены за 1000 токенов, а конфигурация ждёт цену за миллион — умножайте на 1000, курсы бот не запрашивает и ничего не конвертирует.
Если ревью нужно ещё и внутри редактора, а не только на мерж-реквесте, механика подключения и типовые тихие сбои разобраны в материале про код-ревью через MCP и проверку вызова инструмента. А перед тем как ставить в контур любой сторонний MCP-сервер, стоит пройтись по признакам вредоносных MCP-серверов и скиллов — установка бинарника из сети это ровно тот случай, ради которого рядом с релизом лежат контрольные суммы.
Источники
- ReviewGate — Security: что остаётся в сети, что хранится, список исходящих
- ReviewGate — модели и свой ключ: локальная модель, прокси, параллельность
- ReviewGate — быстрый старт: контейнеры, вебхук, первая проверка
- ReviewGate — диагностика: вебхуки, Redis, переполнение контекста
- Ollama — теги и размеры сборок qwen3-coder

