Déploiement AWS — étape par étape
deploy/aws = Module Terraform : ECS Fargate (Web + MCP) derrière ALB, RDS Postgres, logs CloudWatch.
1. Prérequis
- Terraform ≥ 1.5 + identifiants AWS (
aws configure/ variables env) avec droits pour créer des ressources VPC, ECS, RDS, ALB, IAM. - Trois images dans le registre qu'ECS peut récupérer (ECR, ou GHCR public).
2. Initialiser
cd deploy/aws
terraform init
3. Appliquer
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)"
Crée : RDS Postgres (appdb), cluster ECS, services Fargate pour Web + MCP, ALB (Web à /,
MCP à /mcp), groupes de sécurité, groupe de logs CloudWatch, collecteur ADOT (AWS Distro for
OpenTelemetry) sidecar dans chaque tâche. L'app exporte OTLP vers le sidecar, qui envoie
les traces à X-Ray, les métriques à CloudWatch (EMF, espace de noms cmind) ; les logs restent sur
le driver awslogs au format JSON compact. Discovery activé pour Web. Le rôle de tâche accorde au sidecar
l'accès en écriture à X-Ray + CloudWatch — pas de collecteur à exécuter soi-même.
Utilise le VPC/subnets par défaut du compte pour la brièveté. En production, configurez votre propre VPC, subnets privés, écouteur HTTPS (certificat ACM).
4. Obtenir les URLs
terraform output web_url # racine ALB
terraform output mcp_url # ALB /mcp
Ouvrez web_url, connectez-vous avec le propriétaire (changement de mot de passe forcé à la première connexion).
5. Ajouter des agents nœud (séparé)
Fargate n'autorise pas privilégié/DinD, donc exécutez les agents ailleurs pointant vers web_url :
- ECS sur EC2 — fournisseur de capacité avec les définitions de tâche
privileged = trueexécutantcmind-node-agent. - EKS — graphique Helm (kubernetes.md) avec
nodeAgent.privileged=true.
Définissez NodeAgent__MainUrl=<web_url>, NodeAgent__AdvertiseUrl=<agent reachable url>,
NodeAgent__JwtSecret=<discovery_join_token>. Les agents s'auto-enregistrent — voir
../operations/node-discovery.md.
6. Vérifier
aws logs tail /ecs/cmind --since 5m # logs JSON compact
curl -s "$(terraform output -raw web_url)/version"
Notes de production
- Ajoutez un écouteur HTTPS + certificat ACM ; limitez le groupe de sécurité ALB.
- Stockez les secrets dans AWS Secrets Manager / SSM, injectez-les via les
secretsde la définition de tâche au lieu deenvironmenten texte brut. - Activez RDS Multi-AZ + sauvegardes.
- Traces (X-Ray), métriques (CloudWatch EMF), logs (CloudWatch Logs) câblés automatiquement via
le sidecar ADOT ; corrélez sur
trace_id. Voir ../operations/logging.md. - L'app pointe déjà
OTEL_EXPORTER_OTLP_ENDPOINTvers le sidecar en tâche ; reconfigurez vers le collecteur externe si vous préférez centraliser.
Agent copy-trading + Secrets Manager (S5)
deploy/aws/copy-agent.tf ajoute un service ECS Fargate copy-agent hébergeant CopyEngineSupervisor
(App:Copy:Enabled=true, App:Features:CopyTrading=true) sans ALB — worker tenant des sockets
cTrader longue durée. La chaîne de connexion à la base de données est stockée dans AWS Secrets Manager,
injectée via le bloc secrets de la tâche (rôle d'exécution accordé secretsmanager:GetSecretValue sur
ce seul secret), pas d'env en texte brut. Le NodeName de chaque tâche est par défaut le nom d'hôte de son
conteneur (unique par tâche Fargate), donc les attributs de bail DB exécutent les profils par tâche —
deux tâches n'hébergent jamais deux fois le même. Augmentez copy_agent_count pour ajouter de la
capacité de copie ; l'anneau de clés DataProtection est partagé via Postgres, donc n'importe quelle tâche
peut décrypter les tokens Open API stockés.