# DeerFlow 后台离线部署说明 本文档只说明“后台服务”的离线部署,不包含前端。 ## 1. 当前服务器文件位置 当前已经在服务器上准备好的部署目录是: ```bash /opt/deerflow-backend ``` 主要文件和目录如下: ```text /opt/deerflow-backend/ ├── dist/deerflow-backend-offline.tar # 离线 Docker 镜像包 ├── start-backend-docker.sh # 启动脚本 ├── save-backend-image.sh # 镜像导出脚本 ├── build-backend-image.sh # 在线构建脚本 ├── config.yaml # 默认配置模板 ├── extensions_config.json # 默认扩展配置模板 ├── langgraph.json # LangGraph 配置 ├── .env # 环境变量文件,没有则启动脚本会创建空文件 ├── .deer-flow/agents/ # 默认智能体模板目录 ├── skills/ # 默认技能模板目录 └── docker-data/ # 实际运行时挂载数据,启动后生成 ``` 当前服务器已验证: ```bash cd /opt/deerflow-backend ./start-backend-docker.sh 8001 ``` 健康检查: ```bash curl http://127.0.0.1:8001/health curl http://127.0.0.1:8001/api/health ``` ## 2. 客户现场更换部署目录 客户现场可以换任意部署目录,不需要改脚本。把整个 `deerflow-backend` 目录放到目标位置即可。 示例:客户现场部署到 `/data/deerflow-backend` ```bash DEPLOY_DIR=/data/deerflow-backend mkdir -p "$DEPLOY_DIR" # 将交付的 deerflow-backend 目录内容放到 $DEPLOY_DIR cd "$DEPLOY_DIR" chmod +x *.sh ``` 加载离线镜像: ```bash docker load -i dist/deerflow-backend-offline.tar ``` 启动后台,端口可改: ```bash ./start-backend-docker.sh 8001 ``` 如果客户现场要用 `9001` 端口: ```bash ./start-backend-docker.sh 9001 ``` 脚本会自动把当前目录作为代码目录,把数据放到: ```text $DEPLOY_DIR/docker-data ``` ## 3. 数据、配置、智能体、技能目录 启动后,实际可修改的文件都在宿主机目录,不在容器内部。 默认目录如下: ```text $DEPLOY_DIR/docker-data/config # 配置目录 $DEPLOY_DIR/docker-data/.deer-flow # 运行时目录:智能体、用户数据、SQLite 数据 $DEPLOY_DIR/docker-data/skills # 技能目录 $DEPLOY_DIR/docker-data/knowledge # 知识库目录 $DEPLOY_DIR/docker-data/logs # 日志目录 ``` 配置文件位置: ```text $DEPLOY_DIR/docker-data/config/config.yaml $DEPLOY_DIR/docker-data/config/extensions_config.json $DEPLOY_DIR/docker-data/config/langgraph.json $DEPLOY_DIR/docker-data/config/.env ``` 智能体目录: ```text $DEPLOY_DIR/docker-data/.deer-flow/agents ``` 技能目录: ```text $DEPLOY_DIR/docker-data/skills/public $DEPLOY_DIR/docker-data/skills/custom ``` SQLite 聊天/checkpointer 数据库目录: ```text $DEPLOY_DIR/docker-data/.deer-flow/data $DEPLOY_DIR/docker-data/.deer-flow/.deer-flow/data ``` 注意:当前部署使用 **MySQL 业务库 + SQLite 聊天/checkpointer 库**,不使用 PostgreSQL。SQLite 运行时可能同时有以下文件,备份或替换时要一起处理: ```text deerflow.db deerflow.db-wal deerflow.db-shm ``` ## 4. 客户现场加载智能体和技能 推荐流程: 1. 先启动一次,让目录自动生成。 2. 停止容器。 3. 复制客户的智能体、技能、SQLite 聊天库文件,并配置 MySQL 地址。 4. 再启动容器。 命令示例: ```bash cd "$DEPLOY_DIR" ./start-backend-docker.sh 8001 docker rm -f deerflow-backend ``` 复制智能体: ```bash mkdir -p "$DEPLOY_DIR/docker-data/.deer-flow/agents" cp -a /path/to/customer-agents/. "$DEPLOY_DIR/docker-data/.deer-flow/agents/" ``` 复制技能: ```bash mkdir -p "$DEPLOY_DIR/docker-data/skills/public" mkdir -p "$DEPLOY_DIR/docker-data/skills/custom" cp -a /path/to/customer-skills/public/. "$DEPLOY_DIR/docker-data/skills/public/" cp -a /path/to/customer-skills/custom/. "$DEPLOY_DIR/docker-data/skills/custom/" ``` 重新启动: ```bash cd "$DEPLOY_DIR" ./start-backend-docker.sh 8001 ``` 如果只更新技能或智能体,不换数据库,也可以复制后直接重启: ```bash docker restart deerflow-backend ``` ## 5. 修改或替换 SQLite 聊天/checkpointer 数据库 SQLite 只保存聊天运行时、LangGraph checkpointer、部分本地运行数据。业务表使用 MySQL,MySQL 地址见第 6 节。 最稳的方式是停容器后整体替换运行时目录: ```bash cd "$DEPLOY_DIR" docker rm -f deerflow-backend mv docker-data/.deer-flow docker-data/.deer-flow.bak.$(date +%Y%m%d%H%M%S) cp -a /path/to/customer-dot-deer-flow "$DEPLOY_DIR/docker-data/.deer-flow" ./start-backend-docker.sh 8001 ``` 如果只替换数据库文件,至少要处理这两个目录里的 `deerflow.db*`: ```text $DEPLOY_DIR/docker-data/.deer-flow/data/deerflow.db* $DEPLOY_DIR/docker-data/.deer-flow/.deer-flow/data/deerflow.db* ``` 操作示例: ```bash cd "$DEPLOY_DIR" docker rm -f deerflow-backend mkdir -p docker-data/.deer-flow/data mkdir -p docker-data/.deer-flow/.deer-flow/data cp -a /path/to/db-main/deerflow.db* docker-data/.deer-flow/data/ cp -a /path/to/db-runtime/deerflow.db* docker-data/.deer-flow/.deer-flow/data/ ./start-backend-docker.sh 8001 ``` 不要在容器运行时直接覆盖 SQLite 文件,容易损坏 WAL 数据。 ## 6. 修改配置和数据库配置 默认配置会在第一次启动时复制到: ```text $DEPLOY_DIR/docker-data/config/config.yaml ``` 要改配置,改这个文件,不要进容器改。 本项目现场部署按 **MySQL + SQLite** 使用: - MySQL:业务表,例如用户、智能体、技能、任务、菜单、按钮、敏感词、轻应用等。 - SQLite:聊天运行时和 LangGraph checkpointer,继续放在挂载出来的 `.deer-flow` 目录。 - 不使用 PostgreSQL,不要配置 `database.backend: postgres`,也不要配置 `POSTGRES_URL`。 MySQL 地址主要改两个文件: ```text $DEPLOY_DIR/docker-data/config/config.yaml $DEPLOY_DIR/docker-data/config/.env ``` `config.yaml` 里的数据库配置建议改成: ```yaml database: backend: mysql sqlite_dir: .deer-flow/data mysql_url: $MYSQL_DATABASE_URL pool_size: 20 max_overflow: 20 pool_timeout: 30 echo_sql: false checkpointer: type: sqlite connection_string: .deer-flow/data/deerflow.db ``` 然后在 `.env` 里写 MySQL 连接地址: ```bash MYSQL_DATABASE_URL=mysql+asyncmy://deerflow:密码@192.168.1.10:3306/deerflow?charset=utf8mb4 ``` 把上面示例里的内容换成客户现场真实值: ```text deerflow # MySQL 用户名 密码 # MySQL 密码 192.168.1.10 # MySQL 服务器 IP 3306 # MySQL 端口 deerflow # MySQL 数据库名 ``` 如果 MySQL 就装在 Docker 宿主机这台服务器上,容器里不要写 `127.0.0.1`,建议写: ```bash MYSQL_DATABASE_URL=mysql+asyncmy://deerflow:密码@host.docker.internal:3306/deerflow?charset=utf8mb4 ``` 如果密码里有特殊字符,需要做 URL 编码,常见示例: ```text @ 写成 %40 # 写成 %23 % 写成 %25 空格 写成 %20 ``` MySQL 数据库建议提前建好: ```sql CREATE DATABASE deerflow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 如果 MySQL 用户有建库权限,服务启动时也会尝试自动创建缺失的数据库。客户现场更稳的做法是先建库、导入 MySQL 备份,再启动后台。 如果客户现场已有 MySQL 备份,先在客户 MySQL 中导入: ```bash mysql -h 192.168.1.10 -P 3306 -u deerflow -p deerflow < deerflow_mysql.sql ``` SQLite 聊天库仍按第 5 节复制到: ```text $DEPLOY_DIR/docker-data/.deer-flow/data/deerflow.db* $DEPLOY_DIR/docker-data/.deer-flow/.deer-flow/data/deerflow.db* ``` 如果需要把数据目录单独放到别的位置,不需要改 `config.yaml`,启动时指定 `DATA_DIR` 更稳: ```bash cd "$DEPLOY_DIR" DATA_DIR=/data/deerflow-backend-data ./start-backend-docker.sh 8001 ``` 此时实际目录变成: ```text /data/deerflow-backend-data/config /data/deerflow-backend-data/.deer-flow /data/deerflow-backend-data/skills /data/deerflow-backend-data/knowledge /data/deerflow-backend-data/logs ``` 如果客户现场部署目录变化,只需要换 `DEPLOY_DIR` 或把整包放到新目录;MySQL 地址仍然只改 `$DEPLOY_DIR/docker-data/config/.env`,SQLite/智能体/技能仍然跟着 `DATA_DIR` 走。 如果要改 `.env`,位置是: ```text $DEPLOY_DIR/docker-data/config/.env ``` 修改配置后重启: ```bash cd "$DEPLOY_DIR" docker rm -f deerflow-backend ./start-backend-docker.sh 8001 ``` ## 7. 常用运维命令 查看容器: ```bash docker ps -a --filter name=deerflow-backend ``` 查看日志: ```bash docker logs -f --tail 200 deerflow-backend ``` 停止: ```bash docker rm -f deerflow-backend ``` 重启: ```bash docker restart deerflow-backend ``` 重新启动并换端口: ```bash cd "$DEPLOY_DIR" ./start-backend-docker.sh 9001 ``` 检查接口: ```bash curl http://127.0.0.1:8001/health curl http://127.0.0.1:8001/api/health ``` ## 8. 交付清单 客户离线部署至少需要: ```text deerflow-backend/ ├── dist/deerflow-backend-offline.tar ├── start-backend-docker.sh ├── config.yaml ├── extensions_config.json ├── langgraph.json ├── .env ├── .deer-flow/agents/ ├── skills/ └── 其他后台代码文件 ``` 客户机器需要提前安装好 Docker。离线部署时不需要再下载 Python 依赖,依赖已经包含在 Docker 镜像里。