Deployment

Docker Compose

The recommended deployment method runs all services as Docker containers.

Full Stack

cd redirect
docker compose up -d

This starts:

Management API

cd api
docker compose up -d

Starts the .NET API and its PostgreSQL database.

UI

cd ui
docker compose up -d

Starts the dashboard and landing page. This compose file includes the redirect compose file via the include directive.

Service Dependencies

click-router         → mongo, redis, clickhouse, fluvio (topics), rabbitmq, domains
click-router-api     → mongo, redis, rabbitmq
click-tracker        → redis, fluvio (topics)
click-aggregator     → clickhouse, fluvio (topics)
click-aggregator-api → clickhouse (after migrations)
route-verifier       → mongo, rabbitmq, gglsbl-rest
route-icon-worker    → rabbitmq, minio
domain-verifier      → mongo, rabbitmq
domains              → (standalone)
management-api       → postgresql, elasticsearch, click-router-api, click-aggregator-api
dashboard            → management-api

Environment Configuration

Rust Services

Configuration is loaded from TOML files in each service’s config/ directory. The APP_RUN_MODE environment variable selects the profile:

Docker containers default to APP_RUN_MODE=production.

Management API

Configured via appsettings.json and environment variables:

Variable Description
ConnectionStrings__DefaultConnection PostgreSQL connection string
Keycloak__Authority Keycloak realm URL
Keycloak__Audience JWT audience
ApiSettings__ClickRouterApi__BaseUrl Click Router API URL
ApiSettings__ClickAggregatorApi__BaseUrl Click Aggregator API URL

Docker Images

Multi-stage builds minimize image sizes:

Health Checks

All services expose health endpoints. Docker Compose healthchecks monitor service status automatically:

make ps    # Show service status and health
make logs  # Tail service logs

Networking

All services share the shortas-net Docker bridge network. Inter-service communication uses container hostnames (e.g., mongo, clickhouse, click-router-api).

AWS Deployment

For production deployments, Shortas can be deployed to AWS using Terraform. This replaces local services with AWS managed equivalents for scalability and reliability.

Service Mapping

Local Service AWS Replacement
MongoDB DynamoDB
PostgreSQL RDS Aurora PostgreSQL Serverless v2
Redis ElastiCache Redis
MinIO S3
RabbitMQ Amazon MQ (RabbitMQ)
Keycloak AWS Cognito
ClickHouse EC2 (self-managed)
All services ECS Fargate

Prerequisites

Quick Start

# Initialize Terraform
cd infra/aws/terraform/environments/dev
terraform init

# Configure variables
cp terraform.tfvars.example terraform.tfvars
# Edit terraform.tfvars with your settings

# Deploy infrastructure
terraform apply

# Build and push Docker images
cd ../scripts
./build-push-images.sh dev

# Deploy services to ECS
./deploy-services.sh dev

Environments

Two environments are provided:

Feature Dev Prod
NAT Gateway Single Per-AZ
RDS Instances 1 2+ (Multi-AZ)
Redis Nodes 1 3 (Primary + replicas)
ECS Spot Yes No
Cognito MFA Optional Required
Backup Retention 3 days 14 days

Authentication with AWS Cognito

AWS deployments use Cognito instead of Keycloak for authentication:

Configure the dashboard with Cognito endpoints:

REACT_APP_COGNITO_ISSUER_URL=https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxx
REACT_APP_COGNITO_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx

Configure the .NET API with appsettings.Aws.json:

{
  "Authentication": {
    "Provider": "Cognito",
    "Cognito": {
      "UserPoolId": "${COGNITO_USER_POOL_ID}",
      "Authority": "${COGNITO_ISSUER_URL}"
    }
  }
}

Monitoring

CloudWatch provides:

Terraform Outputs

After deployment, retrieve important values:

terraform output

# Outputs include:
# - cognito_user_pool_id
# - cognito_hosted_ui_url
# - alb_dns_name
# - ecr_repository_urls
# - dynamodb_tables

See infra/aws/terraform/README.md for detailed documentation.