IMAGE_NAME = authentikate CONTAINER_NAME = authentikate PORT = 8889 VERSION = latest TEST_PORT = 8890 TEST_CONTAINER_NAME = authentikate-test # Default target .DEFAULT_GOAL := help # Make sure to get set up with octane and frankenPHP # since that's what the base docker image expects setup: ## Install Laravel Octane with FrankenPHP composer install npm install composer require laravel/octane php artisan key:generate php artisan octane:install --server=frankenphp php artisan migrate:fresh php artisan app:generate-keys php artisan authentikate:create-admin --email="admin@admin.com" --name="Admin" php artisan db:seed # Docker build targets build: ## Build the Docker image @echo "Building Docker image: $(IMAGE_NAME):$(VERSION)" npm run build docker build -t $(IMAGE_NAME):$(VERSION) . @echo "โœ… Image built successfully" build-no-cache: ## Build the Docker image without cache @echo "Building Docker image without cache: $(IMAGE_NAME):$(VERSION)" docker build --no-cache -t $(IMAGE_NAME):$(VERSION) . @echo "โœ… Image built successfully" # Run targets run: ## Run the container (production-like) @echo "Starting container: $(CONTAINER_NAME)" @docker stop $(CONTAINER_NAME) 2>/dev/null || true @docker rm $(CONTAINER_NAME) 2>/dev/null || true docker run -d \ --name $(CONTAINER_NAME) \ -p $(PORT):8000 \ -e APP_NAME="AuthentiKate" \ -e APP_ENV=production \ -e APP_DEBUG=true \ -e APP_KEY=base64:$$(openssl rand -base64 32) \ -e APP_URL=http://localhost:$(PORT) \ -e DB_CONNECTION=sqlite \ -e DB_DATABASE=/app/database/database.sqlite \ -v authentikate_keys:/app/storage/oauth \ -v authentikate_db:/app/database \ -v authentikate_storage:/app/storage \ $(IMAGE_NAME):$(VERSION) @echo "โœ… Container started on http://localhost:$(PORT)" @echo "๐Ÿ“‹ Check logs with: make logs" @echo "๐Ÿ”‘ Admin credentials will be shown in the logs" run-test: ## Run a test container with different settings @echo "Starting test container: $(TEST_CONTAINER_NAME)" @docker stop $(TEST_CONTAINER_NAME) 2>/dev/null || true @docker rm $(TEST_CONTAINER_NAME) 2>/dev/null || true docker run -d \ --name $(TEST_CONTAINER_NAME) \ -p $(TEST_PORT):8000 \ -e APP_NAME="AuthentiKate Test" \ -e APP_ENV=testing \ -e APP_DEBUG=true \ -e APP_KEY=base64:$$(openssl rand -base64 32) \ -e APP_URL=http://localhost:$(TEST_PORT) \ -e DB_CONNECTION=sqlite \ -e DB_DATABASE=/app/database/test.sqlite \ -v authentikate_test_keys:/app/storage/oauth \ -v authentikate_test_db:/app/database \ -v authentikate_test_storage:/app/storage \ $(IMAGE_NAME):$(VERSION) @echo "โœ… Test container started on http://localhost:$(TEST_PORT)" @echo "๐Ÿ“‹ Check logs with: make logs-test" run-interactive: ## Run container interactively for debugging @echo "Starting interactive container" @docker stop $(CONTAINER_NAME)-debug 2>/dev/null || true @docker rm $(CONTAINER_NAME)-debug 2>/dev/null || true docker run -it --rm \ --name $(CONTAINER_NAME)-debug \ -p $(PORT):8000 \ -e APP_ENV=local \ -e APP_DEBUG=true \ -e APP_KEY=base64:$$(openssl rand -base64 32) \ -e APP_URL=http://localhost:$(PORT) \ -e DB_CONNECTION=sqlite \ -e DB_DATABASE=/app/database/debug.sqlite \ $(IMAGE_NAME):$(VERSION) \ /bin/bash # Container management stop: ## Stop the running container @echo "Stopping container: $(CONTAINER_NAME)" @docker stop $(CONTAINER_NAME) 2>/dev/null || echo "Container not running" @docker rm $(CONTAINER_NAME) 2>/dev/null || echo "Container already removed" stop-test: ## Stop the test container @echo "Stopping test container: $(TEST_CONTAINER_NAME)" @docker stop $(TEST_CONTAINER_NAME) 2>/dev/null || echo "Container not running" @docker rm $(TEST_CONTAINER_NAME) 2>/dev/null || echo "Container already removed" stop-all: ## Stop all containers @echo "Stopping all containers" @docker stop $(CONTAINER_NAME) $(TEST_CONTAINER_NAME) 2>/dev/null || true @docker rm $(CONTAINER_NAME) $(TEST_CONTAINER_NAME) 2>/dev/null || true restart: stop run ## Restart the container restart-test: stop-test run-test ## Restart the test container # Logs and debugging logs: ## Show container logs docker logs -f $(CONTAINER_NAME) logs-test: ## Show test container logs docker logs -f $(TEST_CONTAINER_NAME) logs-tail: ## Show last 50 lines of container logs docker logs --tail 50 $(CONTAINER_NAME) shell: ## Open a shell in the running container docker exec -it $(CONTAINER_NAME) /bin/bash shell-test: ## Open a shell in the test container docker exec -it $(TEST_CONTAINER_NAME) /bin/bash # Full workflow targets rebuild: build stop run ## Rebuild image and restart container rebuild-test: build stop-test run-test ## Rebuild image and restart test container rebuild-no-cache: build-no-cache stop run ## Rebuild without cache and restart test-full: build run-test ## Build and run test container @echo "โณ Waiting for container to start..." @sleep 10 @echo "๐Ÿงช Running health check..." @curl -f http://localhost:$(TEST_PORT) >/dev/null 2>&1 && echo "โœ… Health check passed" || echo "โŒ Health check failed" @echo "๐Ÿ“‹ Test container logs:" @docker logs $(TEST_CONTAINER_NAME) | tail -20 # Cleanup targets clean: ## Remove containers and images @echo "Cleaning up containers and images" @docker stop $(CONTAINER_NAME) $(TEST_CONTAINER_NAME) 2>/dev/null || true @docker rm $(CONTAINER_NAME) $(TEST_CONTAINER_NAME) 2>/dev/null || true @docker rmi $(IMAGE_NAME):$(VERSION) 2>/dev/null || echo "Image not found" clean-volumes: ## Remove all volumes (WARNING: destroys data) @echo "โš ๏ธ WARNING: This will destroy all data in volumes!" @read -p "Are you sure? (y/N) " -n 1 -r; \ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \ echo; \ docker volume rm authentikate_keys authentikate_db authentikate_storage 2>/dev/null || true; \ docker volume rm authentikate_test_keys authentikate_test_db authentikate_test_storage 2>/dev/null || true; \ echo "โœ… Volumes removed"; \ else \ echo; \ echo "โŒ Cancelled"; \ fi clean-all: clean clean-volumes ## Remove everything (containers, images, volumes) # Development targets dev-build-test: ## Quick development build and test cycle @echo "๐Ÿ”„ Development build and test cycle" @make build @make run-test @echo "โณ Waiting for container to start..." @sleep 5 @make logs-tail @echo "๐ŸŒ Test instance available at: http://localhost:$(TEST_PORT)" # Status and info status: ## Show container status @echo "=== Container Status ===" @docker ps -a --filter name=$(CONTAINER_NAME) --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" @docker ps -a --filter name=$(TEST_CONTAINER_NAME) --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" @echo @echo "=== Volume Status ===" @docker volume ls --filter name=authentikate info: ## Show image and container information @echo "=== Image Information ===" @docker images $(IMAGE_NAME):$(VERSION) --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" @echo @echo "=== Container Information ===" @docker inspect $(CONTAINER_NAME) 2>/dev/null | grep -E '"IPAddress"|"Ports"' || echo "Container not running" urls: ## Show accessible URLs @echo "=== Available URLs ===" @echo "Production: http://localhost:$(PORT)" @echo "Test: http://localhost:$(TEST_PORT)" @echo "Health: http://localhost:$(PORT)/up" # Help target help: ## Show this help message @echo "AuthentiKate Docker Makefile" @echo "=============================" @echo @echo "Usage: make [target]" @echo @echo "Targets:" @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) @echo @echo "Quick Start:" @echo " make build run # Build and run production container" @echo " make dev-build-test # Quick dev cycle" @echo " make logs # View logs" @echo " make clean # Clean up"