cd terraform/environments/staging
terraform init
terraform plan -out=tfplan
terraform apply tfplan
Verify:
Capture Outputs:
cd cdk
npm install
cdk deploy --all --require-approval never
Verify:
# Database credentials
aws secretsmanager create-secret \
--name forge/staging/database \
--secret-string '{"username":"forge","password":"CHANGE_ME"}'
# Anthropic API key
aws secretsmanager create-secret \
--name forge/staging/anthropic \
--secret-string '{"api_key":"CHANGE_ME"}'
# Okta SSO credentials
aws secretsmanager create-secret \
--name forge/staging/okta \
--secret-string '{"client_id":"CHANGE_ME","client_secret":"CHANGE_ME","domain":"CHANGE_ME"}'
# JWT secret
aws secretsmanager create-secret \
--name forge/staging/jwt \
--secret-string '{"secret":"CHANGE_ME"}'
Verify:
cd api
pip install -r requirements.txt
export DATABASE_URL="postgresql://forge:PASSWORD@RDS_ENDPOINT:5432/forge"
alembic upgrade head
Verify:
# Create admin user
python scripts/create_admin_user.py
# Create default blueprints
python scripts/create_default_blueprints.py
Verify:
cd api
# Build image
docker build -t forge-api:v1.0.0 .
# Tag and push to ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com
docker tag forge-api:v1.0.0 ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-api:v1.0.0
docker push ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-api:v1.0.0
Verify:
# Update image tag in manifests
kubectl apply -f k8s/api-deployment.yaml
kubectl apply -f k8s/api-service.yaml
kubectl apply -f k8s/api-ingress.yaml
# Wait for rollout
kubectl rollout status deployment/forge-api -n forge-api
Verify:
# Get load balancer URL
kubectl get ingress -n forge-api
# Test health endpoint
curl https://api.forge.staging.example.com/health
# Test OpenAPI docs
curl https://api.forge.staging.example.com/docs
Verify:
cd cli
npm install
npm run build
npm pack
Verify:
npm install -g ./forge-cli-1.0.0.tgz
forge config set api-url https://api.forge.staging.example.com
forge config set auth-method okta
# Test login
forge login
# Test workspace list
forge list
Verify:
cd portal
npm install
# Set environment variables
cat > .env.production << EOF
NEXT_PUBLIC_API_URL=https://api.forge.staging.example.com
NEXT_PUBLIC_WS_URL=wss://api.forge.staging.example.com/ws
EOF
npm run build
Verify:
npm install -g vercel
vercel --prod
docker build -t forge-portal:v1.0.0 .
docker tag forge-portal:v1.0.0 ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-portal:v1.0.0
docker push ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-portal:v1.0.0
kubectl apply -f k8s/portal-deployment.yaml
kubectl apply -f k8s/portal-service.yaml
kubectl apply -f k8s/portal-ingress.yaml
npm run build
npm run export
aws s3 sync out/ s3://forge-portal-staging/
aws cloudfront create-invalidation --distribution-id DIST_ID --paths "/*"
Verify:
Test 1: User Authentication
Test 2: WorkSpace Provisioning (Portal)
Test 3: WorkSpace Provisioning (CLI)
forge launch --bundle STANDARD --os Windows --blueprint default
forge list
forge describe WORKSPACE_ID
Test 4: Lucy AI Chat
Test 5: Cost Dashboard
Test 6: Budget Enforcement
Test 7: Theme Switching
Test 8: Accessibility
# Test API response time
curl -w "@curl-format.txt" -o /dev/null -s https://api.forge.staging.example.com/api/v1/workspaces
# Expected: < 500ms
Verify:
Basic Security Checks:
# Check Prometheus
kubectl port-forward -n forge-system svc/prometheus 9090:9090
# Open http://localhost:9090
# Check Grafana
kubectl port-forward -n forge-system svc/grafana 3000:3000
# Open http://localhost:3000
Verify:
# Trigger test alert
aws cloudwatch put-metric-data \
--namespace Forge/API \
--metric-name ErrorRate \
--value 10 \
--unit Percent
Verify:
cd terraform/environments/production
terraform init
terraform plan -out=tfplan
# Review plan carefully
terraform apply tfplan
# Use strong, unique passwords for production
aws secretsmanager create-secret --name forge/production/database --secret-string '...'
aws secretsmanager create-secret --name forge/production/anthropic --secret-string '...'
aws secretsmanager create-secret --name forge/production/okta --secret-string '...'
aws secretsmanager create-secret --name forge/production/jwt --secret-string '...'
cd api
export DATABASE_URL="postgresql://forge:PASSWORD@PROD_RDS_ENDPOINT:5432/forge"
alembic upgrade head
python scripts/create_admin_user.py
python scripts/create_default_blueprints.py
# Build and push production image
docker build -t forge-api:v1.0.0 .
docker tag forge-api:v1.0.0 ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-api:v1.0.0-prod
docker push ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/forge-api:v1.0.0-prod
# Deploy with blue/green strategy
kubectl apply -f k8s/production/api-deployment.yaml
kubectl rollout status deployment/forge-api -n forge-api
cd portal
cat > .env.production << EOF
NEXT_PUBLIC_API_URL=https://api.forge.example.com
NEXT_PUBLIC_WS_URL=wss://api.forge.example.com/ws
EOF
npm run build
vercel --prod
# Import users from CSV
python scripts/create_users.py --csv users.csv
# Assign roles
python scripts/assign_roles.py --user alice@example.com --role team_lead
python scripts/assign_roles.py --user bob@example.com --role engineer
# Set team budgets
python scripts/set_budgets.py --team engineering --amount 10000
python scripts/set_budgets.py --team data-science --amount 15000
# Set user budgets
python scripts/set_budgets.py --user alice@example.com --amount 2000
kubectl rollout undo deployment/forge-api -n forge-api
kubectl rollout status deployment/forge-api -n forge-api
vercel rollback
# Or for Kubernetes:
kubectl rollout undo deployment/forge-portal -n forge-portal
cd api
alembic downgrade -1
cd terraform/environments/production
terraform plan -destroy -out=tfplan
# Review carefully before applying
Deployment is considered successful when:
Deployment Date: _____ **Deployed By**: _________ Environment: [ ] Staging [ ] Production Version: v1.0.0 Status: [ ] In Progress [ ] Complete [ ] Rolled Back