version: '3.8' services: # PDF转换工具应用 pdf-tools: build: . ports: - "3001:3001" environment: - NODE_ENV=production - MONGODB_URI=mongodb://mongo:27017/pdf-tools - REDIS_URL=redis://redis:6379 - JWT_SECRET=${JWT_SECRET:-your-super-secret-jwt-key} - PORT=3001 volumes: - uploads:/app/uploads - outputs:/app/outputs - logs:/app/logs depends_on: - mongo - redis networks: - pdf-tools-network restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # MongoDB数据库 mongo: image: mongo:6.0 environment: - MONGO_INITDB_ROOT_USERNAME=${MONGO_USERNAME:-admin} - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD:-password} - MONGO_INITDB_DATABASE=pdf-tools volumes: - mongo-data:/data/db - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro ports: - "27017:27017" networks: - pdf-tools-network restart: unless-stopped healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 30s timeout: 10s retries: 3 start_period: 40s # Redis缓存 redis: image: redis:7-alpine command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redis123} volumes: - redis-data:/data ports: - "6379:6379" networks: - pdf-tools-network restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 30s timeout: 3s retries: 3 start_period: 30s # Nginx反向代理 (可选) nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl:ro depends_on: - pdf-tools networks: - pdf-tools-network restart: unless-stopped profiles: - production # 监控服务 (可选) prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./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' networks: - pdf-tools-network restart: unless-stopped profiles: - monitoring grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} volumes: - grafana-data:/var/lib/grafana depends_on: - prometheus networks: - pdf-tools-network restart: unless-stopped profiles: - monitoring # 网络配置 networks: pdf-tools-network: driver: bridge # 数据卷 volumes: mongo-data: driver: local redis-data: driver: local uploads: driver: local outputs: driver: local logs: driver: local prometheus-data: driver: local grafana-data: driver: local