- Docker and Docker Compose installed
- Git with SSH key configured (if using private repositories)
# Copy the environment template
cp env.template .env
# Edit .env with your actual values
# Most importantly:
# - LLM_API_KEY (for OpenAI or other LLM service)
# - GIT_SSH_KEY (your SSH private key for git access)
# - ELASTIC_PASSWORD (for Elasticsearch)# Build all services
make build-images
# Or build individual services
make build-webhook
make build-mcp
make build-llm
make build-git
make build-airflow# Start all services
make up
# Check status
make logs
# Stop services
make downThe services start in this order:
- PostgreSQL - Airflow metadata database
- Redis - Celery broker for Airflow
- Elasticsearch - Log storage
- Airflow services - Webserver, scheduler, worker, triggerer
- Other services - Webhook listener, MCP engine, LLM service
- Missing .env file: Copy
env.templateto.envand fill in values - Port conflicts: Check if ports 8080, 8081, 5001, 5002, 5601, 3000, 9090, 9000 are free
- Missing secrets: Ensure SSH keys and API keys are properly configured
- Database connection errors: PostgreSQL must be running before Airflow starts
- Celery worker issues: Redis must be accessible
- DAG not running: Check if
start_dateis in the past
All services include health checks that will restart containers if they become unhealthy. Check logs for specific error messages:
# View all logs
make logs
# View specific service logs
docker-compose logs -f airflow-webserver- Grafana: http://localhost:3000 (default: admin/admin)
- Kibana: http://localhost:5601
- Prometheus: http://localhost:9090
- Airflow: http://localhost:8081
- MinIO: http://localhost:9000
# Stop and remove everything
make down
# Remove volumes (WARNING: This deletes all data)
docker-compose down -v
# Rebuild and restart
make build-images
make up# View running containers
docker-compose ps
# View service health
docker-compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"Key variables in .env:
AIRFLOW__CORE__FERNET_KEY: Generate withpython -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"LLM_API_KEY: Your OpenAI or other LLM service API keyGIT_SSH_KEY: Base64 encoded SSH private keyELASTIC_PASSWORD: Elasticsearch password (at least 8 characters)