# 生产部署与数据对齐 ## 1. 当前项目是否能在 Docker 中单独运行 - **能**。爬虫镜像 `Dockerfile.crawler` 自包含 Python 3.11 + `crawler/requirements.txt`(含 dashscope),无宿主机 Python 版本依赖。 - **两种常见用法**: - **docker-compose 一起跑**:API + 爬虫都在容器内,共用一个命名卷 `app-data`,天然对齐。 - **爬虫单独 Docker、API 在宿主机**:爬虫容器通过挂载宿主机上的 **同一个** `server/data.db`,并设置 `API_BASE` 指向宿主机 API,即可单独运行且数据一致。 ## 2. 数据对齐(必须满足) | 角色 | 使用的 DB 路径(示例) | 说明 | |--------|-------------------------------|------| | Node API | `process.env.DB_PATH` 或 `server/data.db` | 见 `server/db.js`、`docker-entrypoint.sh` | | 爬虫(Docker 内) | `DB_PATH=/data/data.db`,且 `/data/data.db` 由宿主机同一文件挂载 | 见 `Dockerfile.crawler`、`crawler/config.py` | **原则**:API 和爬虫必须读写 **同一个 SQLite 文件**。否则会出现「爬虫写了库、API 读不到」或反之。 - **docker-compose 全容器**:两边都用卷 `app-data`,路径均为 `/data/data.db`,自动对齐。 - **API 宿主机 + 爬虫 Docker**:宿主机 API 的 `DB_PATH` 指向例如 `$PROJECT/server/data.db`;爬虫启动时用 `-v $PROJECT/server/data.db:/data/data.db` 和 `-e DB_PATH=/data/data.db`,即对齐。 ## 3. 生产脚本与用法 ### 3.1 爬虫单独 Docker(API 在宿主机,如 PM2) ```bash # 首次:构建镜像并启动爬虫容器(会读 .env 中的 DASHSCOPE_API_KEY) ./scripts/production-start.sh # 或分步: docker build -t usa-dashboard-crawler:latest -f Dockerfile.crawler . ./scripts/run-crawler-docker-standalone.sh ``` 可调环境变量(在运行脚本前 export 或写在 .env): - `PROJECT_ROOT`:项目根目录,默认当前目录;用于解析 `server/data.db`。 - `DB_FILE`:宿主机 DB 绝对路径,默认 `$PROJECT_ROOT/server/data.db`。 - `API_BASE`:爬虫通知 API 的地址,默认 `http://host.docker.internal:3001`(Linux 下脚本会自动加 `--add-host=host.docker.internal:host-gateway`)。 - `DASHSCOPE_API_KEY`:阿里云 DashScope,启用 AI 清洗(可选)。 ### 3.2 docker-compose 全栈(API + 爬虫都在容器) ```bash # 启动 docker compose up -d # 或传入 DASHSCOPE_API_KEY DASHSCOPE_API_KEY=sk-xxx docker compose up -d # 停止 docker compose down ``` 此时 API 与爬虫共用卷 `app-data`,DB 路径均为 `/data/data.db`,无需额外对齐。 ### 3.3 宿主机 API(PM2)使用的 DB 路径 确保 PM2 启动 API 时使用的 DB 与爬虫挂载的是同一文件,例如: - 在 ecosystem 或启动命令里设置:`DB_PATH=/www/wwwroot/www.airtep.com2/usa/server/data.db` - 或项目根目录即部署目录时,不设则默认为 `server/data.db`(相对路径以进程 cwd 为准)。 ## 4. 检查清单 - [ ] API 与爬虫使用**同一 DB 文件**(见上表)。 - [ ] 爬虫能访问到 API:`API_BASE` 在「爬虫单独 Docker」场景下指向宿主机(如 `http://host.docker.internal:3001`),在 compose 场景下为 `http://api:3001`。 - [ ] 若需 AI 清洗:在爬虫侧设置 `DASHSCOPE_API_KEY`(compose 或 standalone 脚本的 .env/环境变量)。 - [ ] 首次部署或无 DB 时:先创建并初始化 DB(例如 `DB_PATH=server/data.db node server/seed.js`),再启动爬虫容器。