«Прокси-агент» — это один контейнер: внутри него и приложение, и интерфейс. Рядом обязательно нужна база PostgreSQL — в ней живут журнал запросов, журнал прокси-службы и суточные суммы расхода по ключам. Ничего сверх этого не требуется, поэтому развернуть продукт можно на своём сервере за несколько минут.
Один контейнер и одна база
Контейнер обслуживает и страницы интерфейса, и адреса /api/*, к которым обращаются программы. База — внешняя: её можно поставить на том же сервере или на отдельном. При первом запуске база создаётся сама, если её ещё нет, — вручную ничего готовить не нужно. Эта база — единственная обязательная настройка: без неё приложение не стартует.
В образе есть ядро Xray — на нём работают каналы по подписке Happ. В своей сборке без ядра такие каналы просто считаются недоступными, а путь к своему ядру задаётся переменной PROXY_APP_XRAY_PATH. Обычные каналы — HTTP-прокси, SOCKS5, VPN — от ядра не зависят.
Продукт выходит двумя сборками. В русской сборке (maxpastukhov/proxy-agent, переменная PROXY_APP_BRAND=pastukhov) интерфейс по умолчанию открывается на русском, пока язык не выбран вручную; ручной выбор всегда побеждает. В остальном сборки совпадают.
Порты и публикация
- Основной порт — страницы интерфейса и адреса моделей. В примерах установки он публикуется как
5000:80— снаружи 5000, внутри 80. - Порты прокси-службы — по одному на каждый канал, которому вы задали порт слушателя на странице «HTTP-прокси». Пока порт не задан, ничего не слушает. Каждый такой порт публикуется отдельной строкой в файле запуска — только тогда он будет доступен снаружи; подпапка на эти порты не влияет.
Размещение в подпапке
Если продукт должен жить не в корне домена, а в первой подпапке — например, по адресу ваш-домен/proxy, — есть два способа.
- Переменной окружения. Укажите
PROXY_APP_BASE_PATH=/proxy— и всё внутри будет работать от этой папки. Обращения по неверному адресу продукт перенаправит сам, чтобы адрес был один и тот же, а не два разных. - Передним прокси. Прокси перед приложением сам снимает папку и передаёт продукту заголовок
X-Forwarded-Prefix. При этом продукт остаётся доступен и напрямую, по своему порту в корне домена, — это удобный путь для диагностики.
Три адреса в любом случае всегда живут в корне домена и подпапке не подчиняются: /api/ (к нему обращаются программы), проверка состояния и проверка сертификатов. Так задумано: клиенты указывают адрес от корня, и ломать это подпапкой нельзя.
HTTPS настраивается снаружи
Сам контейнер говорит только по простому HTTP. Защищённое соединение (HTTPS) настраивается перед ним — на переднем прокси или на стороне облака. Так проще менять сертификаты и не пересобирать продукт.
Что важно для переднего прокси
Передний прокси должен пропускать живые соединения (иначе чат сам перейдёт на менее удобный режим), не копить ответ в буфере и не обрывать длинные ответы. Практические значения: таймауты до 3600 секунд и предел размера запроса 100 мегабайт. Если этого не сделать, потоковые ответы моделей и чат будут рваться, а большие запросы — отклоняться.
Где лежат данные
Данные разложены по трём местам, и путать их не стоит.
- Конфигурация — файлы
settings.yml,models.yml,http-providers.yml,keys.ymlиanonymization.ymlв папке/project/apps/proxy. Здесь настройки, модели, каналы, ключи доступа и правила скрытия секретов. Это единственный источник правды: файлы правят руками, из интерфейса или через управление по API. Правка руками подхватывается примерно за 300 мс, а ошибка разбора не ломает работу — остаётся последнее удачное состояние. Папку хранят в системе контроля версий: перенос её на другой сервер переносит всю конфигурацию. Секретные поля можно записывать ссылкой на переменную окружения вида$ИМЯ_ПЕРЕМЕННОЙ. - Рабочее состояние — том
/apps/proxy: ключи защиты данных (auth/), ключ подписи сессий входа (appdata/.jwt-secret), сохранённые «размышления» DeepSeek (reasoning_cache.sqlite3), хранилище скрытия секретов (anonymizer/), конфигурации VPN (vpn/) и рабочие файлы каналов-подписок Happ (happ/). Без тома теряются «размышления» и соответствия секретов, а без постоянногоJWT_SECRET_KEY— все выданные сессии входа. Рабочие файлыhapp/восстанавливаются сами: подписка запрашивается заново при следующем обращении. - Журналы и расходы — PostgreSQL: журнал запросов, журнал прокси-службы и суточные суммы расхода по ключам.
Вывод простой: подключите оба тома, а ключ подписи задайте переменной окружения — тогда пересоздание контейнера проходит незаметно.
Резервные копии
Для полной копии нужны три вещи: дамп PostgreSQL (журналы и расходы), папка конфигурации и том рабочего состояния. Первые две легко переносятся на другой сервер и хранятся в системе контроля версий; в томе — соответствия секретов, «размышления» и конфигурации VPN. Рабочее состояние подписок Happ копировать не обязательно: оно восстанавливается из самой подписки.
Дальше: как устроен доступ и что стоит сделать для безопасности — в разделе Доступ и безопасность.