Skip to content

Repository files navigation

infra-as-code

Infrastructure as Code for a sample web stack, provisioned with Terraform across three targets and continuously validated by GitHub Actions. The stack itself is a Rust backend and a componentized React frontend served by the same IaC.

Target Provider What is provisioned
Docker kreuzwerker/docker Local containers (PostgreSQL, Redis, backend, frontend)
Kubernetes hashicorp/kubernetes Namespace, deployment, service, ingress on a local kind cluster
AWS hashicorp/aws VPC, ECS Fargate service, RDS PostgreSQL

Applications

Directory Stack Role
backend/ Rust + axum + sqlx HTTP API with PostgreSQL persistence
frontend/ React 18 + Vite + TypeScript Componentized UI, neutral white theme

The app is a complete monolith: PostgreSQL-backed CRUD (/api/environments) plus an infrastructure overview, served by the Rust backend and rendered by the React frontend.

Layout

infra-as-code/
├── backend/           Rust backend (axum)
├── frontend/          React + Vite componentized frontend
├── terraform/         Terraform root + modules + environments
│   ├── main.tf        Wiring of the three modules
│   ├── modules/
│   │   ├── docker/     docker provider
│   │   ├── kubernetes/ kubernetes provider
│   │   └── aws/        aws provider
│   └── environments/   dev.tfvars, production.tfvars
├── kubernetes/        Raw manifests, applied by the module
├── docker-compose.yml Local app stack (builds backend + frontend)
├── scripts/           setup.sh, teardown.sh
├── Makefile           make init / plan / apply / docker / k8s / aws / build
└── .github/workflows/  terraform-validate, terraform-plan, terraform-apply

Prerequisites

  • Terraform >= 1.9
  • Colima + Docker CLI (local targets)
  • kind (kubernetes target)
  • AWS credentials (the AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION environment variables or an SSO profile) for the AWS target
  • A GitHub token with workflow scope (Actions), see .github/workflows/

Quick start

make setup          # start colima, create the kind cluster
make build          # docker build backend and frontend images
make init           # terraform init
make plan           # terraform plan -var-file=environments/dev.tfvars
make apply          # terraform apply -var-file=environments/dev.tfvars
make docker         # build images and apply only the docker module
make k8s            # apply only the kubernetes module
make aws            # apply only the aws module
make destroy        # tear everything down

Run the app stack without Terraform:

docker compose up --build    # postgres :5433, backend :8080, frontend :5173

Or on the host (hot reload):

docker compose up -d postgres                 # database only
DATABASE_URL=postgres://app:local@localhost:5433/app cargo run -C backend   # backend
npm --prefix frontend run dev                 # frontend on :5173

See docs/architecture.md for the full picture.

About

Full-stack infrastructure as code starter: Terraform for Docker, Kubernetes and AWS, a Rust backend with PostgreSQL, and a componentized React frontend.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages