Развертывание AWS — пошаг за шагом
deploy/aws = Terraform модуль: ECS Fargate (Web + MCP) за ALB, RDS Postgres, CloudWatch логи.
1. Предварительные требования
- Terraform ≥ 1.5 + учетные данные AWS (
aws configure/ переменные окружения) с правами на создание ресурсов в области VPC, ECS, RDS, ALB, IAM. - Три образа в реестре, которые ECS может вытянуть (ECR, или GHCR публичный).
2. Инициализация
cd deploy/aws
terraform init
3. Применить
terraform apply \
-var image_registry=ghcr.io/your-org/cmind \
-var image_tag=1.0.0 \
-var owner_email=you@example.com \
-var owner_password='Change-Me-Str0ng!' \
-var pg_password="$(openssl rand -hex 16)" \
-var discovery_join_token="$(openssl rand -hex 24)"
Создает: RDS Postgres (appdb), кластер ECS, Fargate сервисы для Web + MCP, ALB (Web в /, MCP в /mcp), группы безопасности, группа логов CloudWatch, ADOT (AWS Distro for OpenTelemetry) collector sidecar в каждой задаче. Приложение экспортирует OTLP в sidecar, который отправляет трассы в X-Ray, метрики в CloudWatch (EMF, пространство имен cmind); логи остаются на драйвере awslogs в виде компактного JSON. Discovery включен для Web. Роль задачи предоставляет sidecar доступ на запись в X-Ray + CloudWatch — нет необходимости запускать collector самостоятельно.
Для краткости использует VPC/подсети по умолчанию учетной записи. Для production подключите свои VPC, приватные подсети, HTTPS слушатель (сертификат ACM).
4. Получить URLs
terraform output web_url # ALB root
terraform output mcp_url # ALB /mcp
Откройте web_url, войдите как владелец (принудительная смена пароля при первом входе).
5. Добавить агентов узлов (отдельно)
Fargate запрещает privileged/DinD, поэтому запустите агентов в другом месте, указывая на web_url:
- ECS на EC2 — capacity provider с
privileged = trueопределениями задач, запускающихcmind-node-agent. - EKS — диаграмма Helm (kubernetes.md) с
nodeAgent.privileged=true.
Установите NodeAgent__MainUrl=<web_url>, NodeAgent__AdvertiseUrl=<agent reachable url>, NodeAgent__JwtSecret=<discovery_join_token>. Агенты автоматически регистрируются — см. ../operations/node-discovery.md.
6. Проверка
aws logs tail /ecs/cmind --since 5m # компактные JSON логи
curl -s "$(terraform output -raw web_url)/version"
Примечания для production
- Добавьте HTTPS слушатель + сертификат ACM; ограничьте группу безопасности ALB.
- Сохраните секреты в AWS Secrets Manager / SSM, инъектируйте через
secretsопределения задачи вместо открытого текстаenvironment. - Включите RDS Multi-AZ + резервные копии.
- Трассы (X-Ray), метрики (CloudWatch EMF), логи (CloudWatch Logs) подключаются автоматически через ADOT sidecar; коррелируйте по
trace_id. См. ../operations/logging.md. - Приложение уже указывает
OTEL_EXPORTER_OTLP_ENDPOINTна встроенный в задачу sidecar; перенаправьте на внешний collector, если вы предпочитаете централизацию.
Copy-trading агент + Secrets Manager (S5)
deploy/aws/copy-agent.tf добавляет сервис copy-agent ECS Fargate, размещающий CopyEngineSupervisor (App:Copy:Enabled=true, App:Features:CopyTrading=true) с без ALB — работник, держащий долгоживущие сокеты cTrader. Строка подключения БД хранится в AWS Secrets Manager, инъектируется через блок secrets задачи (роль выполнения предоставляет secretsmanager:GetSecretValue только на этот секрет), не открытый текст env. NodeName каждой задачи по умолчанию равен имени хоста контейнера (уникален на задачу Fargate), поэтому аренда БД характеризует профили запуска на задачу — две задачи никогда не размещают одно вместе. Масштабируйте copy_agent_count для добавления емкости копирования; кольцо ключей DataProtection делится через Postgres, поэтому любая задача может расшифровать сохраненные токены Open API.