Развёртывание

Установка и развёртывание

Развёртывание MCP шлюза в контуре: один бинарник, хранилище PostgreSQL, SQLite или MSSQL, обратный прокси, переменные окружения и подключение к 1С.

Шлюз поставляется как один исполняемый файл и разворачивается в контуре компании (self-hosted). Для пилотного запуска в самом продукте есть пошаговый чек-лист на странице «Начало работы» (/web/getting-started): установка, настройка 1С, приглашение команды, подключение AI-клиента, первый черновик, одобрение.

Хранилище

Конфигурация читается из переменных окружения. Базу данных выбирает DB_DRIVER:

Переменная Обязательная По умолчанию Примечания
DB_DRIVER нет sqlite sqlite, postgres или mssql
DB_DSN да нет Строка подключения к базе данных

Одиночный экземпляр работает на любом из трёх бэкендов: PostgreSQL, SQLite или MSSQL (поддерживается с SQL Server 2016). Режим нескольких экземпляров (GATEWAY_CLUSTER_ENABLED, по умолчанию выключен) требует PostgreSQL.

Обратный прокси и TLS

Командное развёртывание обязано стоять за обратным прокси. Правила:

  1. Сервер говорит на чистом HTTP, TLS терминируется на прокси. Бинарник сам TLS не обслуживает. Впереди должен стоять обратный прокси (nginx, Caddy, traefik), который терминирует HTTPS и проксирует на приложение через loopback. Чистый HTTP-порт нельзя открывать клиентам напрямую.
  2. Приложение слушает loopback. LISTEN_ADDR по умолчанию 127.0.0.1:8443, то есть из коробки до приложения дотягивается только прокси на том же хосте. Явная привязка к не-loopback адресу без TRUST_PROXY_HEADERS=true даёт громкое предупреждение при старте.
  3. MCP-endpoint полагается на прокси в проверке Origin и Host. Встроенная localhost-защита MCP SDK отключена, потому что за прокси заголовок Host принадлежит прокси. Это безопасно только когда впереди доверенный прокси; прямое открытие наружу не поддерживается.
  4. TRUST_PROXY_HEADERS=true только за доверенным прокси. Флаг заставляет доверять X-Forwarded-For / X-Real-IP (корректные IP клиентов в аудите) и X-Forwarded-Proto. На открытом напрямую сервере эти заголовки подделываются клиентом и отравили бы журнал аудита, поэтому по умолчанию false.
  5. Аутентификация на /mcp обязательна всегда. Каждый запрос несёт Authorization: Bearer ent_live_<...>, анонимный получает 401. Лимиты частоты действуют независимо от прокси.
  6. Задайте WEB_PUBLIC_URL. За прокси ссылки приглашений иначе строились бы от подделываемого заголовка Host. Укажите канонический HTTPS-адрес, например WEB_PUBLIC_URL=https://mcp.your-company.tld; приложение предупреждает при старте, если за прокси адрес не задан.

Минимальный набросок nginx (иллюстративный, укрепляйте под свою среду):

server {
    listen 443 ssl;
    server_name mcp.your-company.tld;
    # ssl_certificate / ssl_certificate_key ...

    location / {
        proxy_pass http://127.0.0.1:8443;   # приложение на loopback
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Streamable HTTP и SSE требуют потоковой отдачи и долгих чтений:
        proxy_buffering off;
        proxy_read_timeout 1h;
    }
}

Затем запустите приложение с LISTEN_ADDR=127.0.0.1:8443, TRUST_PROXY_HEADERS=true и WEB_PUBLIC_URL=https://mcp.your-company.tld.

Базовые переменные окружения

Переменная Обязательная По умолчанию Примечания
LISTEN_ADDR нет 127.0.0.1:8443 Адрес прослушивания, по умолчанию loopback
TRUST_PROXY_HEADERS нет false Только за доверенным обратным прокси
WEB_PUBLIC_URL нет нет Канонический публичный HTTPS-адрес; рекомендуется за прокси
TRUST_NAME_DETECTION нет balanced Распознавание ФИО: off / balanced / aggressive, см. маскирование PII
LOG_LEVEL нет INFO DEBUG, INFO, WARN, ERROR

Таймауты HTTP

Транспортные таймауты встроенного HTTP-сервера настраиваются. Все значения это Go-длительности (30s, 2m, 1h). Их можно задать переменными окружения или настроить в админ-разделе /web/admin/http-timeouts; сохранённое в интерфейсе значение переопределяет переменную окружения.

Переменная По умолчанию Диапазон Примечания
HTTP_READ_TIMEOUT 30s 1s..1h Таймаут чтения полного запроса
HTTP_READ_HEADER_TIMEOUT 10s 1s..1m Таймаут чтения заголовков (защита от slow loris), никогда не 0
HTTP_WRITE_TIMEOUT 120s 1s..24h Страховочный таймаут записи ответа; потоковые маршруты используют свои бюджеты ниже
HTTP_IDLE_TIMEOUT 120s 1s..1h Таймаут простоя keep-alive
HTTP_ARCHIVE_WRITE_TIMEOUT 0s 0 или 30s..24h Дедлайн записи на запрос для скачивания /archive; 0 = без ограничения (рекомендуется для многогигабайтных выгрузок)
HTTP_UPLOAD_NETWORK_TIMEOUT 60s 10s..1h Сетевой таймаут на чанк возобновляемой загрузки

Семантика применения: четыре глобальных таймаута (READ / READ_HEADER / WRITE / IDLE) снимаются сервером при старте, поэтому изменение вступает в силу после перезапуска. Два потоковых читаются на каждую передачу: HTTP_ARCHIVE_WRITE_TIMEOUT действует уже на следующем запросе /archive, HTTP_UPLOAD_NETWORK_TIMEOUT действует для новых загрузок. Значение вне диапазона отклоняется при старте (fail-closed) и в интерфейсе (422) с тем же сообщением.

Подключение к 1С

Шлюз читает данные 1С через поставляемое расширение конфигурации mcp_service. Подключения к базам 1С создаются и настраиваются в веб-интерфейсе, в разделе /web/admin/onec. Это основной и рекомендуемый способ: адрес базы, учётные данные и активация задаются в интерфейсе, а править базу данных напрямую или описывать подключение переменными окружения не нужно.

Для каждой записи в разделе /web/admin/onec администратор задаёт:

Параметр Где задаётся в интерфейсе Примечания
Базовый URL публикации форма создания и правки записи путь /hs/feenlace_mcp_service/... добавляется автоматически
Учётная запись (логин) форма записи учётная запись HTTP Basic, созданная в базе 1С
Пароль форма записи или карточка учётных данных шифруется при хранении, в ответах и журналах не показывается
Активация кнопки активации и деактивации неактивная запись запросы не обслуживает
Окружение переключатель окружения промышленное или непромышленное, влияет на защитные подтверждения
Проверка идентичности кнопка проверки на карточке записи сверяет базу за адресом и закрепляет её идентичность за записью
Сопоставление полей YAML-редактор записи правила сопоставления для расширения mcp_service
История аудита страница записи изменения по каждой записи видны на её карточке

Записи хранятся в базе данных шлюза; адаптер каждой базы пересобирается при сохранении, поэтому смена адреса, логина или пароля вступает в силу без перезапуска сервиса. Перед включением операций записи переустановите mcp_service.cfe с write-обработчиками и выдайте необходимые права учётной записи mcp_service.

Переменные окружения ONEC_* (устаревший путь подключения). Раньше подключение к 1С описывалось переменными ONEC_BASE_URL, ONEC_BASIC_USER и ONEC_BASIC_PASSWORD. В текущей модели единого хаба адрес базы, учётная запись и пароль хранятся записью в базе данных и задаются в интерфейсе, поэтому эти три переменные для описания подключения больше не используются.

Операционные параметры обращения к 1С остаются глобальными переменными окружения: они применяются одинаково ко всем подключениям и в интерфейсе на отдельную запись не задаются. Все они необязательные:

Переменная По умолчанию Примечания
ONEC_TIMEOUT 30s Таймаут HTTP-запроса к 1С
ONEC_RETRY_MAX_ATTEMPTS 3 Всего попыток, включая первую
ONEC_RETRY_INITIAL_INTERVAL 1s Начальный интервал повторов, удваивается с каждым повтором
ONEC_CIRCUIT_FAILURE_THRESHOLD 5 Подряд идущих сбоев до открытия circuit breaker
ONEC_CIRCUIT_OPEN_DURATION 10s Окно полуоткрытой пробы
ONEC_ALLOW_INSECURE false Разрешить http:// для не-loopback; пишет аудит-событие onec.config.insecure_scheme

Поведение операций записи тоже настраивается глобально (все переменные необязательные): ONEC_WRITE_RETRY_MAX_ATTEMPTS (по умолчанию 2, повторяются только транзиентные ошибки), ONEC_DISABLE_SCHEMA_VALIDATION (false), ONEC_SCHEMA_VALIDATION_STRICT (true, неизвестные поля отклоняются), ONEC_RESTRICT_CATALOG_WRITES (false, блокирует запись элементов справочников через RBAC-гейт).

Пароль 1С и systemd (устаревший способ)

Пароль 1С задаётся в веб-интерфейсе (/web/admin/onec) и хранится в базе в зашифрованном виде, поэтому передавать его через окружение не требуется. Ниже для справки по старым развёртываниям оставлен прежний способ передачи ONEC_BASIC_PASSWORD через systemd LoadCredential=. Общий принцип прежнего способа: не размещать ONEC_BASIC_PASSWORD в env-файлах, видимых через /proc/*/environ, а подавать его через systemd LoadCredential=:

[Service]
LoadCredential=onec_basic_password:/etc/mcp-1c-enterprise/onec.basicpass
EnvironmentFile=/run/credentials/%n/environment

Файл /etc/mcp-1c-enterprise/onec.basicpass содержит ровно одну строку:

ONEC_BASIC_PASSWORD=<пароль>

Права: chmod 0400, владелец root:mcp-1c-enterprise. systemd проецирует файл в /run/credentials/<unit>/... только для процесса сервиса, другие процессы на хосте его не прочитают.

Установка расширения в Конфигураторе

На Windows-хосте с Конфигуратором расширение mcp_service загружается в целевую базу неинтерактивно:

mcp-1c-enterprise.exe install-cfe ^
    --base-path C:\1cbase ^
    --user Admin ^
    --pass-file C:\secrets\admin.txt ^
    --cfe-path C:\dist\mcp_service.cfe

Ключевые флаги (полный список: mcp-1c-enterprise install-cfe --help):

  • --base-path <каталог> или --server-base <строка>: файловая либо клиент-серверная база, флаги взаимоисключающие.
  • --user <имя> и --pass-file <путь>: учётные данные 1С. Инлайн-флаг --pass намеренно не поддержан, чтобы секрет не светился в ps.
  • --cfe-path <файл>: готовый .cfe для загрузки.
  • --designer-path <exe>: переопределение поиска 1cv8.exe; учитывается и $ONEC_DESIGNER_PATH.
  • --dry-run: печатает отредактированные аргументы Конфигуратора и выходит с кодом 0, не вызывая 1cv8.exe.
  • --verbose: стримит декодированный журнал Конфигуратора в stdout.

Повторные запуски безопасны: лестница повторов сама обрабатывает случаи «Уже существует» (удалить и загрузить заново), «Конфигурация заблокирована» и «Сеанс работы заблокирован» (повтор с паузой, до 3 попыток) и предупреждение о переопределении свойств заимствованных объектов. На Linux и macOS подкоманда сразу выходит с кодом 2, поэтому её безопасно звать в любом CI. Ручная установка через GUI описана в поставляемом extensions/mcp_service/INSTALL.md.

Подпись релизов и SBOM

Релизные бинарники подписаны Ed25519: рядом с бинарником и его SBOM лежит открепленная подпись .sig. Публичный ключ вшит в бинарник как якорь доверия; --verify самопроверяется против встроенного ключа, а установочный скрипт проверяет подпись независимо: подпись есть и валидна, установка продолжается; есть и невалидна, установка останавливается (fail-closed); отсутствует, выводится предупреждение (либо жёсткое требование через REQUIRE_SIGNATURE).

Каждый релизный артефакт сопровождается SBOM в формате CycloneDX 1.6 с перечнем Go-модулей, вкомпилированных именно в этот бинарник, и sha256-сайдкаром для проверки целостности:

cd bin
sha256sum -c mcp-1c-enterprise.cdx.json.sha256   # GNU/Linux
shasum -a 256 -c mcp-1c-enterprise.cdx.json.sha256   # macOS/BSD