version: '3.8' services: fileshare: build: context: . dockerfile: Dockerfile.multi # 使用多阶段构建优化镜像 args: - PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ - PIP_TRUSTED_HOST=mirrors.aliyun.com image: fileshare:latest container_name: fileshare-service restart: unless-stopped ports: - "${PORT:-8000}:8000" environment: - HOST=0.0.0.0 - PORT=8000 - MAX_FILE_SIZE=${MAX_FILE_SIZE:-104857600} # 100MB - EXPIRE_MINUTES=${EXPIRE_MINUTES:-15} volumes: # 持久化上传目录(可选,重启后文件会保留) - ./data/uploads:/app/uploads # 日志目录(可选) - ./data/logs:/app/logs networks: - fileshare-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: cpus: '1.0' memory: 512M reservations: cpus: '0.5' memory: 256M # Traefik 反向代理 (使用阿里云镜像) traefik: image: registry.cn-hangzhou.aliyuncs.com/acs/traefik:v3.0 container_name: fileshare-traefik restart: unless-stopped profiles: - traefik command: - "--api.dashboard=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" - "--certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL:-admin@localhost}" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - "--log.level=INFO" - "--accesslog=true" ports: - "80:80" - "443:443" - "8080:8080" # Traefik dashboard volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/letsencrypt:/letsencrypt - ./data/logs/traefik:/var/log/traefik networks: - fileshare-network labels: - "traefik.enable=true" - "traefik.http.routers.dashboard.rule=Host(`traefik.localhost`)" - "traefik.http.routers.dashboard.service=api@internal" - "traefik.http.middlewares.dashboard-auth.basicauth.users=${TRAEFIK_AUTH:-admin:$$2y$$10$$WQiE8P/7W8MZ0GKJYLgVAOUV8D5e6Y7s8rF8w1M9i6QjLqN/3rZ0G}" # Redis缓存 (使用阿里云镜像) redis: image: registry.cn-hangzhou.aliyuncs.com/acs/redis:7-alpine container_name: fileshare-redis restart: unless-stopped profiles: - redis ports: - "6379:6379" volumes: - ./data/redis:/data - ./config/redis.conf:/usr/local/etc/redis/redis.conf:ro networks: - fileshare-network command: redis-server /usr/local/etc/redis/redis.conf deploy: resources: limits: cpus: '0.5' memory: 256M reservations: cpus: '0.2' memory: 128M # Nginx (可选,用于静态文件服务) nginx: image: registry.cn-hangzhou.aliyuncs.com/acs/nginx:alpine container_name: fileshare-nginx restart: unless-stopped profiles: - nginx ports: - "80:80" volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf:ro - ./data/uploads:/usr/share/nginx/html/uploads:ro - ./data/logs/nginx:/var/log/nginx networks: - fileshare-network depends_on: - fileshare networks: fileshare-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 volumes: uploads: driver: local logs: driver: local redis_data: driver: local