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

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.)