Компонент | Технология | Порт |
Frontend | React 19 | 8888 |
Backend | Python / FastAPI | 8080 |
База данных | PostgreSQL 15 | 5432 |
Кэш | Redis 7 | 6379 |
Сервис | Порт | Реплик | 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) |
Параметр | Значение |
CPU | 8 ядер (x86_64) |
RAM | 32 ГБ |
Диск | 100 ГБ SSD |
GPU | Опционально — для NER-сервиса (CPU-режим возможен с увеличенным latency, +200-500 мс на запрос) |
Сеть | 1 Гбит/с |
Параметр | Значение |
CPU | 32+ ядер (x86_64) |
RAM | 128 ГБ |
Диск | 500 ГБ SSD (NVMe) |
GPU | NVIDIA с поддержкой CUDA 12+ (для NER-сервиса DeepPavlov) — рекомендуется NVIDIA T4 или выше |
Сеть | 10 Гбит/с |
Компонент | Версия | Назначение |
Операционная система | 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 | — | Локальный реестр контейнеров |
Порт | Протокол | Сервис | Направление |
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 | Внутренний |
# Клонирование репозитория
git clone <repo-url> neurokey
cd neurokey
# Проверка версий
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 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 # Общая инфраструктура # 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 # Запуск инфраструктуры
docker compose -f docker-compose.infra.yml up -d
# Проверка статуса
docker compose -f docker-compose.infra.yml ps 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 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 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 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 # Было (прямое обращение):
OPENROUTER_API_BASE_URL=https://openrouter.ai/api/v1
# Стало (через Gateway):
OPENROUTER_API_BASE_URL=http://external-gateway:8080/v1 # Генерация 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 Заголовок | Описание | Пример |
X-Tenant-Id | Идентификатор организации | org-12345 |
X-User-Id | Идентификатор пользователя | user-67890 |
X-Request-Id | Уникальный ID запроса (для трассировки) | req-uuid-v4 |
Сервис | Эндпоинт | Ожидаемый ответ |
Нейроключ 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 . # Тестовый запрос с 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"}
]
}' Компонент | Расположение логов | Команда просмотра |
Нейроключ Backend | ||
# Проверить лимиты памяти контейнера
docker stats ner-service-1
# Увеличить лимит в docker-compose.yml:
# services:
# ner-service:
# deploy:
# resources:
# limits:
# memory: 6G
# reservations:
# memory: 5G
# Если RAM на сервере ограничена — уменьшить число реплик до 1 # 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> # 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 # 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; # 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 для исходящих подключений # 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) # 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 # 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) Компонент | Расположение логов | Команда просмотра |
Нейроключ 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 |