opencrates 0.1.1

AI-powered Rust crate generator and registry with advanced template system
Documentation
version: '3.8'

services:
  # OpenCrates main application
  opencrates:
    build: .
    ports:
      - "8080:8080"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    volumes:
      - ./data:/data
    depends_on:
      - postgres
      - redis

  # PostgreSQL database
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: opencrates
      POSTGRES_USER: opencrates
      POSTGRES_PASSWORD: opencrates
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  # Redis for caching
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

  # Prometheus for metrics
  prometheus:
    image: prom/prometheus:latest
    container_name: opencrates-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'
    ports:
      - "9091:9090"
    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    networks:
      - opencrates-network
    restart: unless-stopped
    depends_on:
      - opencrates

  # Grafana for metrics visualization
  grafana:
    image: grafana/grafana-oss:latest
    container_name: opencrates-grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
      - ./config/grafana/provisioning:/etc/grafana/provisioning
      - ./config/grafana/dashboards:/var/lib/grafana/dashboards
    networks:
      - opencrates-network
    restart: unless-stopped
    depends_on:
      - prometheus

  # Jaeger for distributed tracing
  jaeger:
    image: jaegertracing/all-in-one:latest
    container_name: opencrates-jaeger
    ports:
      - "16686:16686"  # Jaeger UI
      - "14268:14268"  # HTTP collector
      - "14250:14250"  # gRPC collector
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    volumes:
      - jaeger_data:/tmp
    networks:
      - opencrates-network
    restart: unless-stopped

  # Nginx reverse proxy
  nginx:
    image: nginx:alpine
    container_name: opencrates-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - ./ssl:/etc/nginx/ssl
    networks:
      - opencrates-network
    restart: unless-stopped
    depends_on:
      - opencrates
      - grafana

  # Elasticsearch for search and logs
  elasticsearch:
    image: elasticsearch:8.11.0
    container_name: opencrates-elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=false
      - xpack.security.enrollment.enabled=false
    ports:
      - "9200:9200"
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    networks:
      - opencrates-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200/_cluster/health"]
      interval: 30s
      timeout: 10s
      retries: 5

  # Kibana for log visualization
  kibana:
    image: kibana:8.11.0
    container_name: opencrates-kibana
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=password
    networks:
      - opencrates-network
    restart: unless-stopped
    depends_on:
      elasticsearch:
        condition: service_healthy

  # Mailhog for email testing (development)
  mailhog:
    image: mailhog/mailhog:latest
    container_name: opencrates-mailhog
    ports:
      - "8025:8025"  # Web UI
      - "1025:1025"  # SMTP
    networks:
      - opencrates-network
    restart: unless-stopped
    profiles:
      - development

  # MinIO for S3-compatible storage (development)
  minio:
    image: minio/minio:latest
    container_name: opencrates-minio
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"  # API
      - "9001:9001"  # Console
    environment:
      - MINIO_ROOT_USER=minio
      - MINIO_ROOT_PASSWORD=miniopassword
    volumes:
      - minio_data:/data
    networks:
      - opencrates-network
    restart: unless-stopped
    profiles:
      - development
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  # Development tools container
  tools:
    build:
      context: .
      dockerfile: Dockerfile
      target: development
    container_name: opencrates-tools
    volumes:
      - .:/app
      - cargo_cache:/usr/local/cargo/registry
    working_dir: /app
    command: ["tail", "-f", "/dev/null"]
    networks:
      - opencrates-network
    profiles:
      - development

networks:
  opencrates-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

volumes:
  postgres_data:
  redis_data:
  prometheus_data:
  grafana_data:
  jaeger_data:
  elasticsearch_data:
  minio_data:
  cargo_cache:
    driver: local