Skip to main content

Ravenhelm.ai Landing Page

Enterprise AI Platform public landing page hosted on AWS with multi-environment support.


Overview

Static marketing website for the Ravenhelm AI Platform, deployed to AWS using Infrastructure as Code (Terraform) with automated CI/CD via GitLab.

EnvironmentURLPurpose
Productionravenhelm.aiLive public site
Staginghrafngrima.comTesting and iteration

Repository: gitlab.ravenhelm.dev/nwalker85/ravenhelm-ai
AWS Account: 122441748701
Infrastructure: Terraform-managed (S3 + CloudFront + Route53 + ACM)


Architecture

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Domain │────▶│ Route53 DNS │────▶│ CloudFront │────▶│ S3 Bucket │
│ │ │ (A Records) │ │ (CDN + SSL) │ │ (Static Files) │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘


┌─────────────────┐
│ ACM Certificate│
│ (SSL/TLS) │
└─────────────────┘

Key Design Decisions:

  • Multi-environment: Separate staging (hrafngrima.com) and production (ravenhelm.ai)
  • CloudFront CDN: Global distribution with low latency
  • Origin Access Control (OAC): Secure S3 access (no public bucket)
  • ACM Certificate: Free SSL/TLS per environment
  • SPA Routing: Custom error responses (404/403 → index.html)
  • Infrastructure as Code: All resources managed via Terraform with environment variables

Environment Comparison

ComponentProductionStaging
Domainravenhelm.ai (+ www)hrafngrima.com
S3 Bucketravenhelm-ai-productionravenhelm-ai-staging
CloudFront IDE2YTY7OV4W9IG8E1TEKAJATN6ZWV
Route53 ZoneZ05231381KXISHXRO16K3Z04724101B40OLA2FQVFP
Cache TTL3600s (1 hour)60s (faster iteration)
DeployManual approvalAutomatic on push

Infrastructure Components

1. S3 Buckets

BucketPurposeRegion
ravenhelm-ai-productionProduction website filesus-east-1
ravenhelm-ai-stagingStaging website filesus-east-1

Configuration (both):

  • ✅ Versioning enabled (rollback capability)
  • ✅ Server-side encryption (AES256)
  • ✅ Public access blocked (CloudFront-only via OAC)

2. CloudFront Distributions

EnvironmentDistribution IDCloudFront Domain
ProductionE2YTY7OV4W9IG8(via ravenhelm.ai)
StagingE1TEKAJATN6ZWVd31p9xn316kwoe.cloudfront.net

Configuration:

  • Price Class: PriceClass_100 (US, Canada, Europe)
  • SSL Certificate: Environment-specific ACM certificate
  • HTTP → HTTPS: Redirect automatically
  • Custom Error Responses: 404/403 → /index.html (SPA routing)

Caching (staging vs production):

  • Staging: Shorter TTLs (60s default) for faster feedback
  • Production: Longer TTLs (3600s default) for performance

3. ACM Certificates

EnvironmentDomainsStatus
Productionravenhelm.ai, www.ravenhelm.aiIssued
Staginghrafngrima.comIssued

Region: us-east-1 (required for CloudFront)
Validation: DNS validation via Route53 (automatic)

4. Route53 DNS

Hosted ZoneDomainZone ID
Productionravenhelm.aiZ05231381KXISHXRO16K3
Staginghrafngrima.comZ04724101B40OLA2FQVFP

5. Terraform State

Backend: S3 bucket ravenhelm-terraform-state
Region: us-east-1
Keys:

  • ravenhelm-ai/production/terraform.tfstate
  • ravenhelm-ai/staging/terraform.tfstate

CI/CD Pipeline

Pipeline Structure

┌──────────────┐     ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ validate │────▶│ plan │────▶│ apply │────▶│ deploy │
│ │ │ (staging + │ │ (manual) │ │ (auto/manual)│
│ │ │ production) │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘

Jobs Overview

JobStageTriggerDescription
terraform:validatevalidateterraform/** changesValidates Terraform config
terraform:plan:stagingplanterraform/** changesPlans staging changes
terraform:plan:productionplanterraform/** changesPlans production changes
terraform:apply:stagingapplyManualApplies staging infra
terraform:apply:productionapplyManualApplies production infra
deploy:stagingdeploypublic/** changes (auto)Deploys to staging
deploy:productiondeployManualDeploys to production
terraform:bootstrap:stagingapplyManualInitial staging setup
terraform:bootstrap:productionapplyManualInitial production setup

Deployment Flow

For content changes (public/):**

  1. Push to main → Automatically deploys to staging
  2. Review at https://hrafngrima.com
  3. Manually trigger deploy:production when ready

For infrastructure changes (terraform/):**

  1. Push to main → terraform:validate runs
  2. terraform:plan:staging and terraform:plan:production run
  3. Manually trigger terraform:apply:* to apply changes

GitLab CI Variables

VariableDescriptionProtectedMasked
AWS_ACCESS_KEY_IDAWS credentials
AWS_SECRET_ACCESS_KEYAWS credentials

Development Workflow

Making Changes

  1. Edit content: Modify files in public/
  2. Push to main: git push origin main
  3. Staging auto-deploys: Site available at https://hrafngrima.com
  4. Review changes: Check staging site
  5. Deploy to production: Manually trigger deploy:production job

Local Testing

```bash cd /tmp/ravenhelm-ai/public python -m http.server 8000

Visit http://localhost:8000

```

Cache Invalidation

Both staging and production CloudFront caches are automatically invalidated on deployment. Manual invalidation:

```bash

Staging

aws cloudfront create-invalidation --distribution-id E1TEKAJATN6ZWV --paths "/*"

Production

aws cloudfront create-invalidation --distribution-id E2YTY7OV4W9IG8 --paths "/*" ```


Terraform Configuration

File Structure

``` terraform/ ├── main.tf # Main resources (S3, CloudFront, ACM, Route53) ├── variables.tf # Variable definitions and locals ├── outputs.tf # Output values └── environments/ ├── production.tfvars # Production settings └── staging.tfvars # Staging settings ```

Key Variables

VariableDescriptionProductionStaging
environmentEnvironment nameproductionstaging
domain_namePrimary domainravenhelm.aihrafngrima.com
route53_zone_idDNS zone IDZ05231381KXISHXRO16K3Z04724101B40OLA2FQVFP
include_wwwAdd www subdomaintruefalse

Troubleshooting

Site Not Loading

  1. Check CloudFront: Distribution may be deploying (up to 15 min)
  2. Check ACM: Certificate may be validating
  3. Check DNS: Nameservers may not have propagated

```bash

Check DNS resolution

dig ravenhelm.ai +short dig hrafngrima.com +short

Check certificate status (from CI job or AWS console)

```

Pipeline Failures

  1. terraform:validate fails: Check Terraform syntax with terraform fmt -check
  2. terraform:plan fails: Check AWS credentials in CI/CD variables
  3. deploy: fails:* Check S3 bucket exists and CloudFront distribution is active

ACM Certificate Pending

If ACM certificate is stuck in "Pending validation":

  1. Verify Route53 nameservers are set at domain registrar
  2. Check DNS propagation: dig NS domain.com
  3. Terraform will wait up to 75 minutes for validation

  • [[Getting-Started]] - RavenmaskOS overview
  • [[Infrastructure-Overview]] - Infrastructure map
  • [[GitLab-CI-CD]] - CI/CD documentation

Last updated: 2026-01-06