# ============================================================================= # Flamenco Docker Development Environment Makefile # ============================================================================= # Manages Docker Compose operations for Flamenco development environment # # Usage: # make help # Show available targets # make dev-setup # Initial development environment setup # make dev-start # Start development services # make dev-tools # Start development tools (Vue.js, Hugo, profiling) # make dev-stop # Stop all services # make dev-clean # Clean environment and volumes -include .env export # ============================================================================= # Configuration # ============================================================================= COMPOSE_FILE := compose.dev.yml COMPOSE_PROJECT_NAME ?= flamenco-dev DOMAIN ?= flamenco.l.supported.systems # ============================================================================= # Docker Compose Commands # ============================================================================= DOCKER_COMPOSE := docker compose -f $(COMPOSE_FILE) DOCKER_COMPOSE_TOOLS := $(DOCKER_COMPOSE) --profile dev-tools # ============================================================================= # Default target # ============================================================================= .PHONY: help help: ## Show this help message @echo "๐Ÿณ Flamenco Docker Development Environment" @echo "==========================================" @echo "" @echo "Available targets:" @awk 'BEGIN {FS = ":.*##"; printf ""} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @echo "" @echo "Environment:" @echo " COMPOSE_PROJECT_NAME: $(COMPOSE_PROJECT_NAME)" @echo " DOMAIN: $(DOMAIN)" ##@ Setup Commands .PHONY: prerequisites prerequisites: ## Check and install prerequisites @echo "๐Ÿ” Checking prerequisites..." @docker --version || (echo "โŒ Docker not found. Please install Docker." && exit 1) @docker compose version || (echo "โŒ Docker Compose plugin not found. Install with: apt install docker-compose-plugin" && exit 1) @echo "โœ… Prerequisites OK" .PHONY: network-setup network-setup: ## Create external networks @echo "๐ŸŒ Setting up networks..." @docker network create caddy 2>/dev/null || echo "โ„น๏ธ Caddy network already exists" @echo "โœ… Networks ready" .PHONY: caddy-proxy caddy-proxy: network-setup ## Start caddy-docker-proxy for reverse proxy @echo "๐Ÿ”„ Starting caddy-docker-proxy..." @docker run -d \ --name caddy-docker-proxy \ --restart unless-stopped \ --network caddy \ -p 80:80 -p 443:443 \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ -v caddy_data:/data \ lucaslorentz/caddy-docker-proxy:ci-alpine 2>/dev/null || echo "โ„น๏ธ caddy-docker-proxy already running" @echo "โœ… Caddy reverse proxy ready" .PHONY: env-setup env-setup: ## Setup .env file from template @echo "โš™๏ธ Setting up environment..." @if [ ! -f .env ]; then \ cp .env.dev .env && echo "โœ… Created .env from template"; \ else \ echo "โ„น๏ธ .env file already exists"; \ fi .PHONY: dev-setup dev-setup: prerequisites network-setup env-setup ## Complete development environment setup @echo "๐Ÿš€ Setting up Flamenco development environment..." @docker compose --progress plain -f $(COMPOSE_FILE) build @$(DOCKER_COMPOSE) up shared-storage-setup @echo "โœ… Development environment setup complete" ##@ Development Commands .PHONY: dev-start dev-start: ## Start core development services (Manager + Worker) @echo "๐Ÿ Starting core development services..." @$(DOCKER_COMPOSE) up -d flamenco-manager flamenco-worker @echo "" @echo "โœ… Core services started!" @echo "" @echo "๐ŸŒ Access URLs:" @echo " Manager (proxy): https://manager.$(DOMAIN)" @echo " Manager (direct): http://localhost:8080" .PHONY: dev-tools dev-tools: ## Start development tools (Vue.js, Hugo, profiling) @echo "๐Ÿ› ๏ธ Starting development tools..." @$(DOCKER_COMPOSE_TOOLS) up -d @echo "" @echo "โœ… Development tools started!" @echo "" @echo "๐ŸŒ Development URLs:" @echo " Frontend: https://$(DOMAIN)" @echo " Documentation: https://docs.$(DOMAIN)" @echo " Profiling: https://profiling.$(DOMAIN)" @echo "" @echo "๐Ÿ“ก Direct URLs:" @echo " Vue.js Dev: http://localhost:8081" @echo " Hugo Docs: http://localhost:1313" .PHONY: dev-all dev-all: dev-start dev-tools ## Start all services including development tools ##@ Management Commands .PHONY: status status: ## Show service status @echo "๐Ÿ“Š Service Status:" @$(DOCKER_COMPOSE) ps .PHONY: logs logs: ## Show recent logs from all services @$(DOCKER_COMPOSE) logs --tail=50 .PHONY: logs-follow logs-follow: ## Follow logs from all services @$(DOCKER_COMPOSE) logs -f .PHONY: logs-manager logs-manager: ## Show Manager logs @$(DOCKER_COMPOSE) logs -f flamenco-manager .PHONY: logs-worker logs-worker: ## Show Worker logs @$(DOCKER_COMPOSE) logs -f flamenco-worker ##@ Utility Commands .PHONY: shell-manager shell-manager: ## Open shell in Manager container @$(DOCKER_COMPOSE) exec flamenco-manager bash .PHONY: shell-worker shell-worker: ## Open shell in Worker container @$(DOCKER_COMPOSE) exec flamenco-worker bash .PHONY: shell-tools shell-tools: ## Open shell in dev-tools container @$(DOCKER_COMPOSE_TOOLS) run --rm dev-tools bash .PHONY: generate generate: ## Regenerate API code in Manager container @echo "๐Ÿ”„ Regenerating API code..." @$(DOCKER_COMPOSE) exec flamenco-manager ./mage generate @echo "โœ… Code generation complete" .PHONY: test test: ## Run tests in Manager container @echo "๐Ÿงช Running tests..." @$(DOCKER_COMPOSE) exec flamenco-manager ./mage check .PHONY: webapp-build webapp-build: ## Build webapp static files @echo "๐Ÿ—๏ธ Building webapp..." @$(DOCKER_COMPOSE) exec flamenco-manager ./mage webappStatic @echo "โœ… Webapp build complete" ##@ Database Commands .PHONY: db-status db-status: ## Show database migration status @echo "๐Ÿ—„๏ธ Database migration status:" @$(DOCKER_COMPOSE_TOOLS) run --rm dev-tools goose -dir ./internal/manager/persistence/migrations/ sqlite3 /data/flamenco-manager.sqlite status .PHONY: db-up db-up: ## Apply database migrations @echo "โฌ†๏ธ Applying database migrations..." @$(DOCKER_COMPOSE_TOOLS) run --rm dev-tools goose -dir ./internal/manager/persistence/migrations/ sqlite3 /data/flamenco-manager.sqlite up @echo "โœ… Database migrations applied" .PHONY: db-down db-down: ## Rollback database migrations @echo "โฌ‡๏ธ Rolling back database migrations..." @$(DOCKER_COMPOSE_TOOLS) run --rm dev-tools goose -dir ./internal/manager/persistence/migrations/ sqlite3 /data/flamenco-manager.sqlite down @echo "โœ… Database migration rolled back" ##@ Control Commands .PHONY: dev-stop dev-stop: ## Stop all services @echo "๐Ÿ›‘ Stopping all services..." @$(DOCKER_COMPOSE) down @echo "โœ… All services stopped" .PHONY: dev-restart dev-restart: ## Restart all services @echo "๐Ÿ”„ Restarting services..." @$(DOCKER_COMPOSE) restart @$(MAKE) status .PHONY: dev-clean dev-clean: ## Stop services and remove volumes @echo "๐Ÿงน Cleaning development environment..." @$(DOCKER_COMPOSE) down -v @docker system prune -f @echo "โœ… Development environment cleaned" .PHONY: dev-rebuild dev-rebuild: ## Rebuild images and restart services @echo "๐Ÿ”จ Rebuilding development environment..." @$(DOCKER_COMPOSE) down @docker compose --progress plain -f $(COMPOSE_FILE) build --no-cache @$(MAKE) dev-start @echo "โœ… Development environment rebuilt" ##@ Production Commands .PHONY: prod-build prod-build: ## Build production images @echo "๐Ÿญ Building production images..." @docker build -f Dockerfile.dev --target production -t flamenco:latest . @echo "โœ… Production images built" .PHONY: prod-run prod-run: ## Run production container @echo "๐Ÿš€ Starting production container..." @docker run -d \ --name flamenco-manager-prod \ -p 8080:8080 \ -v flamenco-prod-data:/data \ -v flamenco-prod-storage:/shared-storage \ flamenco:latest ##@ Configuration Commands .PHONY: config config: ## Show resolved compose configuration @$(DOCKER_COMPOSE) config .PHONY: config-validate config-validate: ## Validate compose file syntax @echo "โœ… Validating compose file..." @$(DOCKER_COMPOSE) config --quiet @echo "โœ… Compose file is valid" .PHONY: env-show env-show: ## Show current environment variables @echo "๐Ÿ“‹ Environment Variables:" @echo " COMPOSE_PROJECT_NAME: $(COMPOSE_PROJECT_NAME)" @echo " DOMAIN: $(DOMAIN)" @grep -E "^[A-Z_]+" .env 2>/dev/null || echo " (no .env file found)" ##@ Cleanup Commands .PHONY: clean-volumes clean-volumes: ## Remove all project volumes (DESTRUCTIVE) @echo "โš ๏ธ This will remove all data volumes!" @read -p "Are you sure? [y/N] " -n 1 -r; \ echo ""; \ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \ docker volume rm $(COMPOSE_PROJECT_NAME)-data $(COMPOSE_PROJECT_NAME)-shared-storage $(COMPOSE_PROJECT_NAME)-worker-data $(COMPOSE_PROJECT_NAME)-go-mod-cache $(COMPOSE_PROJECT_NAME)-yarn-cache 2>/dev/null || true; \ echo "โœ… Volumes removed"; \ else \ echo "โŒ Cancelled"; \ fi .PHONY: clean-images clean-images: ## Remove project images @echo "๐Ÿ—‘๏ธ Removing project images..." @docker images --filter "reference=$(COMPOSE_PROJECT_NAME)*" -q | xargs -r docker rmi @echo "โœ… Project images removed" .PHONY: clean-all clean-all: dev-stop clean-volumes clean-images ## Complete cleanup (DESTRUCTIVE) @echo "โœ… Complete cleanup finished" # ============================================================================= # Development Shortcuts # ============================================================================= .PHONY: up up: dev-start ## Alias for dev-start .PHONY: down down: dev-stop ## Alias for dev-stop .PHONY: ps ps: status ## Alias for status .PHONY: build build: ## Build development images @docker compose --progress plain -f $(COMPOSE_FILE) build .PHONY: pull pull: ## Pull latest base images @$(DOCKER_COMPOSE) pull