diff --git a/Makefile b/Makefile index 5a09928..69bfde3 100644 --- a/Makefile +++ b/Makefile @@ -126,6 +126,79 @@ docker-build-push: ## Build and push multi-platform Docker images @printf "$(BLUE)Building and pushing multi-platform Docker images...$(RESET)\n" @./scripts/buildx-helper.sh build-push +docker-buildx-create: ## Create and use a new buildx builder instance + @printf "$(BLUE)Creating new buildx builder instance...$(RESET)\n" + @docker buildx create --name meds-builder --use --bootstrap + @printf "$(GREEN)Buildx builder 'meds-builder' created and activated$(RESET)\n" + +docker-buildx-build: ## Build multi-platform image using buildx + @printf "$(BLUE)Building multi-platform image with buildx...$(RESET)\n" + @docker buildx build --platform linux/amd64,linux/arm64 \ + --build-arg JWT_SECRET=$$(openssl rand -base64 32) \ + --build-arg SESSION_SECRET=$$(openssl rand -base64 32) \ + --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.name)") \ + --build-arg APP_BASE_URL=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.baseUrl)") \ + -t $$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.container.imageUrl)") . + +docker-buildx-build-push: ## Build and push multi-platform image using buildx + @printf "$(BLUE)Building and pushing multi-platform image with buildx...$(RESET)\n" + @docker buildx build --platform linux/amd64,linux/arm64 \ + --build-arg JWT_SECRET=$$(openssl rand -base64 32) \ + --build-arg SESSION_SECRET=$$(openssl rand -base64 32) \ + --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.name)") \ + --build-arg APP_BASE_URL=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.baseUrl)") \ + -t $$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.container.imageUrl)") --push . + +docker-buildx-build-load: ## Build multi-platform image and load to local Docker + @printf "$(BLUE)Building multi-platform image and loading to local Docker...$(RESET)\n" + @docker buildx build --platform linux/amd64 \ + --build-arg JWT_SECRET=$$(openssl rand -base64 32) \ + --build-arg SESSION_SECRET=$$(openssl rand -base64 32) \ + --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.name)") \ + --build-arg APP_BASE_URL=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.baseUrl)") \ + -t $$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.container.imageUrl)") --load . + +docker-buildx-inspect: ## Inspect current buildx builder + @printf "$(BLUE)Inspecting current buildx builder...$(RESET)\n" + @docker buildx inspect + +docker-buildx-ls: ## List all buildx builder instances + @printf "$(BLUE)Listing all buildx builder instances...$(RESET)\n" + @docker buildx ls + +docker-buildx-build-dev: ## Build development image using buildx + @printf "$(BLUE)Building development image with buildx...$(RESET)\n" + @docker buildx build --platform linux/amd64 \ + --build-arg JWT_SECRET=dev-jwt-secret-key-not-for-production \ + --build-arg SESSION_SECRET=dev-session-secret-key-not-for-production \ + --build-arg NODE_ENV=development \ + --build-arg DEBUG_MODE=true \ + --build-arg APP_NAME=$$(NODE_ENV=development bun -e "import {createUnifiedConfigForEnvironment} from './config/unified.config.ts'; console.log(createUnifiedConfigForEnvironment('development').app.name)") \ + --build-arg APP_BASE_URL=$$(NODE_ENV=development bun -e "import {createUnifiedConfigForEnvironment} from './config/unified.config.ts'; console.log(createUnifiedConfigForEnvironment('development').app.baseUrl)") \ + -t $$(NODE_ENV=development bun -e "import {createUnifiedConfigForEnvironment} from './config/unified.config.ts'; const config = createUnifiedConfigForEnvironment('development'); console.log(config.container.registry + '/' + config.container.repository + ':dev')") --load . + +docker-buildx-build-with-registry: ## Build and push to specific registry (requires REGISTRY variable) + @printf "$(BLUE)Building and pushing to custom registry...$(RESET)\n" + @if [ -z "$(REGISTRY)" ]; then \ + printf "$(RED)Error: REGISTRY variable not set. Use: make docker-buildx-build-with-registry REGISTRY=your-registry.com$(RESET)\n"; \ + exit 1; \ + fi + @docker buildx build --platform linux/amd64,linux/arm64 \ + --build-arg JWT_SECRET=$$(openssl rand -base64 32) \ + --build-arg SESSION_SECRET=$$(openssl rand -base64 32) \ + --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.name)") \ + --build-arg APP_BASE_URL=$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.app.baseUrl)") \ + -t $(REGISTRY)/$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.container.repository)"):$$(bun -e "import {unifiedConfig} from './config/unified.config.ts'; console.log(unifiedConfig.container.tag)") --push . + +docker-buildx-rm: ## Remove the meds-builder buildx instance + @printf "$(BLUE)Removing meds-builder buildx instance...$(RESET)\n" + @docker buildx rm meds-builder || true + @printf "$(GREEN)Buildx builder 'meds-builder' removed$(RESET)\n" + docker-push: ## Push existing Docker images to registry @printf "$(BLUE)Pushing Docker images to registry...$(RESET)\n" @./scripts/buildx-helper.sh push @@ -234,7 +307,23 @@ validate-config: ## Validate unified configuration config-debug: ## Show current unified configuration (debug mode) @printf "$(BLUE)Current unified configuration:$(RESET)\n" - @bun -e "import { logConfig } from './config/unified.config.ts'; logConfig();" + @DEBUG_MODE=true bun -e "import { logConfig } from './config/unified.config.ts'; logConfig();" + +config-check: ## Check configuration system health and show sources + @printf "$(BLUE)Configuration System Health Check:$(RESET)\n" + @printf "\n$(YELLOW)1. Environment Variables (.env file):$(RESET)\n" + @grep -v '^#' .env 2>/dev/null | head -10 || printf "$(YELLOW) No .env file found$(RESET)\n" + @printf "\n$(YELLOW)2. Unified Config Status:$(RESET)\n" + @bun -e "import { unifiedConfig, exportAsEnvVars } from './config/unified.config.ts'; console.log('✅ Unified config loaded successfully'); console.log('Environment:', unifiedConfig.app.environment); console.log('App Name:', unifiedConfig.app.name); console.log('Base URL:', unifiedConfig.app.baseUrl); console.log('Container Image:', unifiedConfig.container.imageUrl);" + @printf "\n$(YELLOW)3. Generated Config Files:$(RESET)\n" + @ls -la config/generated/ 2>/dev/null | grep -v '^total' || printf "$(YELLOW) No generated configs found$(RESET)\n" + @printf "\n$(GREEN)Configuration system is working!$(RESET)\n" + +config-export: ## Export current config as environment variables + @printf "$(BLUE)Exporting unified configuration as environment variables:$(RESET)\n" + @bun -e "import { exportAsEnvVars } from './config/unified.config.ts'; const vars = exportAsEnvVars(); Object.entries(vars).forEach(([key, value]) => console.log(\`\${key}=\${value}\`));" + + ##@ Workflows