2026-01-14 04:56:20 +00:00
|
|
|
# Cost-Optimized Multi-Provider Workspace
|
|
|
|
|
|
|
|
|
|
This workspace demonstrates cost optimization through intelligent provider specialization:
|
|
|
|
|
|
|
|
|
|
- **Hetzner**: Compute tier (CPX21 servers at €20.90/month) - best price/performance
|
|
|
|
|
- **AWS**: Managed services (RDS, ElastiCache, SQS) - reliability without ops overhead
|
|
|
|
|
- **DigitalOcean**: CDN and object storage - affordable content delivery
|
|
|
|
|
|
|
|
|
|
## Why This Architecture?
|
|
|
|
|
|
|
|
|
|
### Cost Comparison
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
Cost-Optimized Architecture:
|
|
|
|
|
├── Hetzner compute: €72.70/month (~$78)
|
|
|
|
|
├── AWS managed services: $115/month
|
|
|
|
|
└── DigitalOcean CDN: $64/month
|
|
|
|
|
Total: ~$280/month
|
|
|
|
|
|
|
|
|
|
All-AWS Equivalent:
|
|
|
|
|
├── EC2 instances: ~$200+
|
|
|
|
|
├── RDS database: ~$150+
|
|
|
|
|
├── ElastiCache: ~$50+
|
|
|
|
|
├── CloudFront CDN: ~$100+
|
|
|
|
|
└── Other services: ~$50+
|
|
|
|
|
Total: ~$600+/month
|
|
|
|
|
|
|
|
|
|
Savings: ~$320/month (53% reduction)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Architecture Benefits
|
|
|
|
|
|
|
|
|
|
**Hetzner Advantages**:
|
|
|
|
|
- Best price/performance for compute (€20.90/month for 4 vCPU/8GB)
|
|
|
|
|
- Powerful Load Balancer (€10/month)
|
|
|
|
|
- Fast networking (10Gbps)
|
|
|
|
|
- EU data residency (GDPR compliant)
|
|
|
|
|
|
|
|
|
|
**AWS Advantages**:
|
|
|
|
|
- Managed RDS: Automatic backups, failover, patching
|
|
|
|
|
- ElastiCache: Redis cluster with automatic failover
|
|
|
|
|
- SQS: Scalable message queue (pay per message)
|
|
|
|
|
- CloudWatch: Comprehensive monitoring
|
|
|
|
|
|
|
|
|
|
**DigitalOcean Advantages**:
|
|
|
|
|
- CDN: Cost-effective content delivery ($25/month)
|
|
|
|
|
- Spaces: Object storage at scale ($15/month)
|
|
|
|
|
- Simple pricing and management
|
|
|
|
|
- Edge nodes for regional distribution
|
|
|
|
|
|
|
|
|
|
## Architecture Overview
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
┌────────────────────────────────────────────────┐
|
|
|
|
|
│ Client Requests │
|
|
|
|
|
└─────────────────┬────────────────────────────────┘
|
|
|
|
|
│ HTTPS/HTTP
|
|
|
|
|
┌────────▼─────────┐
|
|
|
|
|
│ DigitalOcean │
|
|
|
|
|
│ CDN / Spaces │
|
|
|
|
|
└────────┬─────────┘
|
|
|
|
|
│
|
|
|
|
|
┌────────────┼────────────┐
|
|
|
|
|
│ │ │
|
|
|
|
|
┌────▼──────┐ ┌──▼────────┐ ┌─▼──────┐
|
|
|
|
|
│ Hetzner │ │ AWS │ │ DO │
|
|
|
|
|
│ Compute │ │ Managed │ │ CDN │
|
|
|
|
|
│ (Load LB) │ │ Services │ │ │
|
|
|
|
|
└────┬──────┘ └──┬────────┘ └────────┘
|
|
|
|
|
│VPN Tunnel │
|
|
|
|
|
┌────▼──────────▼────┐
|
|
|
|
|
│ Hetzner Network │ AWS VPC DO Spaces
|
|
|
|
|
│ 10.0.0.0/16 ◄──► 10.1.0.0/16 ◄──► nyc3
|
|
|
|
|
│ 3x CPX21 Servers │ RDS + Cache CDN +
|
|
|
|
|
│ │ + SQS Backups
|
|
|
|
|
└────────────────────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
|
|
### 1. Cloud Accounts
|
|
|
|
|
|
|
|
|
|
- **Hetzner**: Account with API token
|
|
|
|
|
- **AWS**: Account with access keys
|
|
|
|
|
- **DigitalOcean**: Account with API token
|
|
|
|
|
|
|
|
|
|
### 2. Environment Variables
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
export HCLOUD_TOKEN="MC4wNTI1YmE1M2E4YmE0YTQzMTQyZTdlODYy"
|
|
|
|
|
export AWS_ACCESS_KEY_ID="AKIA1234567890ABCDEF"
|
|
|
|
|
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG+j/zI0m1234567890ab"
|
|
|
|
|
export DIGITALOCEAN_TOKEN="dop_v1_abc123def456ghi789jkl012mno"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. CLI Tools
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Install and verify
|
|
|
|
|
which hcloud && hcloud version
|
|
|
|
|
which aws && aws --version
|
|
|
|
|
which doctl && doctl version
|
|
|
|
|
which nickel && nickel --version
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 4. SSH Keys
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Hetzner
|
|
|
|
|
hcloud ssh-key create --name provisioning-key
|
|
|
|
|
--public-key-from-file ~/.ssh/id_rsa.pub
|
|
|
|
|
|
|
|
|
|
# AWS
|
|
|
|
|
aws ec2 create-key-pair --key-name provisioning-key
|
|
|
|
|
--query 'KeyMaterial' --output text > provisioning-key.pem
|
|
|
|
|
chmod 600 provisioning-key.pem
|
|
|
|
|
|
|
|
|
|
# DigitalOcean
|
|
|
|
|
doctl compute ssh-key create provisioning-key
|
|
|
|
|
--public-key-from-file ~/.ssh/id_rsa.pub
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Deployment
|
|
|
|
|
|
|
|
|
|
### Step 1: Configure the Workspace
|
|
|
|
|
|
|
|
|
|
Edit `workspace.ncl`:
|
|
|
|
|
|
|
|
|
|
```nickel
|
|
|
|
|
# Update networking if needed
|
|
|
|
|
compute_tier.primary_servers = hetzner.Server & {
|
|
|
|
|
server_type = "cpx21",
|
|
|
|
|
count = 3,
|
|
|
|
|
location = "nbg1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Update AWS region if needed
|
|
|
|
|
managed_services.database = aws.RDS & {
|
|
|
|
|
instance_class = "db.t3.small",
|
|
|
|
|
region = "us-east-1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Update CDN endpoints
|
|
|
|
|
cdn_tier.cdn.endpoints = [{
|
|
|
|
|
name = "app-cdn",
|
|
|
|
|
origin = "content.example.com"
|
|
|
|
|
}]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Edit `config.toml`:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[cost_tracking]
|
|
|
|
|
monthly_budget = 300
|
|
|
|
|
budget_alert_threshold = 280
|
|
|
|
|
|
|
|
|
|
[application.cache]
|
|
|
|
|
max_memory = "250MB"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Step 2: Validate Configuration
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# Validate Nickel syntax
|
|
|
|
|
nickel export workspace.ncl | jq . > /dev/null
|
|
|
|
|
|
|
|
|
|
# Verify provider access
|
|
|
|
|
hcloud context use default
|
|
|
|
|
aws sts get-caller-identity
|
|
|
|
|
doctl account get
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Step 3: Deploy
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
chmod +x deploy.nu
|
|
|
|
|
./deploy.nu
|
|
|
|
|
|
|
|
|
|
# Or with debug output
|
|
|
|
|
./deploy.nu --debug
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Step 4: Verify Deployment
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Hetzner compute resources
|
|
|
|
|
hcloud server list
|
|
|
|
|
hcloud load-balancer list
|
|
|
|
|
|
|
|
|
|
# AWS managed services
|
|
|
|
|
aws rds describe-db-instances --region us-east-1
|
|
|
|
|
aws elasticache describe-cache-clusters --region us-east-1
|
|
|
|
|
aws sqs list-queues --region us-east-1
|
|
|
|
|
|
|
|
|
|
# DigitalOcean CDN
|
|
|
|
|
doctl compute cdn list
|
|
|
|
|
doctl compute spaces list
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Post-Deployment Configuration
|
|
|
|
|
|
|
|
|
|
### 1. Connect Hetzner Compute to AWS Database
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Get Hetzner server IPs
|
|
|
|
|
hcloud server list --format ID,PublicIPv4
|
|
|
|
|
|
|
|
|
|
# Get RDS endpoint
|
|
|
|
|
aws rds describe-db-instances --region us-east-1
|
|
|
|
|
--query 'DBInstances[0].Endpoint.Address'
|
|
|
|
|
|
|
|
|
|
# On Hetzner server, install PostgreSQL client
|
|
|
|
|
ssh root@hetzner-server
|
|
|
|
|
apt-get update && apt-get install postgresql-client
|
|
|
|
|
|
|
|
|
|
# Test connection to RDS
|
|
|
|
|
psql -h app-db.abc123.us-east-1.rds.amazonaws.com
|
|
|
|
|
-U admin -d postgres -c "SELECT now();"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2. Configure Application for Services
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# Application configuration file
|
|
|
|
|
cat > /var/www/app/.env << EOF
|
|
|
|
|
DATABASE_HOST=app-db.abc123.us-east-1.rds.amazonaws.com
|
|
|
|
|
DATABASE_PORT=5432
|
|
|
|
|
DATABASE_USER=admin
|
|
|
|
|
DATABASE_PASSWORD=your_password
|
|
|
|
|
DATABASE_NAME=app_db
|
|
|
|
|
|
|
|
|
|
REDIS_HOST=app-cache.abc123.ng.0001.euc1.cache.amazonaws.com
|
|
|
|
|
REDIS_PORT=6379
|
|
|
|
|
|
|
|
|
|
SQS_QUEUE_URL=https://sqs.us-east-1.amazonaws.com/123456789/app-queue
|
|
|
|
|
|
|
|
|
|
CDN_ENDPOINT=https://content.example.com
|
|
|
|
|
SPACES_ENDPOINT=https://app-content.nyc3.digitaloceanspaces.com
|
|
|
|
|
SPACES_KEY=your_spaces_key
|
|
|
|
|
SPACES_SECRET=your_spaces_secret
|
|
|
|
|
|
|
|
|
|
ENVIRONMENT=production
|
|
|
|
|
EOF
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. Setup CDN and Object Storage
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Configure Spaces bucket
|
|
|
|
|
doctl compute spaces create app-content --region nyc3
|
|
|
|
|
|
|
|
|
|
# Get Spaces endpoint
|
|
|
|
|
doctl compute spaces list
|
|
|
|
|
|
|
|
|
|
# Configure CDN endpoint
|
|
|
|
|
doctl compute cdn create --origin content.example.com
|
|
|
|
|
|
|
|
|
|
# Upload test file
|
|
|
|
|
aws s3 cp test.html s3://app-content/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 4. Configure Application Queue
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# Get SQS queue URL
|
|
|
|
|
aws sqs list-queues --region us-east-1
|
|
|
|
|
|
|
|
|
|
# Create queue if needed
|
|
|
|
|
aws sqs create-queue --queue-name app-queue --region us-east-1
|
|
|
|
|
|
|
|
|
|
# Test queue
|
|
|
|
|
aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/123456789/app-queue
|
|
|
|
|
--message-body "test message" --region us-east-1
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 5. Deploy Application
|
|
|
|
|
|
|
|
|
|
SSH to Hetzner servers:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Get server IPs
|
|
|
|
|
SERVERS=$(hcloud server list --format PublicIPv4 --no-header)
|
|
|
|
|
|
|
|
|
|
# Deploy to each server
|
|
|
|
|
for server in $SERVERS; do
|
|
|
|
|
ssh -o StrictHostKeyChecking=no root@$server << 'DEPLOY'
|
|
|
|
|
cd /var/www
|
|
|
|
|
git clone https://github.com/your-org/app.git
|
|
|
|
|
cd app
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
./deploy.sh
|
|
|
|
|
DEPLOY
|
|
|
|
|
done
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Monitoring and Cost Control
|
|
|
|
|
|
|
|
|
|
### Cost Monitoring
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Hetzner billing
|
|
|
|
|
# Manual via console: https://console.hetzner.cloud/billing
|
|
|
|
|
|
|
|
|
|
# AWS cost tracking
|
|
|
|
|
aws ce get-cost-and-usage
|
|
|
|
|
--time-period Start=2024-01-01,End=2024-01-31
|
|
|
|
|
--granularity MONTHLY
|
|
|
|
|
--metrics BlendedCost
|
|
|
|
|
--group-by Type=DIMENSION,Key=SERVICE
|
|
|
|
|
|
|
|
|
|
# DigitalOcean billing
|
|
|
|
|
doctl billing get
|
|
|
|
|
|
|
|
|
|
# Real-time cost status
|
|
|
|
|
aws ce get-cost-and-usage
|
|
|
|
|
--time-period Start=$(date -d '1 day ago' +%Y-%m-%d),End=$(date +%Y-%m-%d)
|
|
|
|
|
--granularity DAILY
|
|
|
|
|
--metrics BlendedCost
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Application Performance Monitoring
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# RDS performance insights
|
|
|
|
|
aws pi describe-dimension-keys
|
|
|
|
|
--service-type RDS
|
|
|
|
|
--identifier arn:aws:rds:us-east-1:123456789:db:app-db
|
|
|
|
|
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S)
|
|
|
|
|
--end-time $(date -u +%Y-%m-%dT%H:%M:%S)
|
|
|
|
|
--period-in-seconds 60
|
|
|
|
|
--metric db.load.avg
|
|
|
|
|
--partition-by Dimension
|
|
|
|
|
--dimension-group.group-by WAIT_EVENT
|
|
|
|
|
|
|
|
|
|
# ElastiCache monitoring
|
|
|
|
|
aws cloudwatch get-metric-statistics
|
|
|
|
|
--namespace AWS/ElastiCache
|
|
|
|
|
--metric-name CPUUtilization
|
|
|
|
|
--dimensions Name=CacheClusterId,Value=app-cache
|
|
|
|
|
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S)
|
|
|
|
|
--end-time $(date -u +%Y-%m-%dT%H:%M:%S)
|
|
|
|
|
--period 300
|
|
|
|
|
--statistics Average
|
|
|
|
|
|
|
|
|
|
# SQS monitoring
|
|
|
|
|
aws sqs get-queue-attributes
|
|
|
|
|
--queue-url https://sqs.us-east-1.amazonaws.com/123456789/app-queue
|
|
|
|
|
--attribute-names All
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Alerts Configuration
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# CPU threshold alert
|
|
|
|
|
aws cloudwatch put-metric-alarm
|
|
|
|
|
--alarm-name hetzner-cpu-high
|
|
|
|
|
--alarm-description "Alert when Hetzner CPU > 80%"
|
|
|
|
|
--metric-name CPUUtilization
|
|
|
|
|
--threshold 80
|
|
|
|
|
--comparison-operator GreaterThanThreshold
|
|
|
|
|
|
|
|
|
|
# Queue depth alert
|
|
|
|
|
aws cloudwatch put-metric-alarm
|
|
|
|
|
--alarm-name sqs-queue-depth-high
|
|
|
|
|
--alarm-description "Alert when SQS queue depth > 1000"
|
|
|
|
|
--metric-name ApproximateNumberOfMessagesVisible
|
|
|
|
|
--threshold 1000
|
|
|
|
|
--comparison-operator GreaterThanThreshold
|
|
|
|
|
|
|
|
|
|
# Cache eviction alert
|
|
|
|
|
aws cloudwatch put-metric-alarm
|
|
|
|
|
--alarm-name elasticache-eviction-rate-high
|
|
|
|
|
--alarm-description "Alert when cache eviction rate > 10%"
|
|
|
|
|
--metric-name EvictionRate
|
|
|
|
|
--namespace AWS/ElastiCache
|
|
|
|
|
--threshold 10
|
|
|
|
|
--comparison-operator GreaterThanThreshold
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Scaling and Optimization
|
|
|
|
|
|
|
|
|
|
### Scale Hetzner Compute
|
|
|
|
|
|
|
|
|
|
Edit `workspace.ncl`:
|
|
|
|
|
|
|
|
|
|
```nickel
|
|
|
|
|
compute_tier.primary_servers = hetzner.Server & {
|
|
|
|
|
count = 5, # Increase from 3
|
|
|
|
|
server_type = "cpx21"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Redeploy:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
./deploy.nu
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Upgrade Database
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Modify RDS instance class
|
|
|
|
|
aws rds modify-db-instance
|
|
|
|
|
--db-instance-identifier app-db
|
|
|
|
|
--db-instance-class db.t3.medium
|
|
|
|
|
--apply-immediately
|
|
|
|
|
--region us-east-1
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Add Caching Layer
|
|
|
|
|
|
|
|
|
|
Already configured with ElastiCache. Optimize by adjusting:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[application.cache]
|
|
|
|
|
max_memory = "512MB"
|
|
|
|
|
eviction_policy = "allkeys-lru"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Increase Queue Throughput
|
|
|
|
|
|
|
|
|
|
SQS automatically scales. Monitor with:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
aws sqs get-queue-attributes
|
|
|
|
|
--queue-url https://sqs.us-east-1.amazonaws.com/123456789/app-queue
|
|
|
|
|
--attribute-names ApproximateNumberOfMessages
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Cost Optimization Tips
|
|
|
|
|
|
|
|
|
|
1. **Hetzner Compute**: CPX21 is sweet spot. Consider CX21 for lower workloads
|
|
|
|
|
2. **AWS RDS**: Use t3.small for dev, t3.medium for prod with burst capability
|
|
|
|
|
3. **ElastiCache**: 2 nodes with auto-failover. Monitor eviction rates
|
|
|
|
|
4. **SQS**: Pay per request, no fixed costs. Good for variable load
|
|
|
|
|
5. **DigitalOcean CDN**: Cache more aggressively (86400s TTL for assets)
|
|
|
|
|
6. **Spaces**: Use lifecycle rules to delete old files automatically
|
|
|
|
|
|
|
|
|
|
### Cost Reduction Checklist
|
|
|
|
|
|
|
|
|
|
- Reduce Hetzner servers from 3 to 2 (saves ~€21/month)
|
|
|
|
|
- Downgrade RDS to db.t3.micro for dev (saves ~$40/month)
|
|
|
|
|
- Reduce ElastiCache nodes from 2 to 1 (saves ~$12/month)
|
|
|
|
|
- Archive old CDN content (savings from Spaces storage)
|
|
|
|
|
- Use reserved capacity on AWS (20-30% discount)
|
|
|
|
|
|
|
|
|
|
Potential total savings: ~$100+/month with right-sizing.
|
|
|
|
|
|
|
|
|
|
## Troubleshooting
|
|
|
|
|
|
|
|
|
|
### Issue: Hetzner Can't Connect to RDS
|
|
|
|
|
|
|
|
|
|
**Diagnosis**:
|
|
|
|
|
```bash
|
|
|
|
|
# SSH to Hetzner server
|
|
|
|
|
ssh root@hetzner-server
|
|
|
|
|
|
|
|
|
|
# Test connectivity
|
|
|
|
|
nc -zv app-db.abc123.us-east-1.rds.amazonaws.com 5432
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Solution**:
|
|
|
|
|
- Check VPN tunnel is active
|
|
|
|
|
- Verify RDS security group allows port 5432 from Hetzner network
|
|
|
|
|
- Check route table on both sides
|
|
|
|
|
|
|
|
|
|
### Issue: High Database Latency
|
|
|
|
|
|
|
|
|
|
**Diagnosis**:
|
|
|
|
|
```bash
|
|
|
|
|
# Check RDS performance
|
|
|
|
|
aws pi describe-dimension-keys --service-type RDS ...
|
|
|
|
|
|
|
|
|
|
# Check network latency
|
|
|
|
|
ping -c 5 app-db.abc123.us-east-1.rds.amazonaws.com
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Solution**:
|
|
|
|
|
- Upgrade RDS instance class
|
|
|
|
|
- Increase ElastiCache size to reduce database queries
|
|
|
|
|
- Check network bandwidth between providers
|
|
|
|
|
|
|
|
|
|
### Issue: Queue Processing Slow
|
|
|
|
|
|
|
|
|
|
**Diagnosis**:
|
|
|
|
|
```bash
|
|
|
|
|
# Check queue depth and age
|
|
|
|
|
aws sqs get-queue-attributes
|
|
|
|
|
--queue-url <queue-url>
|
|
|
|
|
--attribute-names All
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Solution**:
|
|
|
|
|
- Scale up application servers processing queue
|
|
|
|
|
- Reduce visibility timeout if messages are timing out
|
|
|
|
|
- Check application logs for processing errors
|
|
|
|
|
|
|
|
|
|
## Cleanup
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Hetzner
|
|
|
|
|
hcloud server delete hetzner-app-1 hetzner-app-2 hetzner-app-3
|
|
|
|
|
hcloud load-balancer delete app-lb
|
|
|
|
|
|
|
|
|
|
# AWS
|
|
|
|
|
aws rds delete-db-instance --db-instance-identifier app-db --skip-final-snapshot
|
|
|
|
|
aws elasticache delete-cache-cluster --cache-cluster-id app-cache
|
|
|
|
|
aws sqs delete-queue --queue-url https://sqs.us-east-1.amazonaws.com/123456789/app-queue
|
|
|
|
|
|
|
|
|
|
# DigitalOcean
|
|
|
|
|
doctl compute spaces delete app-content
|
|
|
|
|
doctl compute cdn delete cdn-app
|
|
|
|
|
doctl compute droplet delete edge-node-1 edge-node-2 edge-node-3
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Next Steps
|
|
|
|
|
|
|
|
|
|
1. Implement application logging to CloudWatch
|
|
|
|
|
2. Set up Hetzner monitoring dashboard
|
|
|
|
|
3. Configure auto-scaling based on queue depth
|
|
|
|
|
4. Implement database read replicas for read-heavy workloads
|
|
|
|
|
5. Add WAF protection to Hetzner load balancer
|
|
|
|
|
6. Implement cross-region backups to Spaces
|
|
|
|
|
7. Set up cost anomaly detection alerts
|
|
|
|
|
|
|
|
|
|
## Support
|
|
|
|
|
|
|
|
|
|
For issues or questions:
|
|
|
|
|
|
|
|
|
|
- Review the cost-optimized deployment guide
|
|
|
|
|
- Check provider-specific documentation
|
|
|
|
|
- Monitor costs with: `aws ce get-cost-and-usage ...`
|
|
|
|
|
- Review deployment logs: `./deploy.nu --debug`
|
|
|
|
|
|
|
|
|
|
## Files
|
|
|
|
|
|
|
|
|
|
- `workspace.ncl`: Infrastructure definition (Nickel)
|
|
|
|
|
- `config.toml`: Provider credentials and settings
|
|
|
|
|
- `deploy.nu`: Deployment orchestration (Nushell)
|
2026-01-14 05:01:36 +00:00
|
|
|
- `README.md`: This file
|