docs/docs-cn/7-server-migration-guide.md
适用版本: Data Formulator 0.7+ 面向读者: 部署运维人员
将 Data Formulator 从旧服务器迁移到新服务器(包括 Docker 容器重建、云主机更换、版本升级等场景)时,需要正确搬运密钥文件和数据目录,否则会出现用户登录失效、凭证丢失、图表无法刷新等问题。
本文提供完整的迁移清单和操作步骤。
以下文件/配置在迁移时 必须 保留:
| 文件 / 配置项 | 默认位置 | 作用 | 丢失后果 |
|---|---|---|---|
FLASK_SECRET_KEY | .env 环境变量 | 签名 Session Cookie、派生代码签名密钥 | 所有用户被踢出登录,Agent 生成的代码签名失效 |
.vault_key | DATA_FORMULATOR_HOME/.vault_key | 加密凭证保险箱的 Fernet 密钥 | credentials.db 中的数据库密码等凭证无法解密 |
credentials.db | DATA_FORMULATOR_HOME/credentials.db | 加密的凭证数据库 | 用户保存的数据库密码、数据源服务凭证全部丢失 |
connectors.yaml | DATA_FORMULATOR_HOME/connectors.yaml | 管理员预配置的全局数据源连接 | 管理员配置的数据源卡片消失 |
users/ 目录 | DATA_FORMULATOR_HOME/users/ | 用户工作区数据(parquet、会话元数据) | 用户的图表和数据全部丢失 |
workspaces/ 目录 | DATA_FORMULATOR_HOME/workspaces/ | 遗留默认工作区(旧版数据) | 同上 |
| 配置项 | 说明 |
|---|---|
DF_CODE_SIGNING_SECRET | 显式设定的代码签名密钥,优先级高于 Flask 密钥。设置过则必须带走,否则已有代码签名全部失效 |
CREDENTIAL_VAULT_KEY | 显式设定的 Vault 加密密钥,优先级高于 .vault_key 文件。设置过则必须带走,否则凭证数据库不可读 |
DF_SOURCES__* | 通过环境变量配置的数据源连接。设置过则必须迁移到新服务器的 .env、容器环境或 Secret Manager |
DF_PLUGIN_DIR | 外部 Data Loader 目录。设置过则必须同时迁移该目录内容 |
PLG_SUPERSET_URL | Superset 快捷配置。设置过则新服务器也需要保留,否则 Superset 数据源卡片不会自动注册 |
FLASK_SECRET_KEY 影响两个核心功能:
Session 签名(影响:高)
Flask 使用此密钥对浏览器 Cookie 进行签名。密钥变更后:
session["df_user"])失效,需重新走 SSO 认证流程session["_oauth_state"] 失效)Agent 代码签名(影响:中)
系统使用从 Flask 密钥派生的 HMAC 密钥对 Agent 生成的 Python 代码进行签名。密钥变更后:
注意:如果没有在
.env中显式设定FLASK_SECRET_KEY,系统每次启动都会随机生成一个临时密钥,重启后所有 Session 和代码签名就会失效。生产环境务必显式设定此值。
.vault_key(或 CREDENTIAL_VAULT_KEY)影响凭证保险箱:
credentials.db 中存储的数据库密码、服务凭证使用此密钥加密详见 凭证保险箱文档。
# 数据目录优先级:--data-dir CLI参数 > DATA_FORMULATOR_HOME 环境变量 > ~/.data_formulator
# 查看当前配置
grep DATA_FORMULATOR_HOME .env
下文用 $DF_HOME 代指实际数据目录路径。
# 1. 备份配置文件(含 FLASK_SECRET_KEY 等所有密钥)
cp .env /backup/.env
# 2. 备份 Vault 密钥和凭证数据库
cp $DF_HOME/.vault_key /backup/.vault_key
cp $DF_HOME/credentials.db /backup/credentials.db
# 3. 备份管理员预配置连接(如存在)
[ -f $DF_HOME/connectors.yaml ] && cp $DF_HOME/connectors.yaml /backup/connectors.yaml
# 4. 备份用户工作区数据和用户连接配置
cp -r $DF_HOME/users /backup/users
cp -r $DF_HOME/workspaces /backup/workspaces
# 5.(可选)如设置了 DF_PLUGIN_DIR,备份外部 Loader 目录
[ -n "$DF_PLUGIN_DIR" ] && cp -r $DF_PLUGIN_DIR /backup/df-plugins
# 6.(可选)如使用 Azure Blob 存储后端,工作区数据在云端,无需备份 users/ 和 workspaces/
# 1. 安装 Data Formulator(新版本或同版本)
pip install data-formulator # 或其他安装方式
# 2. 恢复配置文件
cp /backup/.env .env
# 检查并按需修改新环境相关的配置(端口、域名等)
# 3. 创建数据目录并恢复密钥
mkdir -p $DF_HOME
cp /backup/.vault_key $DF_HOME/.vault_key
cp /backup/credentials.db $DF_HOME/credentials.db
[ -f /backup/connectors.yaml ] && cp /backup/connectors.yaml $DF_HOME/connectors.yaml
# 4. 恢复工作区数据和用户连接配置
cp -r /backup/users $DF_HOME/users
cp -r /backup/workspaces $DF_HOME/workspaces
# 5.(可选)恢复外部 Loader 目录,并确认 DF_PLUGIN_DIR 指向它
[ -d /backup/df-plugins ] && cp -r /backup/df-plugins $DF_PLUGIN_DIR
# 6. 启动服务
data_formulator
如果使用 Docker,将数据目录挂载为命名卷:
# docker-compose.yml
services:
data-formulator:
image: data-formulator:latest
env_file: .env
volumes:
- df-data:/root/.data_formulator
ports:
- "5567:5567"
volumes:
df-data:
迁移步骤:
# 1. 导出旧容器���数据卷
docker run --rm -v df-data:/data -v $(pwd)/backup:/backup \
alpine tar czf /backup/df-data.tar.gz -C /data .
# 2. 在新服务器上导入
docker volume create df-data
docker run --rm -v df-data:/data -v $(pwd)/backup:/backup \
alpine tar xzf /backup/df-data.tar.gz -C /data
# 3. 复制 .env 到新服务器,启动容器
docker compose up -d
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| 用户登录 | 访问页面,检查是否仍处于登录状态 | 无需重新登录(Session 未失效) |
| SSO 认证 | 退出后重新 SSO 登录 | 能正常完成 SSO 流程 |
| 已有图表 | 打开旧图表,点击刷新数据 | 正常刷新,不报签名错误 |
| 数据库连接 | 打开数据源面板,查看已保存的连接 | 显示"已连接"状态,无需重新输入密码 |
| 外部系统 Token | 打开 Superset 等数据源连接 | 自动登录或正常授权 |
| 管理员连接 | 打开 Load Data 页面 | connectors.yaml 或 DF_SOURCES__* 配置的数据源卡片正常显示 |
| 用户连接 | 切换到已有用户 | 用户自己创建的数据源卡片正常显示 |
| 外部 Loader | 打开 Add Connection | DF_PLUGIN_DIR 中的自定义 loader 正常出现在可选列表 |
如果之前未显式设定 FLASK_SECRET_KEY(使用的是自动生成的临时密钥),则无法恢复。影响和处理方式:
| 影响 | 处理方式 |
|---|---|
| 所有用户被踢出登录 | 用户重新 SSO 登录即可 |
| Agent 代码签名失效 | 用户重新执行 Agent 生成新代码(自动获得新签名) |
| 工作区数据 | 不受影响(parquet 文件不依赖此密钥) |
建议:在新服务器上立即设定一个固定的 FLASK_SECRET_KEY,防止下次再丢失:
# 生成一个安全的随机密钥
python -c "import secrets; print(secrets.token_hex(32))"
# 将输出写入 .env
# FLASK_SECRET_KEY=<生成的密钥>
Vault 加密密钥丢失后,已存储的凭证 无法恢复。处理方式:
credentials.db(已无法解密).vault_key生产环境务必显式设定 FLASK_SECRET_KEY:写入 .env,不要依赖自动生成
python -c "import secrets; print(secrets.token_hex(32))"
定期备份数据目录:$DF_HOME 整个目录包含密钥、凭证、工作区数据,备份它就够了
Docker 部署使用命名卷:避免使用匿名卷,方便识别和迁移
密钥管理:在企业部署中,考虑使用外部 Secrets Manager 注入 FLASK_SECRET_KEY 和 CREDENTIAL_VAULT_KEY,避免密钥散落在文件系统中
升级前备份:版本升级前也执行完整备份流程,以便回退