Нейроключ — Руководство по установке и настройке
Содержание

1. Общие сведения
2. Краткое описание ПО
3. Требования к установке
4. Этапы установки
5. Настройка и проверка

1. Общие сведения

1.1 Назначение документа

Настоящий документ представляет собой руководство по установке и настройке интегрированной платформы Нейроключ совместно с LLM Data
Masking Gateway. Документ предназначен для системных администраторов и DevOps-инженеров, выполняющих развёртывание платформы.

1.2 Архитектура решения

Интегрированная платформа состоит из двух основных подсистем:

  • Нейроключ — серверная платформа для управления AI-сервисами (Frontend на React 19, Backend на Python/FastAPI, PostgreSQL, Redis)
  • LLM Data Masking Gateway — прокси-шлюз для защиты персональных данных, разделённый на два контура безопасности

Контуры безопасности

  • Контур Б (рабочий) — External Gateway и External Frontend, обработка запросов, взаимодействие с Нейроключом и LLM-провайдерами
  • Контур А (защищённый) — Internal Gateway, NER-сервис и Redis с маппингами токенов. Персональные данные обрабатываются только внутри
  • этого контура

1.3 Топология развёртывания

На диаграмме ниже показана полная топология развёртывания системы, разделённая на четыре зоны безопасности.
Internal Gateway 2. Краткое описание ПО

2.1 Нейроключ

Нейроключ — серверная платформа для управления AI-сервисами, обеспечивающая многопользовательский доступ к языковым моделям.
Платформа предоставляет:

Мультитенантная архитектура с кредитным балансом и раздельным учётом
Аутентификация: JWT, OAuth 2.0, OpenID Connect, LDAP, API-ключи
Каталог моделей — LLM через OpenRouter, OpenAI, Anthropic, Google, xAI, DeepSeek, GigaChat, Moonshot AI
SSE-стриминг ответов, RAG, генерация изображений и видео

Технологический стек

Компонент 

Технология

Порт

Frontend 

React 19 

8888

Backend 

Python / FastAPI

8080

База данных 

PostgreSQL 15 

5432

Кэш 

Redis 7 

6379


2.2 LLM Data Masking Gateway

LLM Data Masking Gateway — прокси-шлюз для защиты персональных данных при работе с языковыми моделями. Шлюз встраивается между
Нейроключом и LLM-провайдерами и обеспечивает:
  • Автоматическое обнаружение PII (ФИО, паспорт, СНИЛС, ИНН, телефоны, email, адреса и др.) с помощью NER-моделей DeepPavlov
  • Маскирование — замена PII на токены-заместители перед отправкой в LLM
  • Демаскирование — восстановление оригинальных данных в ответе
  • Аудит — журналирование всех операций без сохранения PII
Компоненты Контура А (защищённый)

Сервис

Порт

Реплик

RAM

Описание

internal-gateway 

8443

1

1 ГБ 

Маскирование / демаскирование

ner-service 

8090

3

5 ГБ каждый

NER-модель DeepPavlov (load-balanced)

dedoc

1231

3

4 ГБ каждый

Парсинг документов (PDF, DOCX)

redis-protected 

6379

1

512 МБ 

Хранение маппингов токенов


Компоненты Контура Б (рабочий)

Сервис

Порт 

Описание

external-gateway 

8080

Приём запросов, маршрутизация, аудит

external-front 

3000

Веб-интерфейс администрирования Gateway

nginx 

80/443 

Reverse proxy, TLS terminaHon

postgres 

5432

БД masking (аудит, политики)

redis-operaHonal 

6379

Кэш (maxmemory 256MB)

kaUa (Apache KaUa) 

9092

Очередь событий (KRaJ mode)


3. Требования к установке

3.1 Аппаратные требования

Минимальные (dev / staging)

Параметр

Значение

CPU 

8 ядер (x86_64)

RAM

32 ГБ

Диск

100 ГБ SSD

GPU

Опционально — для NER-сервиса (CPU-режим возможен с увеличенным latency, +200-500 мс на запрос)

Сеть

1 Гбит/с


Рекомендуемые (producKon)

Параметр

Значение

CPU

32+ ядер (x86_64)

RAM

128 ГБ

Диск

500 ГБ SSD (NVMe)

GPU

NVIDIA с поддержкой CUDA 12+ (для NER-сервиса DeepPavlov) — рекомендуется NVIDIA T4 или выше

Сеть

10 Гбит/с

Примечание: Каждый экземпляр NER-сервиса требует минимум 5 ГБ RAM. Каждый экземпляр Dedoc требует минимум 4 ГБ RAM. В producHon-
конфигурации рекомендуется 3 экземпляра каждого сервиса, что составляет дополнительно 27 ГБ RAM.

3.2 Программные требования (стороннее ПО)

Компонент

Версия

Назначение

Операционная система

Linux (Astra Linux SE 1.7+, Debian 12+, Ubuntu 22.04+) / macOS / Windows (Docker Desktop)

Хостовая ОС

Docker Engine 

24+ 

Контейнеризация

Docker Compose 

v2 

Оркестрация контейнеров

Kubernetes

1.28+ (для producHon) 

Оркестрация в кластере

Git

2.x 

Управление исходным кодом

Node.js 

22.x 

Сборка фронтенда Нейроключа

Python

3.11 

Бэкенд Нейроключа, NER-сервис

Java

21 (JDK Eclipse Temurin) 

Gateway (Internal и External)

Docker Registry 

—

Локальный реестр контейнеров



3.3 Сетевые требования

Порты

Порт

Протокол

Сервис

Направление

80

HTTP

NGINX (редирект на HTTPS) 

Входящий

443

HTTPS

NGINX (основной) 

Входящий

8080

HTTP

External Gateway 

Внутренний

8443

HTTPS/mTLS

Internal Gateway 

Внутренний

8888

HTTP

Нейроключ Frontend 

Внутренний

8090

HTTP

NER-сервис 

Внутренний

1231

HTTP

Dedoc

Внутренний

3000

HTTP

External Frontend 

Внутренний

5432

TCP

PostgreSQL

Внутренний

6379

TCP

Redis

Внутренний

9092

TCP

Apache Kafka

Внутренний


Исходящий доступ к LLM-провайдерам

Для работы с LLM-моделями необходим исходящий доступ (whitelist) к следующим хостам:

  • openrouter.ai — агрегатор LLM-моделей (основной)
  • api.openai.com — OpenAI (GPT-5.2, GPT Image 1.5)
  • api.anthropic.com — Anthropic (Claude)
  • gigachat.devices.sberbank.ru — GigaChat (Сбер)
  • api.x.ai — xAI (Grok)
  • api.deepseek.com — DeepSeek

mTLS

Для межсервисного взаимодействия между Контуром Б и Контуром А используются mTLS-сертификаты. Необходимо сгенерировать и настроить:
  • CA-сертификат (корневой)
  • Серверный сертификат для Internal Gateway
  • Клиентский сертификат для External Gateway
4. Этапы установки

4.1 Этап 1: Подготовка окружения

Шаг 1. Клонирование репозитория

# Клонирование репозитория
git clone <repo-url> neurokey
cd neurokey

Шаг 2. Проверка предустановленного ПО
# Проверка версий
docker --version # Docker Engine 24+
docker compose version # Docker Compose v2+
git --version # Git 2.x
java --version # Java 21
python3 --version # Python 3.11
node --version # Node.js 22.x
Шаг 3. Структура проекта
После клонирования убедитесь в наличии следующей структуры:
neurokey/
├── neurokey-backend/              # Бэкенд Нейроключа (Python/FastAPI)
│   ├── main.py
│   ├── requirements.txt
│   ├── env.example
│   ├── docker-compose.neurokey-back.yml
│   └── ...
├── neurokey-react/                # Фронтенд Нейроключа (React 19)
│   ├── src/
│   ├── .env.example
│   ├── docker-compose.neurokey-front.yml
│   └── ...
├── llm-data-masking/
│   ├── internal/                  # Контур А (защищённый)
│   │   ├── internal-gateway/      # Java Spring Boot
│   │   ├── ner-service/           # Python FastAPI + DeepPavlov
│   │   ├── docker-compose.yml
│   │   ├── docker-compose.prod.yml
│   │   ├── .env.example
│   │   └── local.sh
│   └── external/                  # Контур Б (рабочий)
│       ├── external-gateway/      # Java Spring Boot
│       ├── external-front/        # React SPA
│       ├── docker-compose.yml
│       ├── docker-compose.prod.yml
│       └── .env.example
└── docker-compose.infra.yml       # Общая инфраструктура
4.2 Этап 2: Развёртывание инфраструктуры (PostgreSQL, Redis)
Шаг 1. Настройка docker-compose.infra.yml
# docker-compose.infra.yml
version: "3.8"
services:
  postgres:
    image: postgres:15-alpine
    container_name: neurokey-postgres
    restart: unless-stopped
    ports:
      - "15432:5432"
    environment:
      POSTGRES_DB: neurokey
      POSTGRES_USER: neurokey
      POSTGRES_PASSWORD: <secure-password>
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U neurokey"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: neurokey-redis
    restart: unless-stopped
    ports:
      - "16379:6379"
    command: redis-server --requirepass <password> --appendonly yes
    volumes:
      - ./redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "<password>", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
Шаг 2. Запуск инфраструктуры
# Запуск инфраструктуры
docker compose -f docker-compose.infra.yml up -d
# Проверка статуса
docker compose -f docker-compose.infra.yml ps
4.3 Этап 3: Развёртывание Нейроключа
Шаг 1. Backend (Python / FastAPI)
cd neurokey-backend
# Настройка переменных окружения
cp env.example .env
# Редактирование .env — ключевые параметры:
# DATABASE_URL=postgresql://neurokey:<password>@localhost:15432/neurokey
# REDIS_URL=redis://:<password>@localhost:16379/0
# OPENROUTER_API_KEY=sk-or-...
# OPENROUTER_API_BASE_URL=http://localhost:8080/v1 # через Gateway!
# SECRET_KEY=<random-secret-32-chars>
# CORS_ORIGINS=["http://localhost:8888"]
# Запуск через Docker
docker compose -f docker-compose.neurokey-back.yml up -d
# Проверка логов
docker compose -f docker-compose.neurokey-back.yml logs -f
Шаг 2. Frontend (React 19)
cd neurokey-react
# Настройка переменных окружения
cp .env.example .env
# VITE_APP_ENV=PROD
# VITE_API_BASE_URL=http://localhost:8080
# Запуск через Docker
docker compose -f docker-compose.neurokey-front.yml up -d
# Фронтенд доступен на порту 8888
curl -I http://localhost:8888
4.4 Этап 4: Развёртывание LLM Data Masking Gateway
Шаг 1. Контур А — Internal (Защищённая зона)
cd llm-data-masking/internal
# Настройка переменных окружения
cp .env.example .env
Ключевые переменные окружения для Контура А:

Переменная 

Описание 

Пример

REDIS_HOST 

Хост Redis (protected) 

redis-protected

REDIS_PORT 

Порт Redis 

6379

REDIS_PASSWORD 

Пароль Redis 

<secure-password>

NER_SERVICE_URLS 

URL-ы NER-сервисов (через запятую) 

http://ner-1:8090,http://ner-2:8090,http://ner-3:8090

TOKEN_TTL 

Время жизни токенов в Redis (сек) 

3600

SSL_ENABLED 

Включение mTLS 

true

SSL_KEYSTORE_PATH 

Путь к хранилищу ключей 

/certs/keystore.p12

SSL_TRUSTSTORE_PATH 

Путь к хранилищу доверенных сертификатов 

/certs/truststore.p12

# Запуск (development — без SSL)
./local.sh
# или
docker compose up -d
# Запуск (production — с SSL и mTLS)
docker compose -f docker-compose.prod.yml up -d
Шаг 2. Контур Б — External (Рабочая зона)
cd llm-data-masking/external
# Настройка переменных окружения
cp .env.example .env
Ключевые переменные окружения для Контура Б:

Переменная

Описание

Пример

INTERNAL_GATEWAY_URL 

URL Internal Gateway 

https://internal-gw:8443

OPENROUTER_API_KEY 

Ключ OpenRouter 

sk-or-...

POSTGRES_HOST 

Хост PostgreSQL 

postgres-masking

POSTGRES_DB 

Имя БД 

masking

POSTGRES_USER 

Пользователь 

masking

POSTGRES_PASSWORD 

Пароль

<secure-password>

KAFKA_BOOTSTRAP_SERVERS 

Адрес Kafka 

kafka:9092

REDIS_HOST 

Хост Redis (operaHonal) 

redis-operational

SSL_CLIENT_CERT_PATH 

Клиентский сертификат mTLS 

/certs/client.p12

# Запуск (development)
docker compose up -d
# Запуск (production)
docker compose -f docker-compose.prod.yml up -d
5. Настройка и проверка

5.1 Настройка интеграции Нейроключ ↔ Gateway

Шаг 1: Перенаправление API-вызовов через Gateway

В конфигурации бэкенда Нейроключа ( .env файл) изменить базовый URL для обращения к LLM:
# Было (прямое обращение):
OPENROUTER_API_BASE_URL=https://openrouter.ai/api/v1
# Стало (через Gateway):
OPENROUTER_API_BASE_URL=http://external-gateway:8080/v1
Шлюз прозрачно проксирует запросы: маскирует PII в запросе, передаёт обезличенный запрос в LLM-провайдер, получает ответ и восстанавливает
замаскированные данные.

Шаг 2: Настройка mTLS (producKon)
# Генерация CA
openssl req -x509 -newkey rsa:4096 -days 365 -nodes \
-keyout ca-key.pem -out ca-cert.pem \
-subj "/CN=Neurokey Internal CA"

# Генерация серверного сертификата (Internal Gateway)
openssl req -newkey rsa:4096 -nodes \
-keyout server-key.pem -out server-req.pem \
-subj "/CN=internal-gateway"
openssl x509 -req -in server-req.pem -days 365 \
-CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial \
-out server-cert.pem

# Генерация клиентского сертификата (External Gateway)
openssl req -newkey rsa:4096 -nodes \
-keyout client-key.pem -out client-req.pem \
-subj "/CN=external-gateway"
openssl x509 -req -in client-req.pem -days 365 \
-CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial \
-out client-cert.pem
Шаг 3: Передача контекста пользователя

Нейроключ передаёт контекст текущего пользователя в HTTP-заголовках при обращении к Gateway:

Заголовок

Описание 

Пример

X-Tenant-Id 

Идентификатор организации 

org-12345

X-User-Id 

Идентификатор пользователя 

user-67890

X-Request-Id 

Уникальный ID запроса (для трассировки) 

req-uuid-v4


5.2 Проверка работоспособности

Health-check эндпоинты

После развёртывания всех компонентов выполните проверку доступности каждого сервиса:

Сервис

Эндпоинт 

Ожидаемый ответ

Нейроключ Backend 

GET /api/config 

200 OK + JSON конфигурации

Нейроключ Backend 

GET /health 

200 OK

External Gateway 

GET /actuator/health 

200 OK {"status":"UP"}

Internal Gateway 

GET /actuator/health 

200 OK {"status":"UP"}

NER Service 

GET /health 

200 OK

Dedoc 

GET /health 

200 OK

# Проверка всех сервисов
echo "=== Нейроключ Backend ==="
curl -s http://localhost:8080/health | jq .

echo "=== External Gateway ==="
curl -s http://localhost:8080/actuator/health | jq .

echo "=== Internal Gateway ==="
curl -sk https://localhost:8443/actuator/health | jq .

echo "=== NER Service ==="
curl -s http://localhost:8090/health | jq .
Интеграционная проверка (end-to-end)
# Тестовый запрос с PII через Gateway
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-or-..." \
-H "X-Tenant-Id: test-org" \
-d '{
"model": "openai/gpt-5.2",
"messages": [
{"role": "user", "content": "Перескажи: Иванов Пётр Сергеевич, паспорт 4510 123456, СНИЛС 123-456-789 00"}
]
}'
5.5 Расположение логов

Компонент

Расположение логов 

Команда просмотра

Нейроключ Backend 






# Проверить лимиты памяти контейнера
docker stats ner-service-1

# Увеличить лимит в docker-compose.yml:
# services:
# ner-service:
# deploy:
# resources:
# limits:
# memory: 6G
# reservations:
# memory: 5G

# Если RAM на сервере ограничена — уменьшить число реплик до 1
Проблема: Redis — ошибка подключения

Симптомы: RedisConnectionException: Unable to connect to Redis в логах Gateway.

Решение:
# 1. Проверить, что Redis запущен
docker ps | grep redis

# 2. Проверить доступность
docker exec -it redis-protected redis-cli -a <password> ping
# Ожидаемый ответ: PONG

# 3. Проверить переменные окружения
# REDIS_HOST, REDIS_PORT, REDIS_PASSWORD должны совпадать

# 4. Проверить сетевую связность (Docker network)
docker network inspect <network-name>
Проблема: mTLS — ошибка рукопожатия

Симптомы: SSLHandshakeException при обращении External Gateway к Internal Gateway.

Решение:
# 1. Проверить сертификаты
openssl s_client -connect internal-gateway:8443 \
-cert client-cert.pem -key client-key.pem -CAfile ca-cert.pem

# 2. Убедиться, что:
# - Клиентский сертификат подписан тем же CA
# - CN клиентского сертификата совпадает с ожидаемым
# - Сертификаты не истекли
openssl x509 -in client-cert.pem -noout -dates
openssl x509 -in server-cert.pem -noout -dates

# 3. Проверить формат хранилища ключей (PKCS12)
keytool -list -keystore keystore.p12 -storetype PKCS12
Проблема: Gateway — 502 Bad Gateway

Симптомы: NGINX возвращает 502 при обращении к Gateway.

Решение:
# 1. Проверить, что External Gateway запущен
docker ps | grep external-gateway

# 2. Проверить health endpoint
curl -s http://localhost:8080/actuator/health | jq .

# 3. Проверить логи на ошибки
docker logs external-gateway --tail 100

# 4. Проверить конфигурацию NGINX upstream
# nginx.conf: proxy_pass http://external-gateway:8080;
Проблема: LLM не отвечает или таймаут

Симптомы: запросы к LLM завершаются таймаутом ( 504 Gateway Timeout).

Решение:
# 1. Проверить исходящий доступ к LLM-провайдерам
curl -s https://openrouter.ai/api/v1/models | head -c 200

# 2. Проверить API-ключ
curl -s https://openrouter.ai/api/v1/models \
-H "Authorization: Bearer sk-or-..." | jq '.data | length'

# 3. Увеличить таймауты в конфигурации Gateway
# GATEWAY_LLM_TIMEOUT=120s (по умолчанию 60s)

# 4. Проверить firewall / proxy для исходящих подключений
Проблема: Маскирование не работает

Симптомы: персональные данные передаются в LLM без маскирования.

Решение:
# 1. Проверить, что Internal Gateway доступен
curl -sk https://internal-gateway:8443/actuator/health | jq .

# 2. Проверить, что NER-сервис работает
curl -s http://ner-service-1:8090/health | jq .

# 3. Тестировать NER напрямую
curl -X POST http://ner-service-1:8090/ner \
-H "Content-Type: application/json" \
-d '{"text": "Иванов Пётр, СНИЛС 123-456-789 00"}'

# 4. Проверить политики маскирования
curl -s http://localhost:8080/admin/policies \
-H "Authorization: Bearer <admin-token>" | jq .

# 5. Проверить, что запросы от Нейроключа идут через Gateway
# (OPENROUTER_API_BASE_URL должен указывать на Gateway)
Проблема: Kafka — ошибка продюсера

Симптомы: KafkaProducerException в логах External Gateway.

Решение:
# 1. Проверить статус Kafka
docker logs kafka --tail 50

# 2. Проверить топики
docker exec -it kafka kafka-topics.sh --bootstrap-server localhost:9092 --list

# 3. При необходимости пересоздать топики
docker exec -it kafka kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic masking-events --partitions 3 --replication-factor 1
Проблема: PostgreSQL — нехватка подключений

Симптомы: FATAL: too many connections в логах PostgreSQL.

Решение:
# 1. Проверить текущее число подключений
docker exec -it neurokey-postgres psql -U neurokey -c \
"SELECT count(*) FROM pg_stat_activity;"

# 2. Увеличить max_connections
# В postgresql.conf или через переменную окружения:
# POSTGRES_MAX_CONNECTIONS=200

# 3. Настроить connection pooling (PgBouncer)
5.5 Расположение логов

Компонент

Расположение логов 

Команда просмотра

Нейроключ Backend 

stdout контейнера 

docker logs neurokey-backend -f

Нейроключ Frontend 

stdout контейнера 

docker logs neurokey-frontend -f

External Gateway 

/app/logs/gateway.log + stdout 

docker logs external-gateway -f

Internal Gateway 

/app/logs/gateway.log + stdout 

docker logs internal-gateway -f

NER Service 

stdout контейнера 

docker logs ner-service-1 -f

PostgreSQL 

/var/lib/postgresql/data/log/ 

docker logs neurokey-postgres -f

Redis

stdout контейнера 

docker logs redis-protected -f

Apache KaUa 

/var/log/kafka/ 

docker logs kafka -f

NGINX 

/var/log/nginx/ 

docker logs nginx -f


5.6 Контакты технической поддержки

При возникновении проблем, не описанных в данном разделе:

  • Внутренний трекер — создайте тикет в системе управления задачами проекта
  • Логи — приложите к обращению логи всех затронутых компонентов (последние 500 строк)
  • Воспроизведение — опишите шаги для воспроизведения проблемы
  • Окружение — укажите версии компонентов ( docker compose version, java --version, etc.)