# Custom PHP Framework Deployment Makefile # Domain: michaelschiemer.de | Email: kontakt@michaelschiemer.de | PHP: 8.4 # Default environment ENV ?= staging # Colors for output RED = \033[0;31m GREEN = \033[0;32m YELLOW = \033[1;33m BLUE = \033[0;34m PURPLE = \033[0;35m CYAN = \033[0;36m WHITE = \033[1;37m NC = \033[0m # Directories DEPLOYMENT_DIR = $(CURDIR) PROJECT_ROOT = $(CURDIR)/.. INFRASTRUCTURE_DIR = $(DEPLOYMENT_DIR)/infrastructure APPLICATIONS_DIR = $(DEPLOYMENT_DIR)/applications .PHONY: help deploy deploy-dry deploy-infrastructure deploy-application ##@ Deployment Commands help: ## Display this help message @echo "$(WHITE)Custom PHP Framework Deployment System$(NC)" @echo "$(CYAN)Domain: michaelschiemer.de | Email: kontakt@michaelschiemer.de | PHP: 8.4$(NC)" @echo "" @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make $(CYAN)$(NC) [ENV=]\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " $(CYAN)%-20s$(NC) %s\n", $$1, $$2 } /^##@/ { printf "\n$(WHITE)%s$(NC)\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @echo "" @echo "$(WHITE)Examples:$(NC)" @echo " $(CYAN)make deploy ENV=staging$(NC) # Deploy to staging" @echo " $(CYAN)make deploy-production$(NC) # Deploy to production" @echo " $(CYAN)make deploy-dry ENV=production$(NC) # Dry run for production" @echo " $(CYAN)make infrastructure ENV=staging$(NC) # Deploy only infrastructure" @echo " $(CYAN)make application ENV=production$(NC) # Deploy only application" @echo "" deploy: ## Deploy full stack to specified environment (default: staging) @echo "$(GREEN)๐Ÿš€ Deploying full stack to $(ENV) environment$(NC)" @./deploy.sh $(ENV) deploy-dry: ## Perform dry run deployment to specified environment @echo "$(BLUE)๐Ÿงช Performing dry run deployment to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --dry-run --verbose deploy-force: ## Force deploy (skip validations) to specified environment @echo "$(YELLOW)โš ๏ธ Force deploying to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --force deploy-quick: ## Quick deploy (skip tests and backup) to specified environment @echo "$(YELLOW)โšก Quick deploying to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --skip-tests --skip-backup ##@ Environment-Specific Shortcuts deploy-development: ## Deploy to development environment @echo "$(GREEN)๐Ÿ”ง Deploying to development environment$(NC)" @./deploy.sh development --non-interactive deploy-staging: ## Deploy to staging environment @echo "$(GREEN)๐Ÿงช Deploying to staging environment$(NC)" @./deploy.sh staging deploy-production: ## Deploy to production environment (with confirmations) @echo "$(RED)๐ŸŒŸ Deploying to production environment$(NC)" @./deploy.sh production ##@ Partial Deployment Commands infrastructure: ## Deploy only infrastructure (Ansible) to specified environment @echo "$(PURPLE)๐Ÿ—๏ธ Deploying infrastructure to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --infrastructure-only application: ## Deploy only application (Docker Compose) to specified environment @echo "$(CYAN)๐Ÿ“ฆ Deploying application to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --application-only infrastructure-dry: ## Dry run infrastructure deployment @echo "$(BLUE)๐Ÿงช Dry run infrastructure deployment to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --infrastructure-only --dry-run application-dry: ## Dry run application deployment @echo "$(BLUE)๐Ÿงช Dry run application deployment to $(ENV) environment$(NC)" @./deploy.sh $(ENV) --application-only --dry-run ##@ Setup and Maintenance Commands setup: ## First-time setup for deployment environment @echo "$(GREEN)๐Ÿ”ง Setting up deployment environment$(NC)" @./setup.sh check-prerequisites: ## Check deployment prerequisites @echo "$(BLUE)๐Ÿ” Checking deployment prerequisites$(NC)" @./deploy.sh $(ENV) --dry-run --infrastructure-only --application-only 2>/dev/null || echo "$(YELLOW)Run 'make setup' to install missing dependencies$(NC)" validate-config: ## Validate configuration files for specified environment @echo "$(BLUE)โœ… Validating configuration for $(ENV) environment$(NC)" @if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \ echo "$(GREEN)โœ“ Application environment file found$(NC)"; \ grep -q "*** REQUIRED" "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" && \ echo "$(RED)โŒ Found unfilled template values$(NC)" && \ grep "*** REQUIRED" "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" || \ echo "$(GREEN)โœ“ No template placeholders found$(NC)"; \ else \ echo "$(RED)โŒ Application environment file not found$(NC)"; \ echo "$(YELLOW)Copy from template: cp $(APPLICATIONS_DIR)/environments/.env.$(ENV).template $(APPLICATIONS_DIR)/environments/.env.$(ENV)$(NC)"; \ fi @if [ -f "$(INFRASTRUCTURE_DIR)/inventories/$(ENV)/hosts.yml" ]; then \ echo "$(GREEN)โœ“ Ansible inventory found$(NC)"; \ else \ echo "$(YELLOW)โš ๏ธ Ansible inventory not found (infrastructure deployment will be skipped)$(NC)"; \ fi ##@ Health and Status Commands status: ## Show deployment status for specified environment @echo "$(BLUE)๐Ÿ“Š Checking deployment status for $(ENV) environment$(NC)" @$(MAKE) validate-config ENV=$(ENV) @if [ -f "$(APPLICATIONS_DIR)/scripts/health-check.sh" ]; then \ echo "$(BLUE)Running health checks...$(NC)"; \ $(APPLICATIONS_DIR)/scripts/health-check.sh $(ENV) 2>/dev/null || echo "$(YELLOW)Health checks failed or services not running$(NC)"; \ else \ echo "$(YELLOW)Health check script not found$(NC)"; \ fi health: ## Run health checks for specified environment @echo "$(GREEN)๐Ÿฅ Running health checks for $(ENV) environment$(NC)" @if [ -f "$(APPLICATIONS_DIR)/scripts/health-check.sh" ]; then \ $(APPLICATIONS_DIR)/scripts/health-check.sh $(ENV); \ else \ echo "$(RED)โŒ Health check script not found$(NC)"; \ fi ##@ Log Management logs: ## Show logs for all services (ENV=staging SERVICE=all FOLLOW=no) @./deploy-cli.sh logs $(ENV) logs-follow: ## Follow logs for all services in real-time @./deploy-cli.sh logs $(ENV) "" --follow logs-php: ## Show PHP service logs @./deploy-cli.sh logs $(ENV) php logs-php-follow: ## Follow PHP service logs in real-time @./deploy-cli.sh logs $(ENV) php --follow logs-nginx: ## Show Nginx service logs @./deploy-cli.sh logs $(ENV) web logs-nginx-follow: ## Follow Nginx service logs in real-time @./deploy-cli.sh logs $(ENV) web --follow logs-db: ## Show database service logs @./deploy-cli.sh logs $(ENV) db logs-db-follow: ## Follow database service logs in real-time @./deploy-cli.sh logs $(ENV) db --follow logs-redis: ## Show Redis service logs @./deploy-cli.sh logs $(ENV) redis logs-redis-follow: ## Follow Redis service logs in real-time @./deploy-cli.sh logs $(ENV) redis --follow logs-worker: ## Show queue worker service logs @./deploy-cli.sh logs $(ENV) queue-worker logs-worker-follow: ## Follow queue worker service logs in real-time @./deploy-cli.sh logs $(ENV) queue-worker --follow # Production shortcuts logs-prod: ## Show production logs (all services) @./deploy-cli.sh logs production logs-prod-php: ## Show production PHP logs @./deploy-cli.sh logs production php logs-prod-nginx: ## Show production Nginx logs @./deploy-cli.sh logs production web logs-prod-follow: ## Follow production logs (PHP service) @./deploy-cli.sh logs production php --follow ##@ Development and Testing Commands test: ## Run deployment tests @echo "$(GREEN)๐Ÿงช Running deployment tests$(NC)" @cd $(PROJECT_ROOT) && [ -f vendor/bin/pest ] && vendor/bin/pest || echo "$(YELLOW)No test framework found$(NC)" test-infrastructure: ## Test Ansible playbook syntax @echo "$(BLUE)๐Ÿ” Testing Ansible playbook syntax$(NC)" @if [ -f "$(INFRASTRUCTURE_DIR)/inventories/$(ENV)/hosts.yml" ]; then \ cd $(INFRASTRUCTURE_DIR) && ansible-playbook \ -i inventories/$(ENV)/hosts.yml \ site.yml \ --syntax-check; \ else \ echo "$(RED)โŒ Ansible inventory not found for $(ENV)$(NC)"; \ fi build-assets: ## Build frontend assets @echo "$(CYAN)๐ŸŽจ Building frontend assets$(NC)" @cd $(PROJECT_ROOT) && [ -f package.json ] && npm ci && npm run build || echo "$(YELLOW)No package.json found$(NC)" ##@ Configuration Management Commands init-config: ## Initialize configuration files from templates @echo "$(GREEN)๐Ÿ“ Initializing configuration files$(NC)" @for env in development staging production; do \ if [ ! -f "$(APPLICATIONS_DIR)/environments/.env.$$env" ] && [ -f "$(APPLICATIONS_DIR)/environments/.env.$$env.template" ]; then \ echo "$(YELLOW)Creating .env.$$env from template$(NC)"; \ cp "$(APPLICATIONS_DIR)/environments/.env.$$env.template" "$(APPLICATIONS_DIR)/environments/.env.$$env"; \ else \ echo "$(BLUE).env.$$env already exists or template not found$(NC)"; \ fi; \ done edit-config: ## Edit configuration file for specified environment @echo "$(CYAN)๐Ÿ“ Editing configuration for $(ENV) environment$(NC)" @if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \ ${EDITOR:-nano} "$(APPLICATIONS_DIR)/environments/.env.$(ENV)"; \ else \ echo "$(RED)โŒ Configuration file not found: .env.$(ENV)$(NC)"; \ echo "$(YELLOW)Run 'make init-config' first$(NC)"; \ fi show-config: ## Display configuration for specified environment (safe values only) @echo "$(BLUE)๐Ÿ“‹ Configuration for $(ENV) environment$(NC)" @if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \ echo "$(CYAN)Safe configuration values:$(NC)"; \ grep -E '^(APP_|DB_HOST|DB_PORT|DB_NAME|DOMAIN)' "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" | grep -v -E '(PASSWORD|SECRET|KEY)' || true; \ echo "$(YELLOW)Sensitive values hidden for security$(NC)"; \ else \ echo "$(RED)โŒ Configuration file not found$(NC)"; \ fi ##@ Backup and Recovery Commands backup: ## Create backup before deployment @echo "$(GREEN)๐Ÿ’พ Creating backup for $(ENV) environment$(NC)" @mkdir -p $(PROJECT_ROOT)/storage/backups @cd $(PROJECT_ROOT) && docker-compose \ -f docker-compose.yml \ -f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \ --env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \ exec -T db sh -c 'mariadb-dump -u root -p$$DB_ROOT_PASSWORD --all-databases' \ > $(PROJECT_ROOT)/storage/backups/backup_$(ENV)_$(shell date +%Y%m%d_%H%M%S).sql @echo "$(GREEN)โœ“ Backup created$(NC)" restore: ## Restore from latest backup (use with caution!) @echo "$(RED)โš ๏ธ RESTORING FROM BACKUP - THIS WILL OVERWRITE CURRENT DATA$(NC)" @read -p "Are you sure? Type 'RESTORE' to confirm: " confirm && [ "$$confirm" = "RESTORE" ] || (echo "Cancelled" && exit 1) @latest_backup=$$(ls -t $(PROJECT_ROOT)/storage/backups/backup_$(ENV)_*.sql 2>/dev/null | head -n1); \ if [ -n "$$latest_backup" ]; then \ echo "$(YELLOW)Restoring from: $$latest_backup$(NC)"; \ cd $(PROJECT_ROOT) && docker-compose \ -f docker-compose.yml \ -f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \ --env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \ exec -T db sh -c 'mysql -u root -p$$DB_ROOT_PASSWORD' < "$$latest_backup"; \ echo "$(GREEN)โœ“ Database restored$(NC)"; \ else \ echo "$(RED)โŒ No backup files found for $(ENV)$(NC)"; \ fi ##@ Utility Commands clean: ## Clean up deployment artifacts and logs @echo "$(YELLOW)๐Ÿงน Cleaning deployment artifacts$(NC)" @rm -rf $(INFRASTRUCTURE_DIR)/logs/* @docker system prune -f @echo "$(GREEN)โœ“ Cleanup completed$(NC)" version: ## Show version information @echo "$(WHITE)Custom PHP Framework Deployment System$(NC)" @echo "Version: 1.0.0" @echo "Domain: michaelschiemer.de" @echo "Email: kontakt@michaelschiemer.de" @echo "PHP Version: 8.4" info: ## Show deployment information and available environments @echo "$(WHITE)๐Ÿ“‹ Deployment Information$(NC)" @echo "" @echo "$(CYAN)Project Details:$(NC)" @echo " Domain: michaelschiemer.de" @echo " Email: kontakt@michaelschiemer.de" @echo " PHP Version: 8.4" @echo " Framework: Custom PHP Framework" @echo "" @echo "$(CYAN)Available Environments:$(NC)" @for env in development staging production; do \ echo -n " $$env: "; \ if [ -f "$(APPLICATIONS_DIR)/environments/.env.$$env" ]; then \ echo "$(GREEN)โœ“ Configured$(NC)"; \ else \ echo "$(RED)โŒ Not configured$(NC)"; \ fi; \ done @echo "" @echo "$(CYAN)Deployment Modes:$(NC)" @echo " โ€ข Full Stack: Infrastructure + Application" @echo " โ€ข Infrastructure Only: Ansible deployment" @echo " โ€ข Application Only: Docker Compose deployment" @echo "" @echo "$(CYAN)Quick Commands:$(NC)" @echo " make deploy-staging # Deploy to staging" @echo " make deploy-production # Deploy to production" @echo " make deploy-dry ENV=prod # Dry run for production" @echo " make status ENV=staging # Check staging status" @echo "" ##@ Emergency Commands emergency-stop: ## Emergency stop all services for specified environment @echo "$(RED)๐Ÿšจ EMERGENCY STOP: Stopping all services for $(ENV) environment$(NC)" @cd $(PROJECT_ROOT) && docker-compose \ -f docker-compose.yml \ -f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \ --env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \ down @echo "$(YELLOW)โœ“ All services stopped$(NC)" emergency-restart: ## Emergency restart all services for specified environment @echo "$(YELLOW)๐Ÿ”„ EMERGENCY RESTART: Restarting all services for $(ENV) environment$(NC)" @$(MAKE) emergency-stop ENV=$(ENV) @sleep 5 @cd $(PROJECT_ROOT) && docker-compose \ -f docker-compose.yml \ -f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \ --env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \ up -d @echo "$(GREEN)โœ“ All services restarted$(NC)" rollback: ## Rollback to previous deployment (use with extreme caution!) @echo "$(RED)โš ๏ธ ROLLBACK: This will attempt to restore the previous deployment$(NC)" @echo "$(YELLOW)This is a destructive operation that should only be used in emergencies$(NC)" @read -p "Are you sure? Type 'ROLLBACK' to confirm: " confirm && [ "$$confirm" = "ROLLBACK" ] || (echo "Cancelled" && exit 1) @echo "$(YELLOW)Performing emergency rollback...$(NC)" @$(MAKE) backup ENV=$(ENV) @$(MAKE) restore ENV=$(ENV) @echo "$(GREEN)โœ“ Rollback completed$(NC)" @echo "$(YELLOW)Please verify system functionality immediately$(NC)" # Include environment-specific makefiles if they exist -include $(DEPLOYMENT_DIR)/environments/$(ENV).mk # Default target .DEFAULT_GOAL := help