felix-framework / docker-compose.yml
jkbennitt
Clean hf-space branch and prepare for HuggingFace Spaces deployment
fb867c3
# Felix Framework - Development and Testing Docker Compose
# Comprehensive development environment with monitoring and testing services
version: '3.8'
services:
# Main Felix Framework application
felix-framework:
build:
context: .
dockerfile: Dockerfile
target: runtime
args:
TORCH_VERSION: "2.0.1"
CUDA_VERSION: "cu118"
container_name: felix-framework-app
restart: unless-stopped
ports:
- "7860:7860" # Main application port
- "8080:8080" # Metrics/monitoring port
environment:
- ENVIRONMENT=development
- FELIX_DEBUG=true
- FELIX_TOKEN_BUDGET=10000
- PORT=7860
- METRICS_PORT=8080
# HF_TOKEN should be set via .env file or environment
- HF_TOKEN=${HF_TOKEN:-}
- SPACES_ZERO_GPU=false # Set to true for ZeroGPU testing
volumes:
# Development volume mounts
- ./src:/app/src:ro # Read-only source code
- ./app.py:/app/app.py:ro # Main application file
- ./logs:/app/logs # Persistent logs
- ./cache:/app/cache # Application cache
- ./metrics:/app/metrics # Performance metrics
- ./benchmarks:/app/benchmarks # Benchmark results
networks:
- felix-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7860/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
deploy:
resources:
limits:
memory: 4G
cpus: '2.0'
reservations:
memory: 2G
cpus: '1.0'
# Redis for caching and session management
redis:
image: redis:7-alpine
container_name: felix-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis-data:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf:ro
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- felix-network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
# Prometheus for metrics collection
prometheus:
image: prom/prometheus:latest
container_name: felix-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
networks:
- felix-network
# Grafana for metrics visualization
grafana:
image: grafana/grafana:latest
container_name: felix-grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SECURITY_ADMIN_USER=admin
volumes:
- grafana-data:/var/lib/grafana
- ./config/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ./config/grafana/datasources:/etc/grafana/provisioning/datasources:ro
networks:
- felix-network
depends_on:
- prometheus
# PostgreSQL for persistent data storage
postgres:
image: postgres:15-alpine
container_name: felix-postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_DB=felix_framework
- POSTGRES_USER=felix
- POSTGRES_PASSWORD=felix_dev_password
- POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=en_US.UTF-8"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./config/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- felix-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U felix -d felix_framework"]
interval: 30s
timeout: 10s
retries: 3
# Performance testing service
performance-test:
build:
context: .
dockerfile: Dockerfile
target: runtime
container_name: felix-performance-test
environment:
- ENVIRONMENT=testing
- FELIX_DEBUG=true
- TEST_MODE=performance
volumes:
- ./tests:/app/tests:ro
- ./benchmarks:/app/benchmarks
- ./scripts:/app/scripts:ro
networks:
- felix-network
depends_on:
- felix-framework
command: >
sh -c "
echo '🧪 Starting performance tests...'
python -m pytest tests/performance/ -v --benchmark-json=benchmarks/docker-benchmarks.json
echo '✅ Performance tests completed'
"
profiles:
- testing # Only start with --profile testing
# Load testing with Artillery
load-test:
image: artilleryio/artillery:latest
container_name: felix-load-test
volumes:
- ./tests/load:/tests:ro
- ./benchmarks:/benchmarks
networks:
- felix-network
depends_on:
- felix-framework
command: >
sh -c "
echo '🔥 Starting load tests...'
artillery run /tests/load-test-config.yml --output /benchmarks/load-test-results.json
echo '✅ Load tests completed'
"
profiles:
- testing
# Development tools container
dev-tools:
build:
context: .
dockerfile: Dockerfile
target: builder # Use builder stage for development tools
container_name: felix-dev-tools
volumes:
- .:/app
- felix-cache:/app/.cache
environment:
- ENVIRONMENT=development
- FELIX_DEBUG=true
networks:
- felix-network
working_dir: /app
command: >
sh -c "
echo '🛠️ Development tools container ready'
echo 'Available commands:'
echo ' - pytest: Run tests'
echo ' - black: Code formatting'
echo ' - isort: Import sorting'
echo ' - mypy: Type checking'
echo ' - bandit: Security scanning'
tail -f /dev/null
"
profiles:
- development
# Networks
networks:
felix-network:
driver: bridge
name: felix-network
# Volumes for persistent data
volumes:
redis-data:
name: felix-redis-data
prometheus-data:
name: felix-prometheus-data
grafana-data:
name: felix-grafana-data
postgres-data:
name: felix-postgres-data
felix-cache:
name: felix-cache
# Development and testing configurations
x-common-variables: &common-variables
FELIX_VERSION: "1.0.0"
FELIX_ENVIRONMENT: "docker"
PYTHONPATH: "/app"
x-resource-limits: &resource-limits
deploy:
resources:
limits:
memory: 2G
cpus: '1.0'