Files
Ketan Patel 7ead00647b
Build and Push Docker Image / build (push) Successful in 1m25s
Publish Alpine musl distroless Postfix as the sole latest image
2026-10-03 00:17:09 -04:00

184 lines
5.5 KiB
Makefile

.PHONY: help build up down restart logs test clean status queue config
# Change to parent directory for docker-compose commands
COMPOSE=cd .. && docker compose
# Default target
help:
@echo "Docker Postfix SMTP Relay - Makefile Commands"
@echo "=============================================="
@echo ""
@echo "Setup and Build:"
@echo " make build - Build the Docker image"
@echo " make up - Start the container"
@echo " make down - Stop the container"
@echo " make restart - Restart the container"
@echo ""
@echo "Monitoring:"
@echo " make logs - View container logs (follow)"
@echo " make logs-tail - View last 100 lines"
@echo " make status - Show container and Postfix status"
@echo " make queue - View mail queue"
@echo " make health - Check container health"
@echo ""
@echo "Maintenance:"
@echo " make config - Show Postfix configuration"
@echo " make test - Send test email (auto-detects container)"
@echo " Usage: make test TO=user@example.com [FROM=sender@domain.com]"
@echo " make flush - Flush mail queue"
@echo " make check - Check Postfix configuration"
@echo ""
@echo "Cleanup:"
@echo " make clean - Remove container and volumes"
@echo " make clean-all - Remove everything including images"
@echo ""
@echo "Advanced:"
@echo " make debug - Start with debug mode enabled"
@echo " make validate - Validate environment file"
@echo " make stats - Show real-time stats"
@echo ""
# Build the Docker image
build:
@echo "Building Docker image..."
@$(COMPOSE) build
# Start the container
up:
@echo "Starting Postfix relay..."
@$(COMPOSE) up -d
@echo "Waiting for container to be healthy..."
@sleep 5
@make status
# Stop the container
down:
@echo "Stopping Postfix relay..."
@$(COMPOSE) down
# Restart the container
restart: down up
# View logs
logs:
@$(COMPOSE) logs -f
# View last 100 lines of logs
logs-tail:
@$(COMPOSE) logs --tail=100
# Show container and Postfix status
status:
@echo "Container Status:"
@echo "================="
@docker ps --filter name=postfix-relay --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
@echo ""
@echo "Postfix Status:"
@echo "==============="
@$(COMPOSE) exec postfix /usr/local/bin/postfix-entrypoint --healthcheck || echo "Container not running"
# View mail queue
queue:
@echo "Mail Queue:"
@echo "==========="
@$(COMPOSE) exec postfix postqueue -p
# Flush mail queue
flush:
@echo "Flushing mail queue..."
@$(COMPOSE) exec postfix postqueue -f
@echo "Queue flushed"
# View Postfix configuration
config:
@echo "Postfix Configuration:"
@echo "====================="
@$(COMPOSE) exec postfix postconf -n
# Check Postfix configuration
check:
@echo "Checking Postfix configuration..."
@$(COMPOSE) exec postfix /usr/local/bin/postfix-entrypoint --check
@$(COMPOSE) exec postfix postconf -c /etc/postfix/
@echo "Configuration check complete"
# Send test email
test:
@if [ -z "$(TO)" ]; then \
echo "Usage: make test TO=recipient@example.com [FROM=sender@domain.com] [SUBJECT='Test Email']"; \
echo ""; \
echo "Examples:"; \
echo " make test TO=user@example.com"; \
echo " make test TO=user@example.com FROM=noreply@mydomain.com"; \
echo " make test TO=user@example.com FROM=sender@domain.com SUBJECT='My Test'"; \
echo ""; \
echo "Note: Container defaults to postfix-relay; override with CONTAINER=name"; \
echo " FROM defaults to noreply@<DOMAIN> if not specified"; \
exit 1; \
fi
@if [ -n "$(CONTAINER)" ]; then \
./test-email.sh "$(CONTAINER)" "$(TO)" "$(FROM)" "$(SUBJECT)"; \
else \
./test-email.sh "$(TO)" "$(FROM)" "$(SUBJECT)"; \
fi
# Validate environment file
validate:
@echo "Validating .env file..."
@if [ ! -f ../.env ]; then \
echo "ERROR: .env file not found. Copy env.sample to .env in parent directory"; \
exit 1; \
fi
@grep -q "SMTP_SERVER=" ../.env || (echo "ERROR: SMTP_SERVER not set" && exit 1)
@grep -q "SMTP_PORT=" ../.env || (echo "ERROR: SMTP_PORT not set" && exit 1)
@grep -q "SMTP_USERNAME=" ../.env || (echo "ERROR: SMTP_USERNAME not set" && exit 1)
@grep -q "SMTP_PASSWORD=" ../.env || (echo "ERROR: SMTP_PASSWORD not set" && exit 1)
@grep -q "DOMAIN=" ../.env || (echo "ERROR: DOMAIN not set" && exit 1)
@echo "Environment file validation passed"
# Clean up (remove container and volumes)
clean:
@echo "Cleaning up containers and volumes..."
@$(COMPOSE) down -v
@echo "Cleaning local data directories..."
@cd .. && rm -rf data logs mail spool
@echo "Cleanup complete"
# Clean everything including images
clean-all: clean
@echo "Removing Docker images..."
@$(COMPOSE) down --rmi all
@echo "Complete cleanup finished"
# Show queue details
queue-detail:
@echo "Detailed Queue Information:"
@echo "=========================="
@$(COMPOSE) exec -T postfix postqueue -p | tail -n 1
# Delete all queued messages
queue-delete:
@echo "WARNING: This will delete ALL messages in the queue!"
@read -p "Are you sure? (yes/no): " confirm; \
if [ "$$confirm" = "yes" ]; then \
$(COMPOSE) exec postfix postsuper -d ALL; \
echo "All queued messages deleted"; \
else \
echo "Cancelled"; \
fi
# Enable debug mode
debug:
@echo "Restarting with DEBUG mode enabled..."
@$(COMPOSE) down
@cd .. && DEBUG=yes docker compose up
# Show real-time statistics
stats:
@docker stats postfix-relay
# Run health check
health:
@echo "Running health check..."
@docker inspect postfix-relay --format='{{.State.Health.Status}}' 2>/dev/null || echo "Container not running"