Версия: 1.0 / 2026-06-22
Режимы: Docker Compose (small), K3s (medium), K8s (large)
| Профиль | Размер (пользователей) | Инструмент | Нод | RAM/CPU baseline |
|---|---|---|---|---|
| Small | 1–50 | Docker Compose | 1 | 8 GB RAM, 4 vCPU |
| Medium | 50–200 | K3s | 2–3 | 16 GB RAM / нода, 8 vCPU |
| Large | 200+ | Full Kubernetes | 5+ | 32 GB RAM / нода, 16 vCPU |
Примечание: K3s/K8s-манифесты — roadmap, будут реализованы в отдельной задаче (§8).
| Сервис | Образ | Порт | Зачем | Обязателен? |
|---|---|---|---|---|
| MongoDB | mongo:6.0 |
27017 | Основная БД | Да |
| Redis | redis:7.2 |
6379 | Кэш, pub/sub, Socket.IO state | Да |
| RabbitMQ | rabbitmq:3.13-management |
5672 (AMQP), 15672 (UI) | Message broker, очереди workers | Да |
| Meilisearch | getmeili/meilisearch:v1.15 |
7700 | Полнотекстовый поиск | Нет (если ENABLE_SEARCH=false) |
| Qdrant | qdrant/qdrant:v1.13.6 |
6333 (REST), 6334 (gRPC) | Векторный поиск (RAG) | Нет (если ENABLE_QDRANT=false) |
| Temporal | temporalio/auto-setup:1.26.2 |
7233 (gRPC), 8233 (Web UI) | Durable execution для ботов | Нет (если ENABLE_TEMPORAL=false) |
| Backend | ${REGISTRY}/smarty-backend:${VERSION} |
3000 | API монолит (REST + WS + workers) | Да |
| Frontend | ${REGISTRY}/smarty-frontend:${VERSION} |
80, 443 | Nginx + React SPA | Да |
| Sender | ${REGISTRY}/smarty-sender:${VERSION} |
— | Сервис отправки email/документов | Да |
Temporal и Qdrant нужны только при использовании AI-ботов с durable execution / RAG. При ENABLE_TEMPORAL=false и ENABLE_QDRANT=false их образы не запускаются.
mongo, redis, rabbitmq (инфраструктура — уровень 0)
└── meilisearch, qdrant, temporal (инфраструктура — уровень 1, опционально)
└── backend (API-монолит — зависит от mongo, redis, rabbitmq)
└── frontend (nginx reverse-proxy — зависит от backend)
sender (зависит только от rabbitmq)
# Скопировать и заполнить .env
cp .env.example .env
# Запустить все сервисы
docker compose -f docker-compose.prod.yml --profile small up -d
# Проверить статус
docker compose -f docker-compose.prod.yml ps
# Smoke-check
bash scripts/smoke-check.sh localhost
docker compose -f docker-compose.prod.yml --profile small down
docker compose -f docker-compose.prod.yml --profile infra up -d
Все переменные задаются через .env файл. Шаблон — .env.example в корне репозитория.
| Переменная | По умолчанию | Описание |
|---|---|---|
MONGO_HOST |
mongo |
Хост MongoDB (имя контейнера) |
MONGO_PORT |
27017 |
Порт MongoDB |
MONGO_USER |
smarty |
Пользователь MongoDB |
MONGO_PASSWORD |
– | Пароль MongoDB (без значения не запустится) |
MONGO_DB |
smarty |
Имя базы данных |
MONGO_INITDB_ROOT_USERNAME |
smarty |
Root-пользователь MongoDB (инициализация) |
MONGO_INITDB_ROOT_PASSWORD |
– | Root-пароль MongoDB |
REDIS_HOST |
redis |
Хост Redis |
REDIS_PORT |
6379 |
Порт Redis |
REDIS_PASSWORD |
– | Пароль Redis (requirepass) |
RABBITMQ_HOST |
rabbitmq |
Хост RabbitMQ |
RABBITMQ_USER |
smarty |
Пользователь RabbitMQ |
RABBITMQ_PASSWORD |
– | Пароль RabbitMQ |
| Переменная | По умолчанию | Описание |
|---|---|---|
ENABLE_SEARCH |
true |
Включить Meilisearch |
ENABLE_QDRANT |
false |
Включить Qdrant (RAG) |
ENABLE_TEMPORAL |
false |
Включить Temporal (durable execution) |
| Переменная | По умолчанию | Описание |
|---|---|---|
AI_PROVIDER_OPENAI_KEY |
– | API-ключ OpenAI |
AI_PROVIDER_OPENAI_BASE_URL |
https://api.openai.com/v1 |
Базовый URL OpenAI API |
AI_PROVIDER_ANTHROPIC_KEY |
– | API-ключ Anthropic |
AI_PROVIDER_GOOGLE_KEY |
– | API-ключ Google Gemini |
AI_PROVIDER_DEEPSEEK_KEY |
– | API-ключ DeepSeek |
SMARTY_AI_DEPLOYMENT_PROFILE |
onprem |
Профиль AI: onprem или cloud |
SEARXNG_URL |
http://127.0.0.1:8888 |
URL SearXNG для web_search tool |
| Переменная | По умолчанию | Описание |
|---|---|---|
JWT_SECRET |
– | Секрет для JWT (минимум 32 символа) |
SESSION_SECRET |
– | Секрет для сессионных cookie |
SECURE_MASTER_KEY |
– | Мастер-ключ шифрования |
CAPTCHA_SECRET_KEY |
– | reCAPTCHA secret key |
AUTH_ZITADEL_ENABLED |
false |
Включить Zitadel SSO |
AUTH_ZITADEL_ISSUER |
– | Zitadel issuer URL |
AUTH_ZITADEL_CLIENT_ID |
– | Zitadel client ID |
AUTH_ZITADEL_CLIENT_SECRET |
– | Zitadel client secret |
| Переменная | По умолчанию | Описание |
|---|---|---|
BACKEND_PORT |
3000 |
Порт backend на хосте |
FRONTEND_PORT |
80 |
HTTP-порт frontend на хосте |
FRONTEND_SSL_PORT |
443 |
HTTPS-порт frontend на хосте |
VERSION |
latest |
Тег образов |
REGISTRY |
ghcr.io/smarty |
Container registry |
NODE_ENV |
production |
Окружение Node |
MONGO_URI |
(собирается из MONGO_*) | Полный URI подключения к MongoDB |
RABBITMQ_URL |
(собирается из RABBITMQ_*) | Полный AMQP URL |
MEILI_HOST |
http://meilisearch:7700 |
URL Meilisearch |
MEILI_MASTER_KEY |
– | Мастер-ключ Meilisearch |
QDRANT_URL |
http://qdrant:6333 |
URL Qdrant REST API |
QDRANT_API_KEY |
– | API-ключ Qdrant |
TEMPORAL_ADDRESS |
temporal:7233 |
Адрес Temporal gRPC |
FILESTORE_LOCAL_ID |
– | ID для LocalStorage (опционально) |
Полный список всех поддерживаемых ENV-переменных — в smarty-backend-stable/config/default.js.
| Компонент | Метод | Периодичность |
|---|---|---|
| MongoDB | mongodump |
Ежедневно |
| Redis | SAVE / копирование appendonly.aof |
Ежедневно |
| Meilisearch | volume snapshot (meili_data) |
Еженедельно |
| Qdrant | volume snapshot (qdrant_data) |
Еженедельно |
| Temporal | volume snapshot (temporal_data) |
Еженедельно (если включён) |
| RabbitMQ | volume snapshot (rabbitmq_data) |
Еженедельно |
docker exec smarty-mongo mongodump \
--username "${MONGO_USER:-smarty}" \
--password "${MONGO_PASSWORD}" \
--authenticationDatabase admin \
--out /tmp/smarty-dump-$(date +%Y%m%d)
docker cp smarty-mongo:/tmp/smarty-dump-$(date +%Y%m%d) ./backup/mongo/
docker cp ./backup/mongo/smarty-dump-20260622/ smarty-mongo:/tmp/restore/
docker exec smarty-mongo mongorestore \
--username "${MONGO_USER:-smarty}" \
--password "${MONGO_PASSWORD}" \
--authenticationDatabase admin \
--drop /tmp/restore/smarty-dump-20260622/
docker exec smarty-redis redis-cli -a "${REDIS_PASSWORD}" BGSAVE
docker cp smarty-redis:/data/appendonly.aof ./backup/redis/
См. scripts/backup.sh — готовый скрипт для ежедневного бэкапа через cron:
0 3 * * * /path/to/smarty-code/scripts/backup.sh
Скрипт делает дамп MongoDB и volume-снапшот Meilisearch.
Скрипт scripts/smoke-check.sh проверяет доступность всех HTTP-сервисов:
bash scripts/smoke-check.sh [HOST]
Проверяемые эндпоинты:
| Сервис | URL | Ожидаемый ответ |
|---|---|---|
| Backend health | http://HOST:BACKEND_PORT/_health |
HTTP 200, {"ok":true} |
| Frontend | http://HOST:80 |
HTTP 200 |
| RabbitMQ management | http://HOST:15672 |
HTTP 200 (Basic auth: RABBITMQ_USER:RABBITMQ_PASSWORD) |
| Meilisearch | http://HOST:7700/health |
HTTP 200 (header Authorization: Bearer MEILI_MASTER_KEY) |
| Qdrant | http://HOST:6333 |
HTTP 200 (если включён) |
| Temporal Web UI | http://HOST:8233 |
HTTP 200 (если включён) |
На данный момент существуют три блокера, которые мешают полноценной публичной поставке self-hosted. Все они требуют доработки.
Проблема: smarty-backend-stable/Dockerfile и smarty-crm-frontend/Dockerfile используют GITHUB_TOKEN как build-arg для доступа к приватным npm-пакетам через git config url."https://${GITHUB_TOKEN}@".insteadOf "ssh://git@".
Что нужно сделать:
.npmrc внутри образа (меньше раскрытия, чем GITHUB_TOKEN), либоdocker-compose.prod.yml).Текущий статус: в docker-compose.prod.yml используется pre-built образы, build не выполняется. Блокер актуален при необходимости кастомной сборки из исходников.
Проблема: smarty-sender-master/Dockerfile стартует с:
FROM gitlab.cloudstechnologies.com:4567/backend/smarty-sender/ubuntu:20.04
Этот образ недоступен за пределами внутренней сети.
Что нужно сделать:
ubuntu:20.04 / node:22-slim)Текущий статус: блокер. В docker-compose.prod.yml образ sender — placeholder.
Проблема: smarty-crm-frontend/nginx/site.conf содержит жёстко заданные server_name:
server_name whatever.smartycrm.com;
server_name whatever.smartycrm.ru;
И в Dockerfile значение подставляется через sed из CI_ENVIRONMENT_NAME.
Что нужно сделать:
server_name через ENV-переменную (напр. NGINX_SERVER_NAME) илиsite.conf из шаблона при старте контейнера (entrypoint script) илиserver_name _; (catch-all) для self-hosted развёртыванияТекущий статус: блокер. В текущем состоянии frontend обслуживает только домены *.smartycrm.com.
Статус: roadmap. Реализация — в отдельной задаче. Здесь зафиксирована целевая структура.
# Предполагаемая структура
namespaces:
- smarty-system # инфраструктурные операторы (cert-manager, ingress)
- smarty-infra # БД и middleware (MongoDB, Redis, RabbitMQ)
- smarty-app # прикладные сервисы (backend, frontend, sender)
- smarty-ai # AI-сервисы (Qdrant, Temporal, voice-microservice)
# backend
backend:
replicas: 2
resources:
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
# frontend
frontend:
replicas: 2
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
# sender
sender:
replicas: 1
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1000m"