1
1
# Makefile for Torrust Tracker Demo - Twelve-Factor App Deployment
2
2
.PHONY : help install-deps test-e2e lint test-unit clean
3
3
.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
5
5
.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
7
8
.PHONY : app-test-config app-test-containers app-test-services
8
9
.PHONY : vm-ssh vm-console vm-gui-console vm-clean-ssh vm-prepare-ssh vm-status
9
10
.PHONY : dev-setup dev-deploy dev-test dev-clean
10
11
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
15
17
INFRA_TESTS_DIR = infrastructure/tests
16
- TESTS_DIR = tests
17
18
SCRIPTS_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
18
38
19
39
# Help target
20
40
help : # # Show this help message
@@ -43,10 +63,21 @@ help: ## Show this help message
43
63
@echo " ⚙️ SYSTEM SETUP:"
44
64
@awk ' BEGIN {FS = ":.*?## "} /^(install-deps|clean).*:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST )
45
65
@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"
50
81
51
82
install-deps : # # Install required dependencies (Ubuntu/Debian)
52
83
@echo " Installing dependencies..."
@@ -60,47 +91,125 @@ install-deps: ## Install required dependencies (Ubuntu/Debian)
60
91
# INFRASTRUCTURE LAYER (PLATFORM SETUP & CONFIGURATION)
61
92
# =============================================================================
62
93
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
66
97
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
70
101
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 ) "
73
104
@echo " ⚠️ This command may prompt for your password for sudo operations"
74
105
@if [ " $( SKIP_WAIT) " = " true" ]; then \
75
106
echo " ⚠️ SKIP_WAIT=true - Infrastructure will not wait for full readiness" ; \
76
107
else \
77
108
echo " ℹ️ Infrastructure will wait for full readiness (use SKIP_WAIT=true to skip)" ; \
78
109
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
80
111
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
84
115
85
116
infra-status : # # Show infrastructure status
86
- @echo " Infrastructure status for $( ENVIRONMENT ) :"
117
+ @echo " Infrastructure status:"
87
118
@cd $(TERRAFORM_DIR ) && tofu show -no-color | grep -E " (vm_ip|vm_status)" || echo " No infrastructure found"
88
119
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
90
121
@echo " Refreshing Terraform state..."
91
122
@cd $(TERRAFORM_DIR ) && tofu refresh
92
123
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"
96
145
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 )
100
209
101
210
infra-validate-config : # # Validate configuration for all environments
102
211
@echo " Validating configuration..."
103
- $(SCRIPTS_DIR ) /validate-config.sh
212
+ $(SCRIPTS_DIR ) /validate-config.sh $( ENVIRONMENT_FILE )
104
213
105
214
infra-test-prereq : # # Test system prerequisites for development
106
215
@echo " Testing prerequisites..."
@@ -119,22 +228,46 @@ infra-test-local: ## Run local-only infrastructure tests (requires virtualizatio
119
228
# APPLICATION LAYER (BUILD + RELEASE + RUN STAGES)
120
229
# =============================================================================
121
230
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
+
122
255
app-deploy : # # Deploy application (Twelve-Factor Build + Release + Run stages)
123
- @echo " Deploying application for $( ENVIRONMENT ) ..."
256
+ @echo " Deploying application for $( ENVIRONMENT_TYPE ) - $( ENVIRONMENT_FILE ) ..."
124
257
@if [ " $( SKIP_WAIT) " = " true" ]; then \
125
258
echo " ⚠️ SKIP_WAIT=true - Application will not wait for service readiness" ; \
126
259
else \
127
260
echo " ℹ️ Application will wait for service readiness (use SKIP_WAIT=true to skip)" ; \
128
261
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 )
130
263
131
264
app-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 )
134
267
135
268
app-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 )
138
271
139
272
app-test-config : # # Test application configuration
140
273
@echo " Testing application configuration..."
@@ -203,10 +336,10 @@ dev-setup: ## Complete development setup
203
336
@make install-deps
204
337
205
338
dev-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 )
210
343
@echo " ✅ Development deployment complete"
211
344
212
345
dev-test : # # Quick validation (syntax + unit tests)
@@ -217,7 +350,7 @@ dev-test: ## Quick validation (syntax + unit tests)
217
350
218
351
dev-clean : # # Complete cleanup
219
352
@echo " Cleaning up development environment..."
220
- @make infra-destroy ENVIRONMENT=$(ENVIRONMENT ) || true
353
+ @make infra-destroy ENVIRONMENT=$(DEV_ENVIRONMENT ) PROVIDER= $( DEV_PROVIDER ) || true
221
354
@make clean
222
355
@echo " ✅ Development environment cleaned"
223
356
@@ -227,7 +360,7 @@ dev-clean: ## Complete cleanup
227
360
228
361
test-e2e : # # Run comprehensive end-to-end test (follows integration guide)
229
362
@echo " Running comprehensive end-to-end test..."
230
- $(TESTS_DIR ) /test-e2e.sh $(ENVIRONMENT )
363
+ $(TESTS_DIR ) /test-e2e.sh $(DEV_ENVIRONMENT )
231
364
232
365
test-ci : # # Run project-wide CI tests (global concerns)
233
366
@echo " Running project-wide CI tests..."
0 commit comments