windmill-labs/windmill
GitHub: windmill-labs/windmill
Windmill 是一个开源开发者平台,能够将多语言脚本自动转化为 Webhook、工作流和内部应用 UI,提供高性能的自托管工作流编排能力。
Stars: 16784 | Forks: 994
面向内部代码的开源开发者平台:API、后台作业、工作流和 UI。这是一个可自托管的 Retool、Pipedream、Superblocks 替代方案,也是一个简化的 Temporal,带有自动生成的 UI 和自定义 UI,可触发工作流和脚本作为内部应用。
脚本会自动转换为可共享的 UI,并且可以组合成流程,或者在使用低代码构建的更丰富的应用中使用。支持的语言:Python、TypeScript、Go、Bash、SQL、GraphQL、PowerShell、Rust 等。
试用 - 官网 - 文档 - Discord - Hub - 贡献者指南
# Windmill - 面向 API、后台作业、工作流和 UI 的开发者平台
Windmill 是完全开源的 (AGPLv3),Windmill Labs 提供专属实例、商业支持和许可证。

https://github.com/user-attachments/assets/d80de1d9-64de-4d89-aacd-6df23fa81fc4
- [Windmill - 面向 API、后台作业、工作流和 UI 的开发者平台](#windmill---developer-platform-for-apis-background-jobs-workflows-and-uis)
- [核心概念](#main-concepts)
- [展示一些实际的脚本代码](#show-me-some-actual-script-code)
- [本地开发](#local-development)
- [技术栈](#stack)
- [最快的可自托管工作流引擎](#fastest-self-hostable-workflow-engine)
- [安全性](#security)
- [性能](#performance)
- [架构](#architecture)
- [如何自托管](#how-to-self-host)
- [Docker compose](#docker-compose)
- [Kubernetes (Helm charts)](#kubernetes-helm-charts)
- [云服务提供商](#cloud-providers)
- [OAuth, SSO \& SMTP](#oauth-sso--smtp)
- [许可证](#license)
- [集成](#integrations)
- [环境变量](#environment-variables)
- [运行本地开发环境](#run-a-local-dev-setup)
- [仅前端](#frontend-only)
- [后端 + 前端](#backend--frontend)
- [贡献者](#contributors)
- [版权](#copyright)
## 核心概念
1. 用 Python、TypeScript、Go 或 Bash 定义一个最小化且通用的脚本来解决特定任务。代码可以在提供的 Web IDE 中定义,也可以与您自己的 GitHub 仓库同步(例如通过 VS Code 扩展):[提供的 Web IDE](https://www.windmill.dev/docs/code_editor) 或 [与您自己的 GitHub 仓库同步](https://www.windmill.dev/docs/advanced/cli/sync)(例如通过 [VS Code](https://www.windmill.dev/docs/cli_local_dev/vscode-extension) 扩展):

2. 您的脚本参数会被自动解析并[生成前端](https://www.windmill.dev/docs/core_concepts/auto_generated_uis)。


3. 将其变成[流程](https://www.windmill.dev/docs/flows/flow_editor)!您可以链式调用您的脚本,或者使用社区在 [WindmillHub](https://hub.windmill.dev) 上分享的脚本。

4. 在您的脚本和流程之上构建[复杂的 UI](https://www.windmill.dev/docs/apps/app_editor)。

脚本和流程可以通过[定时任务](https://www.windmill.dev/docs/core_concepts/scheduling)、[webhooks](https://www.windmill.dev/docs/core_concepts/webhooks)、[HTTP 路由](https://www.windmill.dev/docs/core_concepts/http_routing)、[Kafka](https://www.windmill.dev/docs/core_concepts/kafka_triggers)、[WebSockets](https://www.windmill.dev/docs/core_concepts/websocket_triggers)、[电子邮件](https://www.windmill.dev/docs/core_concepts/email_triggers)等方式触发。
在 Windmill 之上构建您的整个基础设施!
## 展示一些实际的脚本代码
```
//import any dependency from npm
import * as wmill from "windmill-client";
import * as cowsay from "cowsay@1.5.0";
// fill the type, or use the +Resource type to get a type-safe reference to a resource
type Postgresql = {
host: string;
port: number;
user: string;
dbname: string;
sslmode: string;
password: string;
};
export async function main(
a: number,
b: "my" | "enum",
c: Postgresql,
d = "inferred type string from default arg",
e = { nested: "object" }
//f: wmill.Base64
) {
const email = process.env["WM_EMAIL"];
// variables are permissioned and by path
let variable = await wmill.getVariable("f/company-folder/my_secret");
const lastTimeRun = await wmill.getState();
// logs are printed and always inspectable
console.log(cowsay.say({ text: "hello " + email + " " + lastTimeRun }));
await wmill.setState(Date.now());
// return is serialized as JSON
return { foo: d, variable };
}
```
## 本地开发
Windmill 支持多种本地开发并与您的实例同步的方式:
| 工具 | 描述 |
|------|-------------|
| **[CLI](https://www.windmill.dev/docs/advanced/cli)** | 从本地文件或 GitHub 同步脚本,从命令行运行脚本/流程 |
| **[VS Code 扩展](https://www.windmill.dev/docs/cli_local_dev/vscode-extension)** | 直接在 VS Code / Cursor 中编辑和测试脚本与流程,提供完整的 IDE 支持 |
| **[Git Sync](https://www.windmill.dev/docs/advanced/git_sync)** | Windmill 与您的 Git 仓库之间的双向同步 |
| **[Claude Code](https://www.windmill.dev/docs/core_concepts/ai_generation)** | 使用 Claude 进行 AI 辅助开发脚本、流程和应用 |
https://github.com/user-attachments/assets/c541c326-e9ae-4602-a09a-1989aaded1e9
您可以通过为 `wmill` 客户端库传递正确的环境变量,以便从您的实例中获取资源和变量,从而在本地运行脚本。请参阅[本地开发文档](https://www.windmill.dev/docs/advanced/local_development)。
## 技术栈
- **数据库**:Postgres(兼容 Aurora、Cloud SQL、Neon、Azure PostgreSQL)
- **后端**:Rust - 无状态 API 服务器和从 Postgres 队列中拉取作业的 worker
- **前端**:Svelte 5
- **沙盒**:[nsjail](https://github.com/google/nsjail) 和 PID namespace 隔离
- **运行时**:
- TypeScript/JavaScript:Bun(默认)和 Deno
- Python:python3 配合 uv 进行依赖管理
- Go、Bash、PowerShell、PHP、Rust、C#、Java、Ansible
## 最快的可自托管工作流引擎
我们已经将 Windmill 与其他可自托管的工作流引擎(Airflow、
Prefect 和 Temporal)进行了比较,Windmill 在两项基准测试中都是性能最佳的解决方案:
一项由 40 个轻量级任务组成的流程,以及一项由 10 个长时间运行的任务组成的流程。
所有的方法论和结果都在我们的
[基准测试](https://www.windmill.dev/docs/misc/benchmarks/competitors#airflow-setup)
页面上。

## 安全性
- **沙盒**:使用 [nsjail](https://github.com/google/nsjail) 进行文件系统/资源隔离,以及 PID namespace 隔离(默认开启)以防止作业访问 worker 进程内存
- **密钥**:每个 workspace 拥有专属的加密密钥,用于存储在 Windmill K/V 存储中的凭证。我们也建议对 Postgres 数据库进行加密。
详情请参阅[安全文档](https://www.windmill.dev/docs/advanced/security_isolation)。
## 性能
一旦作业开始,与在节点上使用其相应的运行环境(Deno/Go/Python/Bash)运行相同脚本相比,没有任何额外开销。从作业被拉出队列、启动、然后将结果发送回数据库所增加的延迟约为 ~50ms。一个典型的轻量级 deno 作业总共大约需要 100ms。
## 架构
## 如何自托管
有关详细的设置选项,请参阅[自托管文档](https://www.windmill.dev/docs/advanced/self_host)。
### Docker compose
使用 3 个文件部署 Windmill([docker-compose.yml](./docker-compose.yml), [Caddyfile](./Caddyfile), [.env](./.env)):
```
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml -o docker-compose.yml
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/Caddyfile -o Caddyfile
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/.env -o .env
docker compose up -d
```
访问 http://localhost - 默认凭证:`admin@windmill.dev` / `changeme`
**使用外部数据库**:在 `.env` 中设置 `DATABASE_URL` 指向您的托管 Postgres(AWS RDS、GCP Cloud SQL、Azure、Neon 等),并将 db replicas 设置为 0。
### Kubernetes (Helm charts)
```
helm repo add windmill https://windmill-labs.github.io/windmill-helm-charts/
helm install windmill-chart windmill/windmill --namespace=windmill --create-namespace
```
有关配置选项,请参阅 [windmill-helm-charts](https://github.com/windmill-labs/windmill-helm-charts)。
### 云服务提供商
Windmill 可以在 AWS (EKS/ECS)、GCP、Azure、Ubicloud、Fly.io、Render.com、Hetzner、Digital Ocean 等平台上运行。经验法则:每个 vCPU 对应 1 个 worker 以及 1-2 GB RAM。
### OAuth, SSO 和 SMTP
直接从 superadmin UI 配置 OAuth 和 SSO(Google Workspace、Microsoft/Azure、Okta)。[查看文档](https://www.windmill.dev/docs/misc/setup_oauth)。
### 许可证
社区版可免费在内部使用。如需商业再分发或托管服务,请联系
。详情请参阅 [LICENSE](./LICENSE) 和 [定价](https://www.windmill.dev/pricing)。
在 ghcr.io/windmill-labs/windmill 下托管的 Docker 镜像以及 GitHub 二进制文件发布中提供的 Windmill “社区版”包含了 AGPLv3 和 Apache 2 源代码下的文件,但也包含非开源的专有和非公开代码及功能,并受以下条款约束:Windmill Labs, Inc. 授予免费使用“社区版”所有功能的权利,除了软件中设定的限制和配额外,授予按原样分发社区版的权利,但不得出售、转售、将 Windmill 作为托管服务提供、修改或以任何形式包装,除非得到明确同意。
在不带有 "enterprise" feature flag 的情况下,从本仓库源代码编译的二进制文件是开源的,受 [LICENSE-AGPLv3](https://github.com/windmill-labs/windmill/blob/main/LICENSE-AGPL) 许可条款和条件约束。
要[将任何 Windmill 部分直接作为产品功能重新暴露给您的用户](https://www.windmill.dev/docs/misc/white_labelling)(嵌入的公开 Windmill “apps”除外),或者在 "Windmill Community Edition" 之上构建您进行商业销售或嵌入到可分发产品或二进制文件中的功能,您必须获得商业许可证。如果您有任何问题,请联系 。要在不带有 "enterprise" feature flag 的情况下从本仓库源代码编译的二进制文件执行相同操作,您必须遵守 AGPLv3 许可条款和条件,或者从 Windmill Labs, Inc. 获取商业许可证。
要在您的组织内部按原样使用 Windmill “社区版”,或按原样使用其 API,您不需要商业许可证。
### 集成
在 Windmill 中,集成被称为[资源和资源类型](https://www.windmill.dev/docs/core_concepts/resources_and_types)。每个资源都有一个资源类型,用于定义该资源需要实现的 schema。
在自托管实例上,您可能希望从 [WindmillHub](https://hub.windmill.dev) 导入所有已批准的资源类型。设置脚本将提示您每天自动进行同步。
## 环境变量
| 环境变量名称 | 默认值 | 描述 | Api Server/Worker/All |
| ----------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| DATABASE_URL | | Postgres 数据库 URL。 | All |
| WORKER_GROUP | default | worker 所属并从中提取配置的 worker 组 | Worker |
| MODE | standalone | 二进制文件的模式。可能的值:standalone, worker, server, agent | All |
| METRICS_ADDR | None | (仅限 ee) 暴露 Prometheus 指标的 socket 地址,路径为 /metrics。设置为 "true" 则在端口 8001 暴露 | All |
| JSON_FMT | false | 以 json 格式而不是 logfmt 输出日志 | All |
| BASE_URL | http://localhost:8000 | 公开暴露以访问您的实例的 base URL。如果有的话会被实例设置覆盖。 | Server |
| ZOMBIE_JOB_TIMEOUT | 30 | 如果 worker 没有发送关于处理作业的 ping,作业被视为 zombie 的超时时间(服务器每 30 秒检查一次 zombie 作业) | Server |
| RESTART_ZOMBIE_JOBS | true | 如果为 true,则 zombie 作业会重新启动(原地使用相同的 uuid 和一些日志),如果为 false,则 zombie 作业失败 | Server |
| NATIVE_MODE | false | 启用原生模式:设置 NUM_WORKERS=8,拒绝非原生作业(nativets, postgresql, mysql 等。) | Worker |
| SLEEP_QUEUE | 50 | 在数据库中检查新作业之间休眠的毫秒数。它乘以 NUM_WORKERS,这样平均而言,对于一个 worker 实例,每 SLEEP_QUEUE 毫秒就有一次拉取。 | Worker |
| KEEP_JOB_DIR | false | 在作业完成后保留作业目录。对调试很有用。 | Worker |
| LICENSE_KEY (仅限 EE) | None | Windmill 企业版启动时检查的许可证密钥 | Worker |
| SLACK_SIGNING_SECRET | | 您的 Slack 应用的签名密钥。请参阅 [Slack 文档](https://api.slack.com/authentication/verifying-requests-from-slack) | Server |
| COOKIE_DOMAIN | None | cookie 的域。如果未设置,cookie 将由浏览器基于完整的源来设置 | Server |
| DENO_PATH | /usr/bin/deno | deno 二进制文件的路径。 | Worker |
| PYTHON_PATH | | 如果不想由 uv 管理,则为 python 二进制文件的路径。 | Worker |
| GO_PATH | /usr/bin/go | go 二进制文件的路径。 | Worker |
| GOPRIVATE | | 用于私有 go 模块的 GOPRIVATE 环境变量 | Worker |
| GOPROXY | | 要使用的 GOPROXY 环境变量 | Worker |
| NETRC | | 用于私有 go 注册表的 netrc 内容 | Worker |
| PY_CONCURRENT_DOWNLOADS | 20 | 设置 windmill 在任何给定时间执行的最大进行中并发 python 下载量。 | Worker |
| PATH | None | path 环境变量,通常是继承的 | Worker |
| HOME | None | Go 和 Bash 使用的 home 目录,通常是继承的 | Worker |
| DATABASE_CONNECTIONS | 50 (Server)/3 (Worker) | 数据库连接池中的最大连接数 | All |
| SUPERADMIN_SECRET | None | 允许调用者作为虚拟 superadmin superadmin@windmill.dev 行事的 token | Server |
| TIMEOUT_WAIT_RESULT | 20 | 在 'run_wait_result' endpoint 超时前等待的秒数 | Worker |
| QUEUE_LIMIT_WAIT_RESULT | None | 在 'run_wait_result' endpoint 中拒绝请求前,队列中的最大作业数。优先于查询参数。如果未指定,则没有限制。 | Worker |
| DENO_AUTH_TOKENS | None | 传递给 worker 的自定义 DENO_AUTH_TOKENS,允许使用私有模块 | Worker |
| DISABLE_RESPONSE_LOGS | false | 禁用响应日志 | Server |
| CREATE_WORKSPACE_REQUIRE_SUPERADMIN | true | 如果为 true,则只有 superadmin 可以创建新的 workspace | Server |
| MIN_FREE_DISK_SPACE_MB | 15000 | worker 上的最小可用空间量。如果 worker 的可用空间不足,则发送严重警报。 | Worker |
| RUN_UPDATE_CA_CERTIFICATE_AT_START | false | 如果为 true,则在其他初始化之前,在启动时运行 CA 证书更新命令 | All |
| RUN_UPDATE_CA_CERTIFICATE_PATH | /usr/sbin/update-ca-certificates | 当 RUN_UPDATE_CA_CERTIFICATE_AT_START 为 true 时运行的 CA 证书更新命令/脚本的路径 | All |
## 运行本地开发环境
我们建议使用 [Nix](./frontend/README_DEV.md#nix)。有关所有选项,请参阅 [./frontend/README_DEV.md](./frontend/README_DEV.md)。
### 仅前端
使用 的后端结合本地前端(热重载):
```
cd frontend
npm install
npm run generate-backend-client # or generate-backend-client-mac on Mac
npm run dev
```
Windmill 可通过 `http://localhost/` 访问
### 后端 + 前端
有关所有运行选项,请参阅 [./frontend/README_DEV.md](./frontend/README_DEV.md) 文件。
1. 例如,使用 `start-dev-db.sh` 脚本启动本地 Postgres 数据库,该脚本将使数据库可通过 `postgres://postgres:changeme@localhost:5432/windmill` 访问
然后使用以下命令运行迁移:
cargo install sqlx-cli
env DATABASE_URL= sqlx migrate run
这也可以避免 sqlx 的 `query!` 宏引起的编译时问题。
2. (可选,仅限 linux)安装 [nsjail](https://github.com/google/nsjail) 并使其在您的 PATH 中可用
3. 安装 bun、deno 和 python3(+ 任何您想使用的语言),并确保二进制文件位于 `/usr/bin/bun`、`/usr/bin/deno` 和
`/usr/local/bin/python3`,或者设置相应的环境变量。
4. (可选)安装 [lld linker](https://lld.llvm.org/)
5. 进入 `frontend/`:
1. `npm install`,`npm run generate-backend-client` 然后 `REMOTE=http://localhost:8000 npm run dev`
2. 您可能需要为 node 运行时设置一些额外的堆空间
`export NODE_OPTIONS="--max-old-space-size=4096"`
3. 使用 `mkdir frontend/build` 创建一个空的 `frontend/build` 文件夹
6. 进入 `backend/`:
1. `env DATABASE_URL= RUST_LOG=info cargo run`
2. 您可以指定任何您想启用的 feature flag,例如 `cargo run --features python` 来启用 python 执行器。
7. Windmill 应该可以通过 `http://localhost:3000` 访问
## 贡献者
## 版权
© 2023-2026 Windmill Labs, Inc.标签:Webhook, 低代码, 内部工具, 力导向图, 可视化界面, 子域名突变, 工作流引擎, 开发者平台, 日志审计, 测试用例, 网络调试, 自动化, 请求拦截, 逆向工具, 通知系统