Data Formulator 服务器迁移指南:密钥文件与数据目录的完整搬运方案 📅 发布时间:2026/9/13 13:47:37 👁 浏览次数: Data Formulator 服务器迁移指南密钥文件与数据目录的完整搬运方案【免费下载链接】data-formulator Data Formulator is an interactive AI-powered data analysis system makes it easy to connect, explore and visualize data.项目地址: https://gitcode.com/GitHub_Trending/da/data-formulator适用版本Data Formulator 0.7面向读者部署运维人员导读当 Data Formulator 需要从旧服务器迁移到新服务器时包括 Docker 容器重建、云主机更换、版本升级等场景正确的做法不是只搬运代码和数据库而是必须把FLASK_SECRET_KEY、Vault 加密密钥、凭证数据库和用户工作区目录作为一个整体搬迁。本文以 docs/docs-cn/7-server-migration-guide.md 为主线结合仓库源码app.py、code_signing.py、local_vault.py讲解每一份文件丢失后的真实后果并提供完整的备份、恢复、Docker 迁移与迁移后验证清单。读完本文你将能无痛完成一次数据零丢失的服务器迁移并掌握防再次丢失的密钥管理最佳实践。1. 概述为什么迁移不是简单的拷代码Data Formulator 是一个交互式 AI 数据分析系统其运行状态分散在密钥、加密凭证和磁盘数据三处。如果迁移时只搬运程序本身而遗漏了密钥文件和数据目录会出现以下典型故障所有用户 Session 失效全体被踢出登录Agent 生成的图表代码签名验证失败点击刷新数据时拒绝执行credentials.db中保存的数据库密码、数据源服务凭证无法解密管理员预配置的数据源卡片消失用户自己创建的数据源卡片也丢失。这些问题的根因在于Data Formulator 的会话签名、代码签名和凭证加密都依赖持久化的密钥。因此迁移的核心任务是正确搬运密钥文件和数据目录而不是重新配置。数据目录的解析优先级源码确认仓库 workspace.py 中的get_data_formulator_home()明确给出了数据目录解析顺序Flaskapp.config[CLI_ARGS][data_dir]由--data-dirCLI 参数设置DATA_FORMULATOR_HOME环境变量默认值~/.data_formulator即Path.home() / .data_formulator。同时app.py 在启动时会优先读取DATA_FORMULATOR_HOME否则回退到用户主目录下的.data_formulator。这意味着同一台机器上如果用了不同启动参数实际数据目录可能不同——迁移前必须先确认当前部署到底把数据写在了哪里详见第 4.1 节。2. 关键文件清单迁移时必须保留的东西以下文件/配置在迁移时必须保留缺一不可文件 / 配置项默认位置作用丢失后果FLASK_SECRET_KEY.env环境变量签名 Session Cookie、派生代码签名密钥所有用户被踢出登录Agent 生成的代码签名失效.vault_keyDATA_FORMULATOR_HOME/.vault_key加密凭证保险箱的 Fernet 密钥credentials.db中的数据库密码等凭证无法解密credentials.dbDATA_FORMULATOR_HOME/credentials.db加密的凭证数据库用户保存的数据库密码、数据源服务凭证全部丢失connectors.yamlDATA_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 ManagerDF_PLUGIN_DIR外部 Data Loader 目录。设置过则必须同时迁移该目录内容PLG_SUPERSET_URLSuperset 快捷配置。设置过则新服务器也需要保留否则 Superset 数据源卡片不会自动注册提示.env.template仓库根目录对FLASK_SECRET_KEY的注释明确指出迁移服务器时务必把该值复制到新.env中否则重启后所有用户会话SSO 登录、插件 Token都会失效Agent 代码签名校验也会失败。建议在配置迁移时以.env.template为对照基准逐项核对。3. 密钥变更的影响详解3.1 FLASK_SECRET_KEY 变更FLASK_SECRET_KEY影响两个核心功能。Session 签名影响高Flask 使用此密钥对浏览器 Cookie 进行签名见 app.py。密钥变更后所有用户的 Session Cookie 签名校验失败 → 全体用户被踢出登录SSO 登录状态session[df_user]失效需重新走 SSO 认证流程外部系统 Token如 Superset失效需重新授权正在进行中的 OIDC 登录流程中断session[_oauth_state]失效。Agent 代码签名影响中系统使用从 Flask 密钥派生的 HMAC 密钥对 Agent 生成的 Python 代码进行签名。密钥变更后已有图表刷新数据时代码签名验证失败拒绝执行需要重新让 Agent 跑一遍生成新签名图表数据本身parquet 文件不受影响。源码级的密钥派生机制仓库 code_signing.py 中的_get_secret()展示了签名密钥的完整优先级DF_CODE_SIGNING_SECRET环境变量显式设定优先级最高适合多实例负载均衡部署--dev开发模式下的固定确定性密钥便于 reloader 热重载时不失效但不适合生产生产环境从 Flaskapp.secret_key派生——注意派生方式是hmac.new(bdf-code-signing, str(flask_secret), sha256)即使用独立 salt 派生避免更换 Flask 密钥时意外复用同一份密钥材料兜底回退密钥仅测试场景签名无法跨重启存活。这意味着只要FLASK_SECRET_KEY或DF_CODE_SIGNING_SECRET不变代码签名就能保持有效反过来一旦密钥变更所有已签名代码的校验都会失败。注意如果没有在.env中显式设定FLASK_SECRET_KEY系统每次启动都会随机生成一个临时密钥源码app.secret_key os.environ.get(FLASK_SECRET_KEY) or secrets.token_hex(16)重启后所有 Session 和代码签名就会失效。生产环境务必显式设定此值。3.2 Vault 密钥变更.vault_key或CREDENTIAL_VAULT_KEY影响凭证保险箱credentials.db中存储的数据库密码、服务凭证使用此密钥加密密钥丢失后加密数据不可逆无法恢复用户需要重新输入所有数据库密码。Vault 密钥的解析逻辑源码确认仓库 auth/vault/init.py 的_resolve_key()遵循先环境变量、后密钥文件的顺序CREDENTIAL_VAULT_KEY环境变量显式设定适合服务器部署与 Docker 卷挂载场景DATA_FORMULATOR_HOME/.vault_key文件首次运行自动生成零配置本地模式两者都没有 → 自动生成新的 Fernet 密钥并写入.vault_key若生成失败则 vault 被禁用。而 local_vault.py 展示了底层实现凭证以(user_id, source_key)为逻辑隔离维度存入 SQLite 表credentials加密算法为 FernetAES-128-CBC HMAC-SHA256。解密失败时只会记录 warning 并返回None不会崩溃——也就是说密钥错误时表现是静默取不到凭证排查时需要留意日志。提示Vault 的完整安全模型、DataConnector 工作流与手动 API 详见 凭证保险箱文档。4. 迁移步骤4.1 确认数据目录位置# 数据目录优先级--data-dir CLI参数 DATA_FORMULATOR_HOME 环境变量 ~/.data_formulator # 查看当前配置 grep DATA_FORMULATOR_HOME .env下文用$DF_HOME代指实际数据目录路径。源码佐证数据目录的解析实现在 workspace.py其中--data-dir通过 FlaskCLI_ARGS[data_dir]传入DATA_FORMULATOR_HOME环境变量则同时被 app.py 用于定位 session 存储目录$DF_HOME/sessions和整体数据根目录。4.2 在旧服务器上备份# 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 步中的.env是整个迁移的钥匙串FLASK_SECRET_KEY、DF_CODE_SIGNING_SECRET、CREDENTIAL_VAULT_KEY、DF_SOURCES__*、DF_PLUGIN_DIR、PLG_SUPERSET_URL等都可能在其中务必完整保留第 2 步中.vault_key与credentials.db必须成对搬运只搬数据库不搬密钥等于没有搬见 3.2 节第 4 步中users/下每个身份对应一个子目录users/identity/目录名经过sanitize_identity_dirname清洗见 workspace.py其中保存该用户的 parquet 数据、会话元数据和connectors.yaml用户连接定义第 6 步若已配置WORKSPACE_BACKENDazure_blobapp.py 相关逻辑工作区数据存于云端容器本地users/、workspaces/无需备份但连接字符串等配置AZURE_BLOB_CONNECTION_STRING等仍在.env中依然要带走。4.3 在新服务器上恢复# 1. 安装 Data Formulator新版本或同版本 pip install># docker-compose.yml services: ># 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要点命名卷df-data便于识别和迁移匿名卷则很难定位到具体内容导出时使用tar czf打包整个数据目录能完整保留.vault_key、credentials.db、connectors.yaml、users/、workspaces/以及 session 目录等所有内容。.env需要单独复制到新服务器因为它不在数据卷内。5. 迁移后验证迁移完成、服务启动后按以下清单逐项验证检查项验证方法预期结果用户登录访问页面检查是否仍处于登录状态无需重新登录Session 未失效SSO 认证退出后重新 SSO 登录能正常完成 SSO 流程已有图表打开旧图表点击刷新数据正常刷新不报签名错误数据库连接打开数据源面板查看已保存的连接显示已连接状态无需重新输入密码外部系统 Token打开 Superset 等数据源连接自动登录或正常授权管理员连接打开 Load Data 页面connectors.yaml或DF_SOURCES__*配置的数据源卡片正常显示用户连接切换到已有用户用户自己创建的数据源卡片正常显示外部 Loader打开 Add ConnectionDF_PLUGIN_DIR中的自定义 loader 正常出现在可选列表验证逻辑解读登录状态是否保持、图表能否刷新本质是在验证FLASK_SECRET_KEY是否原样迁移见第 3.1 节数据库连接与外部 Token 是否生效是在验证.vault_key/CREDENTIAL_VAULT_KEY与credentials.db是否成对还原见第 3.2 节。任何一项不符合预期优先回到第 4.2、4.3 节核对对应文件是否遗漏。6. 忘记备份密钥的补救措施FLASK_SECRET_KEY 丢失如果之前未显式设定FLASK_SECRET_KEY使用的是自动生成的临时密钥则无法恢复。影响和处理方式影响处理方式所有用户被踢出登录用户重新 SSO 登录即可Agent 代码签名失效用户重新执行 Agent 生成新代码自动获得新签名工作区数据不受影响parquet 文件不依赖此密钥建议在新服务器上立即设定一个固定的FLASK_SECRET_KEY防止下次再丢失# 生成一个安全的随机密钥 python -c import secrets; print(secrets.token_hex(32)) # 将输出写入 .env # FLASK_SECRET_KEY生成的密钥.vault_key 丢失Vault 加密密钥丢失后已存储的凭证无法恢复。处理方式删除旧的credentials.db已无法解密系统会自动生成新的.vault_key用户需要重新输入数据库密码并勾选记住凭证。原理说明如第 3.2 节源码所示凭证加密使用 Fernet 对称密钥LocalCredentialVault在解密失败时只记录 warning 并返回None不存在换钥匙重加密的机制。因此密钥丢失 数据不可逆丢失只能重建凭证库。7. 最佳实践生产环境务必显式设定FLASK_SECRET_KEY写入.env不要依赖自动生成。python -c import secrets; print(secrets.token_hex(32))定期备份数据目录$DF_HOME整个目录包含密钥、凭证、工作区数据备份它就够了。从 workspace.py 和 local_vault.py 的路径设计可以看出密钥、凭证库、用户连接配置与工作区数据都收敛在$DF_HOME之下因此备份整个数据目录 .env是最稳妥、最不易遗漏的方案。Docker 部署使用命名卷避免使用匿名卷方便识别和迁移。密钥管理在企业部署中考虑使用外部 Secrets Manager 注入FLASK_SECRET_KEY和CREDENTIAL_VAULT_KEY避免密钥散落在文件系统中。两者的环境变量注入路径在源码中均有实现app.secret_key直接读取环境变量app.pyVault 密钥优先读取CREDENTIAL_VAULT_KEYauth/vault/init.py。使用 Secrets Manager 后.env中可以不写明文密钥进一步降低泄露面。升级前备份版本升级前也执行完整备份流程以便回退。升级场景与迁移场景的备份要求完全一致——同样需要保留.env与整个$DF_HOME。8. 相关文档凭证保险箱Credential Vault — Vault 加密机制详解Fernet 算法、密钥解析优先级、DataConnector 工作流、手动 API、Docker 部署与密钥生成DEVELOPMENT.md — Server Migration Checklist — 英文版迁移清单.env.template — 完整配置项说明含FLASK_SECRET_KEY、PLG_SUPERSET_URL等注释与生成命令源码参考app.pyFlask 密钥与 session 初始化、code_signing.pyHMAC 代码签名、auth/vault/init.py 与 auth/vault/local_vault.py凭证保险箱、datalake/workspace.py数据目录解析【免费下载链接】data-formulator Data Formulator is an interactive AI-powered data analysis system makes it easy to connect, explore and visualize data.项目地址: https://gitcode.com/GitHub_Trending/da/data-formulator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考