# DataFlow-EDU 单机生产部署(本地 / 阿里云服务器通用):双容器 + 共享数据卷。 # - worker:Express + Python 同住,跑后端 API、SSE、教师端任务子进程链路。 # - web:Nginx 仅 serve 前端 dist + 反代 /api/ 到 worker:3000。 # - 两个 named volume 分别挂到 SQLite (webui/server/data) 与 # 用户任务产物 (dataflow_edu/data/users),备份/快照一并走。 services: worker: build: context: . dockerfile: Dockerfile.python image: dataflow-edu-worker:latest restart: unless-stopped env_file: - webui/server/.env environment: NODE_ENV: production PORT: "3000" volumes: - appdata-users:/app/dataflow_edu/data/users - appdata-sqlite:/app/webui/server/data expose: - "3000" # 仅在本地 dev 想直连 worker 时启用 ports: # ports: # - "3000:3000" healthcheck: # worker 镜像只有 curl,无 wget;失败会导致 STATUS unhealthy 但服务实际正常 test: ["CMD", "curl", "-sf", "http://localhost:3000/api/healthz"] interval: 30s timeout: 5s retries: 3 start_period: 15s web: build: context: . dockerfile: Dockerfile.web image: dataflow-edu-web:latest restart: unless-stopped depends_on: - worker ports: - "8080:80" backup: image: keinos/sqlite3:latest user: root restart: unless-stopped depends_on: - worker volumes: - appdata-sqlite:/app/webui/server/data - ./scripts/backup.sh:/backup.sh:ro # busybox crond:每天 03:00 执行备份脚本 # -f: 前台运行;-l 8: log level notice entrypoint: > sh -c " mkdir -p /var/spool/cron/crontabs && echo '0 3 * * * sh /backup.sh >> /var/log/backup.log 2>&1' > /var/spool/cron/crontabs/root && crond -f -l 8 " volumes: appdata-users: appdata-sqlite: