11# Makefile for Torrust Tracker Demo - Twelve-Factor App Deployment
22.PHONY : help install-deps test-e2e lint test-unit clean
33.PHONY : infra-init infra-plan infra-apply infra-destroy infra-status infra-refresh-state
4- .PHONY : infra-config-local infra-config-production infra-validate-config
4+ .PHONY : infra-config infra-validate-config
55.PHONY : infra-test-prereq infra-test-ci infra-test-local
6- .PHONY : app-deploy app-redeploy app-health-check
6+ .PHONY : infra-providers infra-environments provider-info
7+ .PHONY : app-config app-validate-config app-deploy app-redeploy app-health-check
78.PHONY : app-test-config app-test-containers app-test-services
89.PHONY : vm-ssh vm-console vm-gui-console vm-clean-ssh vm-prepare-ssh vm-status
910.PHONY : dev-setup dev-deploy dev-test dev-clean
1011
11- # Default variables
12- VM_NAME ?= torrust-tracker-demo
13- ENVIRONMENT ?= local
14- TERRAFORM_DIR = infrastructure/terraform
12+ # Default environment variables
13+ ENVIRONMENT_TYPE ?= development
14+ ENVIRONMENT_FILE ?= development-libvirt
15+
16+ # Directory paths
1517INFRA_TESTS_DIR = infrastructure/tests
16- TESTS_DIR = tests
1718SCRIPTS_DIR = infrastructure/scripts
19+ TERRAFORM_DIR = infrastructure/terraform
20+
21+ # Default target - show help when no target specified
22+ .DEFAULT_GOAL := help
23+
24+ # Parameter validation target
25+ check-infra-params :
26+ @if [ -z " $( ENVIRONMENT_TYPE) " ]; then \
27+ echo " ❌ Error: ENVIRONMENT_TYPE not specified" ; \
28+ echo " Usage: make <target> ENVIRONMENT_TYPE=<type> ENVIRONMENT_FILE=<file>" ; \
29+ echo " Available environment types: development, testing, e2e, staging, production" ; \
30+ exit 1; \
31+ fi
32+ @if [ -z " $( ENVIRONMENT_FILE) " ]; then \
33+ echo " ❌ Error: ENVIRONMENT_FILE not specified" ; \
34+ echo " Usage: make <target> ENVIRONMENT_TYPE=<type> ENVIRONMENT_FILE=<file>" ; \
35+ echo " Example: make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt" ; \
36+ exit 1; \
37+ fi
1838
1939# Help target
2040help : # # Show this help message
@@ -43,10 +63,21 @@ help: ## Show this help message
4363 @echo " ⚙️ SYSTEM SETUP:"
4464 @awk ' BEGIN {FS = ":.*?## "} /^(install-deps|clean).*:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST )
4565 @echo " "
46- @echo " Examples:"
47- @echo " make dev-deploy ENVIRONMENT=local"
48- @echo " make infra-apply ENVIRONMENT=local"
49- @echo " make app-deploy ENVIRONMENT=local"
66+ @echo " Development examples:"
67+ @echo " make dev-deploy # Uses defaults: development + libvirt"
68+ @echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
69+ @echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
70+ @echo " make app-deploy ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
71+ @echo " "
72+ @echo " Enhanced Configuration Workflow (Phases 1-6 Completed):"
73+ @echo " make infra-config ENVIRONMENT_TYPE=development PROVIDER=libvirt # Generate development-libvirt.env"
74+ @echo " make infra-validate-config ENVIRONMENT_FILE=development-libvirt # Validate infrastructure config"
75+ @echo " make app-config ENVIRONMENT_FILE=development-libvirt # Generate application configs"
76+ @echo " make app-validate-config ENVIRONMENT_FILE=development-libvirt # Validate application configs"
77+ @echo " "
78+ @echo " Complete Deployment Workflow:"
79+ @echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt # Build stage"
80+ @echo " make app-deploy ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt # Release + Run stages"
5081
5182install-deps : # # Install required dependencies (Ubuntu/Debian)
5283 @echo " Installing dependencies..."
@@ -60,47 +91,125 @@ install-deps: ## Install required dependencies (Ubuntu/Debian)
6091# INFRASTRUCTURE LAYER (PLATFORM SETUP & CONFIGURATION)
6192# =============================================================================
6293
63- infra-init : # # Initialize infrastructure (Terraform init)
64- @echo " Initializing infrastructure for $( ENVIRONMENT ) ... "
65- $( SCRIPTS_DIR ) /provision-infrastructure.sh $( ENVIRONMENT ) init
94+ infra-init : check-infra-params # # Initialize infrastructure (Terraform init)
95+ @echo " Initializing infrastructure with environment file: $( ENVIRONMENT_FILE ) "
96+ ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /provision-infrastructure.sh init
6697
67- infra-plan : # # Plan infrastructure changes
68- @echo " Planning infrastructure for $( ENVIRONMENT ) ... "
69- $( SCRIPTS_DIR ) /provision-infrastructure.sh $( ENVIRONMENT ) plan
98+ infra-plan : check-infra-params # # Plan infrastructure changes
99+ @echo " Planning infrastructure with environment file: $( ENVIRONMENT_FILE ) "
100+ ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /provision-infrastructure.sh plan
70101
71- infra-apply : # # Provision infrastructure (platform setup)
72- @echo " Provisioning infrastructure for $( ENVIRONMENT ) ... "
102+ infra-apply : check-infra-params # # Provision infrastructure (platform setup)
103+ @echo " Provisioning infrastructure with environment file: $( ENVIRONMENT_FILE ) "
73104 @echo " ⚠️ This command may prompt for your password for sudo operations"
74105 @if [ " $( SKIP_WAIT) " = " true" ]; then \
75106 echo " ⚠️ SKIP_WAIT=true - Infrastructure will not wait for full readiness" ; \
76107 else \
77108 echo " ℹ️ Infrastructure will wait for full readiness (use SKIP_WAIT=true to skip)" ; \
78109 fi
79- SKIP_WAIT=$(SKIP_WAIT ) $( SCRIPTS_DIR ) /provision-infrastructure.sh $( ENVIRONMENT ) apply
110+ SKIP_WAIT=$(SKIP_WAIT ) ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /provision-infrastructure.sh apply
80111
81- infra-destroy : # # Destroy infrastructure
82- @echo " Destroying infrastructure for $( ENVIRONMENT ) ... "
83- $( SCRIPTS_DIR ) /provision-infrastructure.sh $( ENVIRONMENT ) destroy
112+ infra-destroy : check-infra-params # # Destroy infrastructure
113+ @echo " Destroying infrastructure with environment file: $( ENVIRONMENT_FILE ) "
114+ ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /provision-infrastructure.sh destroy
84115
85116infra-status : # # Show infrastructure status
86- @echo " Infrastructure status for $( ENVIRONMENT ) :"
117+ @echo " Infrastructure status:"
87118 @cd $(TERRAFORM_DIR ) && tofu show -no-color | grep -E " (vm_ip|vm_status)" || echo " No infrastructure found"
88119
89- infra-refresh-state : # # Refresh Terraform state to detect IP changes
120+ infra-refresh-state : check-infra-params # # Refresh Terraform state to detect IP changes
90121 @echo " Refreshing Terraform state..."
91122 @cd $(TERRAFORM_DIR ) && tofu refresh
92123
93- infra-config-local : # # Generate local environment configuration
94- @echo " Configuring local environment..."
95- $(SCRIPTS_DIR ) /configure-env.sh local
124+ # Provider and environment information
125+ infra-providers : # # List available infrastructure providers
126+ @echo " Available Infrastructure Providers:"
127+ @echo " Templates (infrastructure/config/templates/providers/):"
128+ @ls infrastructure/config/templates/providers/* .env.tpl 2> /dev/null | \
129+ xargs -I {} basename {} | sed ' s/\.env.*//g' | sort | uniq || \
130+ echo " No templates found"
131+ @echo " "
132+ @echo " User configurations (infrastructure/config/providers/):"
133+ @ls infrastructure/config/providers/* .env 2> /dev/null | \
134+ xargs -I {} basename {} | sed ' s/\.env.*//g' | sort | uniq || \
135+ echo " No user configs found"
136+ @echo " "
137+ @echo " Provider types:"
138+ @echo " libvirt - Local KVM/libvirt virtualization for development"
139+ @echo " hetzner - Hetzner Cloud for production deployments"
140+ @echo " "
141+ @echo " Usage examples:"
142+ @echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
143+ @echo " make infra-apply ENVIRONMENT_TYPE=staging ENVIRONMENT_FILE=staging-digitalocean"
144+ @echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
96145
97- infra-config-production : # # Generate production environment configuration
98- @echo " Configuring production environment..."
99- $(SCRIPTS_DIR ) /configure-env.sh production
146+ infra-environments : # # List available environments and their providers
147+ @echo " Available Environment Configurations:"
148+ @echo " "
149+ @echo " Templates (infrastructure/config/templates/environments/):"
150+ @ls infrastructure/config/templates/environments/* .defaults 2> /dev/null | \
151+ xargs -I {} basename {} .defaults | sort | sed ' s/^/ /' || \
152+ echo " No template defaults found"
153+ @echo " "
154+ @echo " User configurations (infrastructure/config/environments/):"
155+ @if ls infrastructure/config/environments/* .env > /dev/null 2>&1 ; then \
156+ for file in infrastructure/config/environments/* .env; do \
157+ if [ -f " $$ file" ]; then \
158+ env=$$(grep "^ENVIRONMENT_TYPE=" "$$file" 2>/dev/null | cut -d'=' -f2 | tr -d '"' | tr -d "'" ) ; \
159+ provider=$$(grep "^PROVIDER=" "$$file" 2>/dev/null | cut -d'=' -f2 | tr -d '"' | tr -d "'" ) ; \
160+ filename=$$(basename "$$file" .env) ; \
161+ echo " $$ filename -> Environment: $$ env, Provider: $$ provider" ; \
162+ fi \
163+ done ; \
164+ else \
165+ echo " No user configs found" ; \
166+ fi
167+ @echo " "
168+ @echo " Environment types:"
169+ @echo " development - Local development and testing"
170+ @echo " testing - General testing (reserved for future use)"
171+ @echo " e2e - End-to-end testing"
172+ @echo " staging - Pre-production testing"
173+ @echo " production - Production deployment"
174+ @echo " "
175+ @echo " Usage examples:"
176+ @echo " make infra-config ENVIRONMENT_TYPE=development PROVIDER=libvirt # Create development-libvirt.env"
177+ @echo " make infra-config ENVIRONMENT_TYPE=production PROVIDER=hetzner # Create production-hetzner.env"
178+ @echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
179+ @echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
180+
181+ provider-info : # # Show provider information (requires PROVIDER=<name>)
182+ @if [ -z " $( PROVIDER) " ]; then \
183+ echo " Error: PROVIDER not specified" ; \
184+ echo " Usage: make provider-info PROVIDER=<provider>" ; \
185+ exit 1; \
186+ fi
187+ @echo " Getting information for provider: $( PROVIDER) "
188+ @$(SCRIPTS_DIR ) /providers/provider-interface.sh info $(PROVIDER )
189+
190+ infra-config : # # Generate environment configuration (requires ENVIRONMENT_TYPE and PROVIDER)
191+ @if [ -z " $( ENVIRONMENT_TYPE) " ]; then \
192+ echo " Error: ENVIRONMENT_TYPE not specified" ; \
193+ echo " Usage: make infra-config ENVIRONMENT_TYPE=<type> PROVIDER=<provider>" ; \
194+ echo " Available environment types: development, testing, e2e, staging, production" ; \
195+ echo " Available providers: libvirt, hetzner" ; \
196+ echo " Example: make infra-config ENVIRONMENT_TYPE=development PROVIDER=libvirt" ; \
197+ exit 1; \
198+ fi
199+ @if [ -z " $( PROVIDER) " ]; then \
200+ echo " Error: PROVIDER not specified" ; \
201+ echo " Usage: make infra-config ENVIRONMENT_TYPE=<type> PROVIDER=<provider>" ; \
202+ echo " Available environment types: development, testing, e2e, staging, production" ; \
203+ echo " Available providers: libvirt, hetzner" ; \
204+ echo " Example: make infra-config ENVIRONMENT_TYPE=development PROVIDER=libvirt" ; \
205+ exit 1; \
206+ fi
207+ @echo " Configuring $( ENVIRONMENT_TYPE) environment for $( PROVIDER) ..."
208+ $(SCRIPTS_DIR ) /configure-env.sh $(ENVIRONMENT_TYPE ) $(PROVIDER )
100209
101210infra-validate-config : # # Validate configuration for all environments
102211 @echo " Validating configuration..."
103- $(SCRIPTS_DIR ) /validate-config.sh
212+ $(SCRIPTS_DIR ) /validate-config.sh $( ENVIRONMENT_FILE )
104213
105214infra-test-prereq : # # Test system prerequisites for development
106215 @echo " Testing prerequisites..."
@@ -119,22 +228,46 @@ infra-test-local: ## Run local-only infrastructure tests (requires virtualizatio
119228# APPLICATION LAYER (BUILD + RELEASE + RUN STAGES)
120229# =============================================================================
121230
231+ app-config : # # Generate application configuration for environment (Release stage preparation)
232+ @echo " Generating application configuration for environment: $( ENVIRONMENT_FILE) ..."
233+ @if [ -z " $( ENVIRONMENT_FILE) " ]; then \
234+ echo " ❌ Error: ENVIRONMENT_FILE parameter is required" ; \
235+ echo " Usage: make app-config ENVIRONMENT_FILE=staging-hetzner" ; \
236+ echo " Available environments:" ; \
237+ ls infrastructure/config/environments/* .env 2> /dev/null | \
238+ xargs -I {} basename {} .env | sed ' s/^/ /' || \
239+ echo " No environments found - generate with make infra-config" ; \
240+ exit 1; \
241+ fi
242+ application/scripts/configure-app.sh $(ENVIRONMENT_FILE )
243+
244+ app-validate-config : # # Validate application configuration for environment
245+ @echo " Validating application configuration for environment: $( ENVIRONMENT_FILE) ..."
246+ @if [ -z " $( ENVIRONMENT_FILE) " ]; then \
247+ echo " ❌ Error: ENVIRONMENT_FILE parameter is required" ; \
248+ echo " Usage: make app-validate-config ENVIRONMENT_FILE=staging-hetzner" ; \
249+ echo " Available environments:" ; \
250+ find infrastructure/config/environments/ -name " *.env" -exec basename {} .env \; 2> /dev/null | sort || true ; \
251+ exit 1; \
252+ fi
253+ application/scripts/configure-app.sh --validate $(ENVIRONMENT_FILE )
254+
122255app-deploy : # # Deploy application (Twelve-Factor Build + Release + Run stages)
123- @echo " Deploying application for $( ENVIRONMENT ) ..."
256+ @echo " Deploying application for $( ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE ) ..."
124257 @if [ " $( SKIP_WAIT) " = " true" ]; then \
125258 echo " ⚠️ SKIP_WAIT=true - Application will not wait for service readiness" ; \
126259 else \
127260 echo " ℹ️ Application will wait for service readiness (use SKIP_WAIT=true to skip)" ; \
128261 fi
129- SKIP_WAIT=$(SKIP_WAIT ) $( SCRIPTS_DIR ) /deploy-app.sh $(ENVIRONMENT )
262+ SKIP_WAIT=$(SKIP_WAIT ) ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /deploy-app.sh $(ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE )
130263
131264app-redeploy : # # Redeploy application without infrastructure changes
132- @echo " Redeploying application for $( ENVIRONMENT ) ..."
133- $( SCRIPTS_DIR ) /deploy-app.sh $(ENVIRONMENT )
265+ @echo " Redeploying application for $( ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE ) ..."
266+ ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /deploy-app.sh $(ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE )
134267
135268app-health-check : # # Validate deployment health
136- @echo " Running health check for $( ENVIRONMENT ) ..."
137- $( SCRIPTS_DIR ) /health-check.sh $(ENVIRONMENT )
269+ @echo " Running health check for environment type: $( ENVIRONMENT_TYPE ) , environment file: $( ENVIRONMENT_FILE ) ..."
270+ ENVIRONMENT_TYPE= $( ENVIRONMENT_TYPE ) ENVIRONMENT_FILE= $( ENVIRONMENT_FILE ) $( SCRIPTS_DIR ) /health-check.sh $(ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE )
138271
139272app-test-config : # # Test application configuration
140273 @echo " Testing application configuration..."
@@ -203,10 +336,10 @@ dev-setup: ## Complete development setup
203336 @make install-deps
204337
205338dev-deploy : # # Full deployment workflow (infra + app)
206- @echo " Running full deployment workflow for $( ENVIRONMENT ) ..."
207- @make infra-apply ENVIRONMENT=$(ENVIRONMENT )
208- @make app-deploy ENVIRONMENT=$(ENVIRONMENT )
209- @make app-health-check ENVIRONMENT=$(ENVIRONMENT )
339+ @echo " Running full deployment workflow for $( DEV_ENVIRONMENT ) with $( DEV_PROVIDER ) ..."
340+ @make infra-apply ENVIRONMENT=$(DEV_ENVIRONMENT ) PROVIDER= $( DEV_PROVIDER )
341+ @make app-deploy ENVIRONMENT=$(DEV_ENVIRONMENT )
342+ @make app-health-check ENVIRONMENT=$(DEV_ENVIRONMENT )
210343 @echo " ✅ Development deployment complete"
211344
212345dev-test : # # Quick validation (syntax + unit tests)
@@ -217,7 +350,7 @@ dev-test: ## Quick validation (syntax + unit tests)
217350
218351dev-clean : # # Complete cleanup
219352 @echo " Cleaning up development environment..."
220- @make infra-destroy ENVIRONMENT=$(ENVIRONMENT ) || true
353+ @make infra-destroy ENVIRONMENT=$(DEV_ENVIRONMENT ) PROVIDER= $( DEV_PROVIDER ) || true
221354 @make clean
222355 @echo " ✅ Development environment cleaned"
223356
@@ -227,7 +360,7 @@ dev-clean: ## Complete cleanup
227360
228361test-e2e : # # Run comprehensive end-to-end test (follows integration guide)
229362 @echo " Running comprehensive end-to-end test..."
230- $(TESTS_DIR ) /test-e2e.sh $(ENVIRONMENT )
363+ $(TESTS_DIR ) /test-e2e.sh $(DEV_ENVIRONMENT )
231364
232365test-ci : # # Run project-wide CI tests (global concerns)
233366 @echo " Running project-wide CI tests..."
0 commit comments