将 Reflex 应用部署到 Databricks Apps:GitHub 接入、单端口配置与 Unity Catalog 权限完整指南
【免费下载链接】reflex🕸️ Web apps in pure Python 🐍项目地址: https://gitcode.com/GitHub_Trending/re/reflex
本指南以官方托管文档 docs/hosting/databricks.md 为核心,完整讲解如何把基于 Reflex(纯 Python Web 框架)构建的应用部署到 Databricks Apps 平台:从 Git 仓库接入、app.yaml应用配置、Enterprise 单端口模式改造,到 SQL Warehouse 与 Unity Catalog 权限授予和增量更新发布。读完本文,你将能独立完成一次可运行的 Databricks 托管部署,并理解$DATABRICKS_APP_PORT与use_single_port在底层如何协同工作。
为什么选择 Databricks Apps 承载 Reflex 应用
Databricks 是面向数据湖仓的统一分析与 AI 平台,其Apps服务允许用户把 Web 应用直接运行在 Databricks 工作区内部。对 Reflex 开发者而言,这意味着:
- 应用可以直接运行在靠近数据的地方,通过
DATABRICKS_WAREHOUSE_ID、DATABRICKS_CATALOG、DATABRICKS_SCHEMA等环境变量就近访问 SQL Warehouse 与 Unity Catalog 中的表; - 复用 Databricks 现有的身份体系与服务主体(Service Principal),无需额外管理服务器;
- 部署、更新、日志查看都在同一个工作区内完成,运维链路短。
需要说明的是,本文讨论的是将 Reflex 应用部署到 Databricks Apps;而 Databricks 作为数据源被 Reflex 应用调用(OAuth / Service Principal 连接、SQL 查询、仪表盘构建)属于另一类集成场景,可参考仓库中的 packages/integrations-docs 集成文档,两者可以组合使用,但本指南聚焦前者。
前提条件
开始前请确认已具备以下条件:
| 条件 | 说明 |
|---|---|
| Databricks 工作区 | 已启用 Unity Catalog(DATABRICKS_CATALOG/DATABRICKS_SCHEMA的授权均依赖 Unity Catalog 权限模型) |
| GitHub 仓库 | 存放 Reflex 应用的源码,Databricks 通过 Git 文件夹(Git folder)接入 |
| Reflex Enterprise 许可证 | 单端口部署依赖reflex-enterprise包,必须持有 Enterprise 授权(详见后文“启用单端口部署”) |
Step 1:连接你的 GitHub 仓库
Databricks 通过Git 文件夹将外部仓库挂载进工作区,这是后续构建应用时的代码来源:
- 登录进入 Databricks 工作区;
- 进入你的用户目录(User directory);
- 点击Create→Git folder;
- 粘贴存放 Reflex 应用的 GitHub 仓库 URL。
完成挂载后,仓库内容会出现在你的用户目录下,可以在后续部署时直接作为代码路径引用。
Step 2:配置应用设置
创建配置文件app.yaml
关键约束:app.yaml必须直接在 Databricks 内创建,而不是提交到 GitHub 仓库中。它属于部署侧的运行配置,与源码解耦。
在 Databricks 的 Notebook / 文件编辑界面中新建app.yaml,内容如下:
command: [ "reflex", "run", "--env", "prod", "--backend-port", "$DATABRICKS_APP_PORT" ] env: - name: "HOME" value: "/tmp/reflex" - name: "REFLEX_ACCESS_TOKEN" value: "your-token-here" - name: "DATABRICKS_WAREHOUSE_ID" value: "your-sql-warehouse-id" - name: "DATABRICKS_CATALOG" value: "your-catalog-name" - name: "DATABRICKS_SCHEMA" value: "your-schema-name" - name: "REFLEX_SHOW_BUILT_WITH_REFLEX" value: 0各字段的含义与注意事项:
command:Databricks Apps 启动容器时执行的命令。这里以生产模式(--env prod)启动 Reflex,并将后端端口绑定到 Databricks 平台注入的动态端口$DATABRICKS_APP_PORT。不要硬编码端口号,平台每次部署分配的端口可能不同。env.HOME:将应用主目录设置为/tmp/reflex,避免在容器内使用不可写的默认主目录导致初始化失败。env.REFLEX_ACCESS_TOKEN:用于 Reflex Cloud 认证的令牌,替换为实际生成的 token(见下文“获取所需令牌”)。env.DATABRICKS_*:连接 SQL Warehouse 与 Unity Catalog 所需的资源定位信息。env.REFLEX_SHOW_BUILT_WITH_REFLEX:控制是否显示 Reflex 品牌标识,Enterprise 专属,0关闭、1开启。
获取所需令牌与资源标识
1. Reflex Access Token
- 访问仓库中的 Reflex Cloud Tokens 文档(对应线上路径
/docs/hosting/tokens); - 进入Account Settings → Tokens;
- 创建新令牌并复制其值;
- 替换
app.yaml中的your-token-here。
关于令牌的使用,docs/hosting/tokens.md 给出了一些值得注意的实践:token 可以在支持--token的命令中使用,或通过REFLEX_ACCESS_TOKEN环境变量传递;令牌由创建者持有,建议按用途单独创建并设置过期时间,长期自动化建议改用组织级 Service Account;切勿将令牌提交到代码库或日志中。
2. Databricks 资源标识
DATABRICKS_WAREHOUSE_ID:你的 SQL Warehouse 标识(在 Databricks 的 SQL Warehouses 页面查看连接详情可获得);DATABRICKS_CATALOG:目标目录(catalog)名称,如main;DATABRICKS_SCHEMA:目标 schema 名称,如default。
Step 3:启用单端口部署
Databricks Apps 只暴露一个端口给应用,而 Reflex 默认前后端分离运行(前端 Vite/静态服务与后端 ASGI 服务各占一个端口,见 reflex/reflex.py 中frontend_port/backend_port的处理逻辑)。因此需要将应用改造为单端口模式,让后端通过代理挂载到前端端口上。
更新rxconfig.py
import reflex as rx import reflex_enterprise as rxe rxe.Config(app_name="app", use_single_port=True)use_single_port=True会通过把后端代理到前端端口的方式,让应用只监听一个端口。该功能对应仓库 docs/enterprise/single-port-proxy.md 描述的机制,且被列为 Reflex Enterprise 的核心部署特性(见 docs/enterprise/overview.md 中 featureuse_single_port的说明:"Enable single-port deployment by proxying backend to frontend")。
更新应用入口文件
将定义rx.App的地方改为使用 Enterprise 版:
import reflex_enterprise as rxe app = rxe.App( # your app configuration )补充依赖
同时,在requirements.txt中追加:
reflex-enterprise asgiproxyasgiproxy负责把 ASGI 后端请求代理到单端口,是单端口模式下后端可被外部访问的关键依赖。安装完成后,reflex-enterprise与reflex需同时存在,才能启用上述企业特性。
底层视角:为什么$DATABRICKS_APP_PORT+ 单端口配置缺一不可?从源码看,Reflex 在_run中校验生产模式下的端口一致性——当运行环境为PROD且同时指定了--frontend-port与--backend-port时,两者若不相同会直接报错退出(reflex/reflex.py);而_run_prod则会主动将frontend_port与backend_port设置为同一个端口,并在该端口上同时提供前端静态资源与后端 API(reflex/reflex.py)。因此,Databricks 场景下把--backend-port指向平台注入的$DATABRICKS_APP_PORT,正是让单端口模式与平台端口分配机制正确对接的关键。
Step 4:创建 Databricks App
- 进入Compute→Apps;
- 点击Create App;
- 选择Custom App;
- 为应用配置 SQL Warehouse(应用运行期间用于查询 Unity Catalog 数据)。
Step 5:设置权限
如果使用
samplesCatalog,可跳过本节——该目录预置了足够的公共访问权限。使用自有 Catalog / Schema 时必须完成以下授权,否则应用在运行时会出现权限错误。
Catalog 权限
- 进入Catalog,选择你的目标 catalog;
- 打开Permissions;
- 添加应用对应的service principal用户;
- 授予以下权限:
- USE CATALOG:允许访问该目录;
- USE SCHEMA:允许访问其中的 schema。
Schema 权限
- 进入具体的 schema;
- 打开Permissions;
- 授予以下权限:
- USE SCHEMA
- EXECUTE:允许执行 SQL / 函数;
- SELECT:允许读取表数据;
- READ VOLUME(如需要):允许读取卷(Volume)中的文件。
权限粒度说明:catalog 层决定“能否进入”,schema 层决定“能做什么操作”,两者叠加构成了应用对 Unity Catalog 资源的最终访问边界。若应用还需要写入数据或管理表,应在此基础上按最小权限原则追加相应授权。
Step 6:部署应用
- 发起部署:在 Apps 界面点击Deploy,当提示提供代码路径时,选择前面创建的 Git 文件夹路径或对应的仓库文件夹;
- 监控部署:部署会自动开始,此时应留意部署日志,排查配置错误(如 token 无效、端口配置缺失、依赖安装失败等)。
更新你的应用
每次在 GitHub 上提交新代码后,按以下流程同步到 Databricks:
- 拉取最新代码:在部署界面点击Deployment Source,选择
main分支,点击Pull从 GitHub 拉取最新更改; - 重新部署:再次点击Deploy应用更新。
注意:更新流程需要手动触发,不会自动监听 GitHub 的推送事件;app.yaml中的环境变量变更同样需要通过重新部署生效。
配置参考:环境变量一览
下表汇总了app.yaml中全部环境变量的作用与示例值,供排错与扩展时查阅:
| 环境变量 | 说明 | 示例 |
|---|---|---|
HOME | 应用主目录 | /tmp/reflex |
REFLEX_ACCESS_TOKEN | 用于 Reflex Cloud 的认证令牌 | rx_token_... |
DATABRICKS_WAREHOUSE_ID | SQL Warehouse 标识 | 自动分配 |
DATABRICKS_CATALOG | 目标 catalog 名称 | main |
DATABRICKS_SCHEMA | 目标 schema 名称 | default |
REFLEX_SHOW_BUILT_WITH_REFLEX | 是否显示 Reflex 品牌标识(仅 Enterprise) | 0或1 |
Troubleshooting:常见问题排查
- 权限错误(Permission Errors):逐一核对 catalog 层(
USE CATALOG、USE SCHEMA)与 schema 层(USE SCHEMA、EXECUTE、SELECT、READ VOLUME)的授权是否齐全,且授予对象是否为应用对应的 service principal;使用samplescatalog 可快速验证是否为权限问题。 - 端口问题(Port Issues):确认
command中使用了$DATABRICKS_APP_PORT,且应用已切换为单端口配置(use_single_port=True+rxe.App)。回顾上文源码分析,生产模式下前后端端口不一致会导致启动失败。 - 令牌问题(Token Issues):检查
REFLEX_ACCESS_TOKEN是否有效、是否已过期、权限范围是否覆盖所需资源;可参考 docs/hosting/tokens.md 重新生成并妥善保存。 - 部署失败(Deployment Failures):查看部署日志中的具体报错信息;常见诱因包括
requirements.txt缺少reflex-enterprise/asgiproxy、依赖版本不兼容、HOME目录不可写等。
关键注意事项
- 单端口部署要求 Reflex Enterprise 许可证,
use_single_port与rxe.App均为reflex-enterprise包提供的特性; app.yaml必须直接在 Databricks 中创建,而不是从 GitHub 推送——它属于部署平台侧的运行配置;- 应用更新需要从部署界面手动 Pull 最新分支再重新部署,GitHub 上的提交不会自动触发发布;
- 令牌属于敏感信息,务必通过平台的密钥管理能力保管,不要提交到仓库或写入日志。
【免费下载链接】reflex🕸️ Web apps in pure Python 🐍项目地址: https://gitcode.com/GitHub_Trending/re/reflex
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考