# ============================================================================== # INFRASTRUCTURE (Docker: Postgres, Redis, RabbitMQ) # ============================================================================== .PHONY: infra-up infra-up-dev infra-down wait-for-infra wait-for-services db-shell redis-shell rabbitmq-shell db-migrate db-seed db-reset # Infra-only (TASK-QA-010): use for make dev-full (apps run locally with hot reload) infra-up-dev: ## [MID] Start dev infra only (Postgres, Redis, RabbitMQ, ClamAV, MinIO) — use with make dev-full @$(ECHO_CMD) "${BLUE}🐳 Starting Dev Infrastructure (docker-compose.dev.yml)...${NC}" @docker compose -f docker-compose.dev.yml up -d @$(MAKE) -s wait-for-infra COMPOSE_FILE=docker-compose.dev.yml infra-up: ## [MID] Start Docker Infra (with health checks) @$(ECHO_CMD) "${BLUE}🐳 Starting Infrastructure...${NC}" @docker compose -f $(COMPOSE_FILE) up -d @$(MAKE) -s wait-for-infra infra-down: ## [MID] Stop Docker Infra @$(ECHO_CMD) "${BLUE}🛑 Stopping Infrastructure...${NC}" @docker compose -f $(COMPOSE_FILE) down wait-for-infra: ## [LOW] Wait for infrastructure to be ready (Postgres, Redis, RabbitMQ) @printf "${BLUE}⏳ Waiting for services...${NC}" @until docker compose -f $(COMPOSE_FILE) exec -T postgres pg_isready -U $(DB_USER) > /dev/null 2>&1; do printf "."; sleep 1; done @until docker compose -f $(COMPOSE_FILE) exec -T redis redis-cli ping > /dev/null 2>&1; do printf "."; sleep 1; done @until docker compose -f $(COMPOSE_FILE) exec -T rabbitmq rabbitmq-diagnostics -q check_port_connectivity > /dev/null 2>&1; do printf "."; sleep 1; done @$(ECHO_CMD) " ${GREEN}OK${NC}" wait-for-services: ## [LOW] Wait for all application services @printf "${BLUE}⏳ Waiting for services...${NC}" @for service in backend-api stream-server web; do \ until docker compose -f $(COMPOSE_PROD) exec -T $$service echo "ready" > /dev/null 2>&1; do \ printf "."; sleep 1; \ done; \ done @$(ECHO_CMD) " ${GREEN}OK${NC}" db-shell: ## [MID] Connect to Postgres shell @docker compose -f $(COMPOSE_FILE) exec postgres psql -U $(DB_USER) -d $(DB_NAME) redis-shell: ## [MID] Connect to Redis shell @docker compose -f $(COMPOSE_FILE) exec redis redis-cli rabbitmq-shell: ## [MID] Connect to RabbitMQ management (browser: http://$(APP_DOMAIN):$(PORT_RABBITMQ_MGMT)) @$(ECHO_CMD) "${BLUE}RabbitMQ Management: http://$(APP_DOMAIN):$(PORT_RABBITMQ_MGMT) (user: $(DB_USER), pass: $(DB_PASS))${NC}" db-migrate: infra-up ## [MID] Run all database migrations @$(ECHO_CMD) "${BLUE}🔄 Running Migrations...${NC}" @$(ECHO_CMD) " -> [Go] Migrating..." @(cd $(ROOT)/$(SERVICE_DIR_backend-api) && go run cmd/migrate_tool/main.go up || $(ECHO_CMD) "${YELLOW}Warning: Go migration failed${NC}") @$(ECHO_CMD) " -> [Stream] Migrating..." @(cd $(ROOT)/$(SERVICE_DIR_stream-server) && sqlx migrate run || $(ECHO_CMD) "${YELLOW}Warning: Stream migration failed${NC}") @$(ECHO_CMD) "${GREEN}✅ Migrations done.${NC}" db-seed: ## [MID] Populate database with demo data (10 users, 22 tracks, playlists, chat) @$(ECHO_CMD) "${BLUE}🌱 Seeding database...${NC}" @cd $(ROOT)/$(SERVICE_DIR_backend-api) && go run cmd/tools/seed/main.go @$(ECHO_CMD) "${GREEN}✅ Seed done.${NC}" db-reset: ## [MID] Drop and recreate database, then seed @$(ECHO_CMD) "${YELLOW}⚠️ Resetting database (all data will be lost)...${NC}" @PGPASSWORD=$(DB_PASS) psql -h $(DB_HOST) -p $(DB_PORT) -U $(DB_USER) -d postgres -c "DROP DATABASE IF EXISTS $(DB_NAME);" 2>/dev/null @PGPASSWORD=$(DB_PASS) psql -h $(DB_HOST) -p $(DB_PORT) -U $(DB_USER) -d postgres -c "CREATE DATABASE $(DB_NAME) OWNER $(DB_USER);" @$(ECHO_CMD) "${GREEN}✅ Database reset. Start backend to run migrations, then run 'make db-seed'.${NC}"