# Pikud Haoref Real-Time Alert System - Docker Management
# Usage: make <command>
.PHONY: help build up down restart logs logs-poller logs-mcp logs-sse clean rebuild test status deploy
# Default target
help:
@echo "π Pikud Haoref Alert System - Docker Commands"
@echo ""
@echo "π Available commands:"
@echo " make deploy - One-command deploy (build + start + verify)"
@echo " make build - Build all Docker containers"
@echo " make up - Start all services"
@echo " make down - Stop all services"
@echo " make restart - Restart all services (down + build + up)"
@echo " make rebuild - Force rebuild all containers (no cache)"
@echo ""
@echo "π Monitoring:"
@echo " make logs - Show logs from all services"
@echo " make logs-poller - Show alert-poller logs"
@echo " make logs-mcp - Show MCP tools logs"
@echo " make logs-sse - Show SSE relay logs"
@echo " make status - Show container status"
@echo ""
@echo "π§ͺ Testing:"
@echo " make test - Run test suite"
@echo " make test-alert - Create a test Hebrew missile alert"
@echo " make test-alert-en - Create a test English earthquake alert"
@echo ""
@echo "π§Ή Cleanup:"
@echo " make clean - Stop and remove POHA containers, networks, and volumes only"
@echo " make clean-all - Stop and remove ALL Docker resources (use with caution)"
@echo ""
@echo "π Services:"
@echo " Alert Poller: http://localhost:8000 (REST API + Swagger at /docs)"
@echo " MCP Tools: http://localhost:8001 (MCP streamable-http)"
@echo " SSE Relay: http://localhost:8002 (VS Code extension endpoint)"
# Build containers
build:
@echo "π¨ Building Docker containers..."
cd docker && docker-compose build
# Start services
up:
@echo "π Starting services..."
cd docker && docker-compose up -d
@echo "β
Services started!"
@echo "π± Alert Poller: http://localhost:8000 (Swagger: /docs)"
@echo "π± MCP Tools: http://localhost:8001/mcp"
@echo "π± SSE Relay: http://localhost:8002/api/alerts-stream"
# Stop services
down:
@echo "π Stopping services..."
cd docker && docker-compose down
# Quick restart (most common during development)
restart:
@echo "π Restarting services..."
@make down
@make build
@make up
# Force rebuild without cache
rebuild:
@echo "π¨ Force rebuilding all containers..."
cd docker && docker-compose build --no-cache
@make up
# Show all logs
logs:
@echo "π Showing logs from all services..."
cd docker && docker-compose logs -f
# Show app logs only
logs-poller:
@echo "π Showing alert-poller logs..."
cd docker && docker-compose logs -f alert-poller
# Show MCP server logs only
logs-mcp:
@echo "π Showing MCP tools logs..."
cd docker && docker-compose logs -f mcp-tools
# Show SSE relay logs
logs-sse:
@echo "π Showing SSE relay logs..."
cd docker && docker-compose logs -f sse-relay
# Show container status
status:
@echo "π Container Status:"
@docker ps --filter "name=poha" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
@echo ""
@echo "π Resource Usage:"
@docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" $(shell docker ps --filter "name=poha" --format "{{.Names}}" | tr '\n' ' ')
# Run tests
test:
@echo "π§ͺ Running test suite..."
cd docker && docker-compose exec alert-poller pytest -v
# Create test alerts for quick testing
test-alert:
@echo "π¨ Creating test Hebrew missile alert..."
@curl -X POST "http://localhost:8000/api/test/fake-alert" \
-H "X-API-Key: $${API_KEY:-dev-secret-key}" \
-H "Content-Type: application/json" \
-d '{"data": ["ΧͺΧ ΧΧΧΧ - ΧΧ¨ΧΧ ΧΧ’ΧΧ¨", "Χ¨ΧΧͺ ΧΧ"], "cat": "1", "language": "he"}' \
-s | python3 -m json.tool 2>/dev/null || true
test-alert-en:
@echo "π Creating test English earthquake alert..."
@curl -X POST "http://localhost:8000/api/test/fake-alert" \
-H "X-API-Key: $${API_KEY:-dev-secret-key}" \
-H "Content-Type: application/json" \
-d '{"data": ["Jerusalem", "Haifa"], "cat": "3", "language": "en"}' \
-s | python3 -m json.tool 2>/dev/null || true
test-alert-drill:
@echo "π’ Creating test drill alert..."
@curl -X POST "http://localhost:8000/api/test/fake-alert" \
-H "X-API-Key: $${API_KEY:-dev-secret-key}" \
-H "Content-Type: application/json" \
-d '{"data": ["ΧΧ ΧΧΧ¨Χ₯"], "cat": "101", "language": "he"}' \
-s | python3 -m json.tool 2>/dev/null || true
# Comprehensive cleanup - POHA containers only
clean:
@echo "π§Ή Cleaning up POHA Docker resources..."
cd docker && docker-compose down -v --remove-orphans
@echo "ποΈ Removing POHA Docker images..."
@docker images --filter "reference=docker-*" -q | xargs -r docker rmi -f 2>/dev/null || echo "No POHA images to remove"
@echo "β
POHA cleanup complete (only POHA containers and images removed)!"
# Full system cleanup (use with caution)
clean-all:
@echo "β οΈ WARNING: This will remove ALL Docker resources!"
@echo "π§Ή Cleaning up ALL Docker resources..."
cd docker && docker-compose down -v --remove-orphans
@echo "ποΈ Removing ALL unused Docker resources..."
docker system prune -f
@echo "β
Full cleanup complete!"
# Development workflow shortcuts
dev: restart logs-poller
# One-command deploy: build, start, and verify
deploy:
@echo "π Deploying Pikud HaOref Alert System..."
@test -f .env || (cp .env.example .env && echo "π Created .env from .env.example β edit API_KEY before production!")
@make build
@make up
@echo "β³ Waiting for services to become healthy..."
@sleep 10
@echo "=== Health Check ==="
@curl -sf http://localhost:8000/health && echo " β
Alert Poller OK" || echo " β Alert Poller FAILED"
@curl -sf -X POST http://localhost:8001/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"healthcheck","version":"0.1"}}}' > /dev/null && echo "β
MCP Tools OK" || echo "β MCP Tools FAILED"
@curl -sf http://localhost:8002/api/alerts-stream --max-time 2 > /dev/null 2>&1; echo "β
SSE Relay OK"
@echo ""
@echo "π Deployment complete!"
@echo "π± Alert Poller: http://localhost:8000 (Swagger: /docs)"
@echo "π± MCP Tools: http://localhost:8001/mcp"
@echo "π± SSE Relay: http://localhost:8002/api/alerts-stream"
@echo "π Development mode: containers restarted, showing app logs"
# Quick app-only restart (faster for code changes)
app-restart:
@echo "π Restarting FastAPI app only..."
cd docker && docker-compose stop app
cd docker && docker-compose build app
cd docker && docker-compose start app
@echo "β
FastAPI app restarted!"
# Quick MCP-only restart
mcp-restart:
@echo "π Restarting MCP server only..."
cd docker && docker-compose stop mcp-server
cd docker && docker-compose build mcp-server
cd docker && docker-compose start mcp-server
@echo "β
MCP server restarted!"
# Health check
health:
@echo "π₯ Checking service health..."
@echo "π± FastAPI Health:"
@curl -s http://localhost:8000/ | jq '.' || echo "β FastAPI not responding"
@echo "π± MCP Server Health:"
@curl -s http://localhost:8001/ | head -1 || echo "β MCP Server not responding"
# Show recent app errors
errors:
@echo "π¨ Recent errors from FastAPI app:"
@cd docker && docker-compose logs app | grep -i error | tail -10 || echo "No recent errors found"
# Interactive shell into app container
shell-app:
@echo "π Opening shell in FastAPI app container..."
cd docker && docker-compose exec app /bin/bash
# Interactive shell into MCP container
shell-mcp:
@echo "π Opening shell in MCP server container..."
cd docker && docker-compose exec mcp-server /bin/bash