Infrastructure-as-Code repository for building cloud images and managing reusable Terraform modules with an integrated private module registry.
This repository provides a comprehensive infrastructure automation toolkit that includes:
- Packer configurations for building customized VM images (AMIs) and systemd-sysext overlay images
- Terraform modules (33+ preconfigured modules) that encapsulate common infrastructure patterns
- Private module registry powered by Cloudflare Workers for versioned module distribution
- CI/CD pipelines for automated building, validation, and publishing
blueprint/
├── imgfab/ # Image fabrication with Packer
│ ├── ami/ # VM/AMI image builds
│ │ ├── build.pkr.hcl
│ │ ├── sources.pkr.hcl
│ │ └── templates/ # OS-specific configs (preseed, kickstart, etc.)
│ └── sysext/ # Systemd-sysext overlay images
│ ├── build.pkr.hcl
│ └── templates/ # Service unit files
├── modules/ # Terraform modules (33+ modules)
│ ├── alma/ # AlmaLinux OS configuration
│ ├── debian/ # Debian OS configuration
│ ├── flatcar/ # Flatcar Container Linux configuration
│ ├── consul/ # HashiCorp Consul service mesh
│ ├── nomad/ # HashiCorp Nomad orchestrator
│ ├── vault/ # HashiCorp Vault secrets management
│ ├── nomad-*/ # Nomad job modules (Redis, PostgreSQL, MinIO, etc.)
│ └── ... # Additional infrastructure modules
├── registry/ # Terraform module registry
│ ├── src/ # TypeScript source code
│ ├── test/ # Vitest test suite
│ └── package.json # Node.js dependencies
└── .github/workflows/ # GitHub Actions CI/CD
├── modules.yml # Module publishing pipeline
├── registry.yml # Registry deployment
├── ami.yml # AMI building
└── sysext.yml # Sysext building
- Terraform >= 1.0 for module development
- Packer >= 1.8 for image building
- Node.js >= 18 for registry development
- Git for version control
-
Using existing modules:
module "debian_config" { source = "github.com/narwhl/blueprint//modules/debian" # or from registry: "registry.narwhl.workers.dev/narwhl/blueprint/debian" # Module-specific variables }
-
Creating new modules:
cd modules/ mkdir my-module cd my-module # Create standard module files touch main.tf variables.tf outputs.tf terraform.tf README.md # Initialize and validate terraform init terraform fmt terraform validate
-
Module structure conventions:
main.tf- Core resource definitionsvariables.tf- Input variable declarationsoutputs.tf- Output value exportsterraform.tf- Provider requirementstemplates/- Configuration file templates (.tftpl)README.md- Module documentation
-
Building AMIs:
cd imgfab/ami packer init . packer build .
-
Building systemd-sysext images:
cd imgfab/sysext packer build .
-
Local development:
cd registry npm ci # Install dependencies npm run dev # Start local dev server npm test # Run test suite
-
Deployment:
npm run deploy # Build for production (dry-run) terraform apply # Deploy to Cloudflare Workers
debian/,alma/,flatcar/- OS-specific configurations with cloud-init/ignitionproxmox/,vsphere/- Virtualization platform integrationsnvidia/- GPU driver and container toolkit setup
consul/,nomad/,vault/- HashiCorp stack componentsconsul-template/- Dynamic configuration managementtailscale/- Zero-trust networking
Preconfigured Nomad job specifications for common services:
nomad-redis/,nomad-valkey/- In-memory data storesnomad-postgres/,nomad-spilo/- PostgreSQL databasesnomad-minio/- Object storagenomad-ingress/- Load balancing and routingnomad-forgejo/,nomad-mastodon/,nomad-vaultwarden/- Applications
certificates/- TLS certificate generationpki/- Public key infrastructurevault-cf-access/- Vault with Cloudflare Access integration
The modules.yml workflow automatically:
- Detects changed modules on push
- Validates Terraform formatting and syntax
- Publishes to the private registry (on manual trigger)
The registry.yml workflow:
- Builds the TypeScript application
- Runs Terraform plan/apply for Cloudflare Workers
- Deploys on push to main branch
ami.yml- Builds and uploads AMI images to R2 storagesysext.yml- Creates systemd-sysext overlay images
-
For Terraform modules:
terraform fmt -check # Ensure proper formatting terraform init # Initialize providers terraform validate # Validate configuration
-
For registry code:
npm test # Run test suite npm run build # Verify build succeeds
-
For Packer templates:
packer fmt . # Format HCL files packer validate . # Validate configuration
- Follow existing module patterns and naming conventions
- Document module inputs/outputs in README files
- Use semantic versioning for module releases
- Test modules in isolation before integration
- Keep sensitive data in Vault or environment variables
- Use
.tftplextension for Terraform template files
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-module) - Make changes following the guidelines above
- Ensure all validations pass
- Submit a pull request with clear description
For issues or questions, please open an issue in the GitHub repository