Triển khai AWS — từng bước
deploy/aws = Mô-đun Terraform: ECS Fargate (Web + MCP) phía sau ALB, RDS Postgres, CloudWatch logs.
1. Điều kiện tiên quyết
- Terraform ≥ 1.5 + AWS credentials (
aws configure/ env vars) có quyền tạo VPC-scoped resources, ECS, RDS, ALB, IAM. - Ba images trong registry mà ECS có thể pull (ECR, hoặc GHCR public).
2. Khởi tạo
cd deploy/aws
terraform init
3. Áp dụng
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)"
Tạo: RDS Postgres (appdb), ECS cluster, Fargate services cho Web + MCP, ALB (Web tại /, MCP tại /mcp), security groups, CloudWatch log group, ADOT (AWS Distro for OpenTelemetry) collector sidecar trong mỗi task. Ứng dụng xuất OTLP tới sidecar, nó gửi traces tới X-Ray, metrics tới CloudWatch (EMF, namespace cmind); logs vẫn trên awslogs driver dưới dạng JSON compact. Discovery được bật cho Web. Task role cấp sidecar quyền truy cập X-Ray + CloudWatch — không cần chạy collector riêng.
Sử dụng default VPC/subnets của tài khoản để đơn giản. Đối với production, kết nối VPC riêng, private subnets, HTTPS listener (ACM cert).
4. Lấy URLs
terraform output web_url # ALB root
terraform output mcp_url # ALB /mcp
Mở web_url, đăng nhập với owner (bắt buộc thay đổi password lần đăng nhập đầu tiên).
5. Thêm node agents (riêng biệt)
Fargate không cho phép privileged/DinD, nên chạy agents ở nơi khác trỏ tới web_url:
- ECS on EC2 — capacity provider với các task definitions
privileged = truechạycmind-node-agent. - EKS — Helm chart (kubernetes.md) với
nodeAgent.privileged=true.
Đặt NodeAgent__MainUrl=<web_url>, NodeAgent__AdvertiseUrl=<agent reachable url>, NodeAgent__JwtSecret=<discovery_join_token>. Agents tự đăng ký — xem ../operations/node-discovery.md.
6. Xác minh
aws logs tail /ecs/cmind --since 5m # compact JSON logs
curl -s "$(terraform output -raw web_url)/version"
Ghi chú production
- Thêm HTTPS listener + ACM certificate; hạn chế security group của ALB.
- Lưu trữ secrets trong AWS Secrets Manager / SSM, inject qua task-definition
secretsthay vì plaintextenvironment. - Bật RDS Multi-AZ + backups.
- Traces (X-Ray), metrics (CloudWatch EMF), logs (CloudWatch Logs) được kết nối tự động qua ADOT sidecar; correlate trên
trace_id. Xem ../operations/logging.md. - Ứng dụng đã trỏ
OTEL_EXPORTER_OTLP_ENDPOINTtới in-task sidecar; repoint tới external collector nếu bạn thích tập trung hóa.
Copy-trading agent + Secrets Manager (S5)
deploy/aws/copy-agent.tf thêm copy-agent ECS Fargate service lưu trữ CopyEngineSupervisor (App:Copy:Enabled=true, App:Features:CopyTrading=true) mà không có ALB — worker giữ long-lived cTrader sockets. DB connection string được lưu trữ trong AWS Secrets Manager, injected thông qua task's secrets block (execution role được cấp secretsmanager:GetSecretValue chỉ trên secret đó), không phải plaintext env. Mỗi task's NodeName mặc định là hostname của container (unique per Fargate task), nên DB lease attributes chạy profiles per task — hai tasks không bao giờ host kép một. Scale copy_agent_count để thêm copy capacity; DataProtection key ring được chia sẻ thông qua Postgres, nên bất kỳ task nào cũng có thể decrypt lưu trữ Open API tokens.