Deployment AWS — passo dopo passo
deploy/aws = modulo Terraform: ECS Fargate (Web + MCP) dietro ALB, RDS Postgres, CloudWatch logs.
1. Prerequisiti
- Terraform ≥ 1.5 + credenziali AWS (
aws configure/ env vars) con diritti per creare risorse VPC-scoped, ECS, RDS, ALB, IAM. - Tre immagini nel registry ECS che può scaricare (ECR, o GHCR pubblico).
2. Inizializza
cd deploy/aws
terraform init
3. Applica
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)"
Crea: RDS Postgres (appdb), cluster ECS, servizi Fargate per Web + MCP, ALB (Web a /,
MCP a /mcp), security groups, gruppo log CloudWatch, ADOT (AWS Distro for
OpenTelemetry) collector sidecar in ogni task. L'app esporta OTLP al sidecar, che invia
traces a X-Ray, metriche a CloudWatch (EMF, namespace cmind); i log restano su
driver awslogs come JSON compatto. Discovery attivo per Web. Il task role concede al sidecar
accesso scrittura X-Ray + CloudWatch — nessun collector da gestire.
Usa il VPC/subnet predefiniti dell'account per brevità. Per produzione, collegare proprio VPC, subnet private, listener HTTPS (certificato ACM).
4. Ottieni gli URL
terraform output web_url # radice ALB
terraform output mcp_url # ALB /mcp
Apri web_url, accedi con il proprietario ( cambio password forzato al primo login).
5. Aggiungi agenti nodo (separato)
Fargate non consente privileged/DinD, quindi eseguire gli agenti altrove puntando a web_url:
- ECS su EC2 — capacity provider con
privileged = truetask definitions eseguendocmind-node-agent. - EKS — Helm chart (kubernetes.md) con
nodeAgent.privileged=true.
Impostare NodeAgent__MainUrl=<web_url>, NodeAgent__AdvertiseUrl=<url raggiungibile dall'agente>,
NodeAgent__JwtSecret=<discovery_join_token>. Gli agenti si auto-registrano — vedere
../operations/node-discovery.md.
6. Verifica
aws logs tail /ecs/cmind --since 5m # log JSON compatti
curl -s "$(terraform output -raw web_url)/version"
Note di produzione
- Aggiungere listener HTTPS + certificato ACM; restringere il security group ALB.
- Memorizzare i secret in AWS Secrets Manager / SSM, iniettare tramite
secretsnella task definition invece di environment in testo chiaro. - Abilitare RDS Multi-AZ + backup.
- Traces (X-Ray), metriche (CloudWatch EMF), log (CloudWatch Logs) cablati automaticamente tramite
sidecar ADOT; correlare su
trace_id. Vedere ../operations/logging.md. - L'app punta già
OTEL_EXPORTER_OTLP_ENDPOINTal sidecar in-task; riorientare a collector esterno se si preferisce centralizzare.
Copy-trading agent + Secrets Manager (S5)
deploy/aws/copy-agent.tf aggiunge servizio ECS Fargate copy-agent che ospita CopyEngineSupervisor
(App:Copy:Enabled=true, App:Features:CopyTrading=true) senza ALB — worker che mantiene socket cTrader
long-lived. La stringa di connessione DB memorizzata in AWS Secrets Manager, iniettata attraverso
il secrets block del task (execution role con secretsmanager:GetSecretValue solo su quel secret),
non env in testo chiaro. Il NodeName di ogni task default al suo container hostname (unico per Fargate task), così
gli attributi di lease DB assegnano i profili in esecuzione per task — due task non hostano mai doppione uno.
Scalare copy_agent_count per aggiungere capacità di copy; il key ring DataProtection condiviso tramite Postgres, così
qualsiasi task può decrittare i token Open API memorizzati.