Skip to content

Infrastructure Architecture

Compact reference for Digital Thai MoCA / BrainDI platform infrastructure.

AWS account: 564141170168 · Region: ap-southeast-1

Repositories & Deploy Targets

RepositoryDeploy targetRuntime
automoca-web-appAWS Amplify → CloudFrontStatic SPA
braindi-backoffice-frontendAWS Amplify → CloudFrontStatic SPA
automoca-api-servicesECS (braindi-backend) + ALBGo API (port 8080)
automoca-aiserviceECS (automoca-ai-service-dev)Python Kafka worker

automoca-api-services is deployed in AWS as braindi-backend (ECR, ECS, secrets).

Topology

DNS (Route53 → CloudFront / ALB)

EnvironmentPatient appBackofficeAPI
Prod DTMdtm.aimet.techbackoffice.dtm.aimet.techapi.dtm.aimet.tech
Prod BrainDIbraindi.aimet.techbackoffice.braindi.aimet.techapi.braindi.aimet.tech
Devdev.dtm.aimet.techbackoffice.dev.dtm.aimet.techapi.dev.braindi.aimet.tech
Sirirajsiriraj.*.aimet.techbackoffice.siriraj.*.aimet.techapi.siriraj.*.aimet.tech
  • Frontends: CloudFront distributions
  • Prod API: braindi-prod-1392139716.ap-southeast-1.elb.amazonaws.com
  • Dev API: dev-alb-452655975.ap-southeast-1.elb.amazonaws.com

ECS

ClusterServiceTask definition
braindi-backendbraindi-backend-devbraindi-backend-dev
braindi-backendbraindi-backend-prodbraindi-backend-prod
automoca-ai-service-devautomoca-ai-service-dev-service-*automoca-ai-service-dev
automoca-ai-service-devautomoca-ai-service-prod-service-*automoca-ai-service-prod
global-asr-serviceShared ASR platformKafka + WebSocket (/ws/v1/speech)

Global ASR Integration

braindi-backend uses global-asr-service in two ways:

ModePathUse case
Real-timePatient app → WSS /web/tests/ws/speech → backend WebSocket reverse proxyASR_WS_URL/ws/v1/speechLive transcription during MoCA test (via @bream-is-a-fish/aimet-asr-react-client)
AsyncBackend → Kafka input.asr → global-asr-service → Kafka braindi.output.asr → backend consumerBatch/offline audio transcription

Backend env: ASR_WS_URL (WebSocket base URL), ASR_KAFKA_* (async topics/brokers).

ECR

RepositoryImage example
braindi-backend564141170168.dkr.ecr.ap-southeast-1.amazonaws.com/braindi-backend:<tag>
automoca-ai-service564141170168.dkr.ecr.ap-southeast-1.amazonaws.com/automoca-ai-service:<sha>

Amplify

AppRepositoryDefault domain
auto-moca-web-appautomoca-web-appddvcmytiooo28.amplifyapp.com
braindi-backoffice-frontendbraindi-backoffice-frontendd36kp5f38yecvq.amplifyapp.com

Build: yarn installyarn build → artifacts from dist/. Sentry secrets injected from AWS Secrets Manager at build time.

Data Stores

ServiceResourceNotes
MongoDBExternal (Atlas)MONGO_URI via Secrets Manager
Redisbraindi-backend-prod-0001-001ElastiCache, cache.t4g.micro
S3automoca-web-backend-dev/prodTest files, media
S3audio-temp-automoca-devTemporary audio
S3automoca-data, automoca-img-temp, moca-materialsAssets / temp
S3braindi-video-testVideo test files

Messaging

ComponentTopics / channels
Kafka (IAM auth in prod)ASR: input.asrbraindi.output.asr
KafkaAI: input.ai.braindioutput.ai.braindi
SNSbraindi-predict-result-delay-alarm-dev/prod
global-asr-service (ECS)Real-time: WSS /ws/v1/speech (proxied by backend). Async: consumes input.asr, produces braindi.output.asr; S3: global-asr-service-dev
automoca-aiservice (ECS)Consumes input.ai.braindi, produces output.ai.braindi

Secrets Manager

Secret prefixUsed by
braindi-backend-dev, braindi-backend-prodGo API
dev/prod/automoca/ai-service/*AI service (GCP, Azure, API keys)

CI/CD

RepoTriggerPipeline
automoca-api-servicesPush to devGitHub Actions → ECR → ECS braindi-backend-dev
automoca-aiservicePush to dev / mainGitHub Actions → ECR → ECS dev / update prod task def
automoca-web-appGit pushAmplify auto-deploy
braindi-backoffice-frontendGit pushAmplify auto-deploy

Backend deploy role: arn:aws:iam::564141170168:role/braindi-backend-actions-runner

External Dependencies (outside this AWS account)

ServicePurpose
Google Cloud Speech-to-TextSpeech recognition
Google Gemini / Azure OpenAIAI scoring (via aiservice)
CFC proxy (VITE_CFC_PROXY_ENDPOINT)Backoffice file upload
SentryFrontend error tracking