本文首发于 xlog,可跳转获得更佳阅读体验

Windmill 是一个开源可自部署的工作流引擎(甚至低代码平台),可访问 https://www.windmill.dev/docs/compared_to 查看其官方与 Zapier 等服务的对比。

本文将展示如何将其部署到 Fly.io

概览

本文介绍了两种方式来进行部署 Windmill,我分别称之为 minimal 和 full 模式。

在 minimal 模式下,所有 Windmill 组件运行在单一 app 中,这是最简单且经济的方案,但是不够灵活(例如,因为 Server 和 Worker 运行在同一个容器中,难以水平扩展);
在 full 模式下,Windmill 组件被拆分至两个不同的 app 中,其中一个运行 Server,另一个运行 Worker,相比于 minimal 方案较为复杂,但是可以让你更灵活的控制分布式的 Worker。

请克隆仓库 windmill-on-fly,然后继续下面的步骤。

LSP 组件

minimal 与 full 均需预先安装 LSP

LSP 提供了 Windmill 前端页面上的代码补全功能,需要独立部署。

Launch & Deploy

如果想要修改区域,请修改 fly.toml 文件中的 primary_region 字段(默认为 sea)。如果修改区域,建议将所有 app 的区域保持一致以获得最佳体验。

进入 lsp 目录下,执行 fly launch 来启动项目;启动时,针对 Would you like to copy its configuration to the new app? (y/N) 问询选择 Y,并稍后为该 app 起个名字。

后续本文中如果出现 my-windmill-lsp 请替换成你在这里设置的 app 名称。

在接下来的问询中,不要创建 Postgresql 和 Redis(针对相关问询均选择 N)。

最后询问 Would you like to deploy now? (y/N) 时选择 Y 来进行部署。

分配 IP

部署完成后,执行 fly ips allocate-v6 --private 来为服务分配一个 Private IP(你也可以同时删除所有的 Public IP)。

Scale

LSP 对于性能的要求比较高。基于我实际感受,想要正常使用建议至少为其分配 4GB 内存。可执行 fly scale vm performance-2x 进行 Scale。

考虑到价格因素,可开启 fly.toml 中的 auto_start_machines=trueauto_stop_machines=true 来节省成本

Minimal 模式部署

如果你选择 Full 模式,请跳过当前步骤

下面所有的操作均在 minimal 目录下进行。

Launch

执行 fly launch 来启动项目;启动时,针对 Would you like to copy its configuration to the new app? (y/N) 问询选择 Y,并稍后为该 app 起个名字。

后续本文中如果出现 my-windmill 请替换成你在这里设置的 app 名称

在接下来的问询中,不要创建 Postgresql 和 Redis(针对相关问询均选择 N)。

最后询问 Would you like to deploy now? (y/N) 时选择 N 来跳过 Deploy。

配置数据库

请跟随 Fly Postgres 教程 先创建好一个数据库集群。

请将下面命令中的 my-pg 修改为你的数据库集群的名称

执行 fly pg attach my-pg --superuser 来创建数据库与用户。

配置 LSP

编辑 Caddyfile,将其中的 xxx-windmill-lsp 修改成你自己的 windmill-lsp 的服务名。

(可选)绑定自定义域名

如果你没有或不想绑定自定义域名,请跳过此步骤。

执行 fly certs add YOUR_DOMAIN 配置自定义域名(将 YOUR_DOMAIN 替换为你的域名),并按照要求配置相应的 CNAME 记录。

配置环境变量

打开 fly.toml 文件,将 env.BASE_URL 修改为你的外部访问域名 —— 如果你没有使用自定义域名,那么这里输入 https://my-windmill.fly.dev,否则输入 https://YOUR_DOMAIN

如果你想修改 worker 的数量,可修改 env.NUM_WORKERS 的变量值。

Deploy

输入 fly deploy 进行部署(部署过程中会自动构建所需镜像、创建需要的 volume)。等待部署成功后访问你的实例,测试利用账号 [email protected] 密码 changeme 登录。

Full 模式部署

如果你选择 Minimal 模式,请跳过当前步骤

full 目录下包括两个目录 - server 与 worker,分别存储了 Server 与 Worker 组件的配置。

Server - Launch

进入 full/server 目录下,执行 fly launch 来启动项目;启动时,针对 Would you like to copy its configuration to the new app? (y/N) 问询选择 Y,并稍后为该 app 起个名字。

后续本文中如果出现 my-windmill-server 请替换成你在这里设置的 app 名称

在接下来的问询中,不要创建 Postgresql 和 Redis(针对相关问询均选择 N)。

最后询问 Would you like to deploy now? (y/N) 时选择 N 来跳过 Deploy。

Server - 配置数据库

请跟随 Fly Postgres 教程 先创建好一个数据库集群。

请将下面命令中的 my-pg 修改为你的数据库集群的名称;下面命令中的 database-name 和 database-user 均使用 windmill,你也可以自行修改成你需要的名字。

进入 full/server 目录下,执行 fly pg attach my-pg --superuser --database-name windmill --database-user windmill 来创建数据库与用户。

记录上述命令执行时打印出来的 DATABASE_URL 备用

Server - 配置 LSP

进入 full/server 目录下,编辑 Caddyfile,将其中的 xxx-windmill-lsp 修改成你自己的 windmill-lsp 的服务名。

(可选)Server - 绑定自定义域名

如果你没有或不想绑定自定义域名,请跳过此步骤。

进入 full/server 目录下,执行 fly certs add YOUR_DOMAIN 配置自定义域名(将 YOUR_DOMAIN 替换为你的域名),并按照要求配置相应的 CNAME 记录。

Server - 配置环境变量

进入 full/server 目录下,打开 fly.toml 文件,将 env.BASE_URL 修改为你的外部访问域名 —— 如果你没有使用自定义域名,那么这里输入 https://my-windmill-server.fly.dev,否则输入 https://YOUR_DOMAIN

Server - Deploy

进入 full/server 目录下,输入 fly deploy 进行部署(部署过程中会自动构建所需镜像、创建需要的 volume)。

新版无 volume 的 fly app 会默认部署两个实例,Server 使用多实例的意义通常不大,可执行 fly scale count 1 将多余的实例删除。

等待部署成功后访问你的实例,测试利用账号 [email protected] 密码 changeme 登录。

Worker - Launch

进入 full/worker 目录下,执行 fly launch 来启动项目;启动时,针对 Would you like to copy its configuration to the new app? (y/N) 问询选择 Y,并稍后为该 app 起个名字。

后续本文中如果出现 my-windmill-worker 请替换成你在这里设置的 app 名称

在接下来的问询中,不要创建 Postgresql 和 Redis(针对相关问询均选择 N)。

最后询问 Would you like to deploy now? (y/N) 时选择 N 来跳过 Deploy。

Worker - 配置数据库

进入 full/worker 目录下,执行 fly secrets set 'DATABASE_URL=xxx' --stage 来配置连接数据库的凭据。(将 xxx 替换成上面步骤中打印出来的 DATABASE_URL 的内容)

Worker - 配置环境变量

进入 full/worker 目录下,打开 fly.toml 文件,将 env.BASE_URL 修改为你的 windmill-server 的外部访问域名 —— 如果你没有使用自定义域名,那么这里输入 https://my-windmill-server.fly.dev,否则输入 https://YOUR_DOMAIN

如果你想修改 worker 的数量,可修改 env.NUM_WORKERS 的变量值。

Worker - Deploy

进入 full/worker 目录下,输入 fly deploy 进行部署。

访问你实例的 /workers 路由(例如 https://my-windmill-server.fly.dev/workers)查看是否有你的 Worker 展示。

常见问题

升级(或指定版本号)

当前所有版本号均使用 latest,这在生产上可能不适用(因为每次重新部署都会升级到最新版本)。

版本号存在于如下的文件中

  • lsp/fly.toml
  • minimal/Dockerfile
  • full/server/Dockerfile
  • full/worker/fly.toml

你可将这些文件中的 "ghcr.io/windmill-labs/windmill:latest" 中的 latest 换成你希望的版本号,例如 1.133

唯一需要着重注意的点:请始终保持所有版本号一致,否则可能出现未知问题。

升级:修改版本号后在各自相关目录下重新执行 fly deploy 即可。