Dagu:把排程、重試與人為審核放回 YAML,而非塞進程式碼
Self-hostable workflow orchestrator for teams whose main work isn't orchestration. Declarative YAML over your scripts, SSH commands, containers, etc; keep workflows separate from business logic. One binary, no database, runs on limited H/W resources. Alternative to Airflow / Cron / Job Scheduler.
秒懂
- 它是什麼?
- Dagu 是一個以單一二進位檔運作的本地優先工作流程引擎,用宣告式 YAML 描述 DAG,適合主要工作不是編排、卻需要排程與重試的團隊。它刻意避開 Airflow 與 Temporal 的框架綁定,代價是狀態儲存在本機檔案,擴充模型也較為陽春。
- 適合誰用?
- 若你的團隊以 shell 指令、既有腳本與容器為主,且不想為了排程而維護一套 Python 平台或 SDK,Dagu 的單一二進位檔與檔案式狀態極具吸引力。它適合內部自動化、ETL 與邊緣工作負載,但若你需要跨團隊的複雜狀態管理、精細的並行策略或長時間執行的可靠保證,應先驗證其佇列與並行控制是否足夠。
- 可以商用嗎?
- 可以,但有條件。GPL-3.0 是 copyleft 授權:如果你散布包含它的軟體,就必須以同一授權公開該軟體的原始碼。只在內部執行、不對外散布,則不會觸發這項義務。
- 還在維護嗎?
- 有在維護。儲存庫在最近一天內有新的提交。
- 用什麼語言寫的?
- 主要是 Go(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
它解決的是「不想為了排程而經營第二套系統」的問題
Dagu 的 README 開宗明義:編排不是你的主要工作。你已經有能跑的腳本、容器或 SSH 指令,想要的是排程、依賴關係、重試與日誌,而不是再引進一個需要 PostgreSQL、Redis 與 Python 環境的平台。Airflow 會要求你把工作改寫成 @dag 與 @task 的框架程式碼,Temporal 則讓業務邏輯遷入其 SDK。Dagu 的立場是讓工作流程結構成為設定檔,而不是程式碼。你將順序、依賴、重試、排程與人為任務寫進一個 YAML 檔,放在腳本旁邊,引擎則是一個單一程序。這種設計對資料工程師、DevOps 或任何維護大量 cron job 的團隊來說,直接回應了「我只是想排程,卻得先學一套平台」的痛點。
單一二進位檔與檔案式狀態:取捨背後的務實邏輯
Dagu 的狀態儲存在本機檔案,不需要外部資料庫或訊息代理。README 的架構圖顯示,傳統編排器需要 Web Server、Scheduler、Worker、PostgreSQL、Redis 與 Python Runtime 等六種以上服務,而 Dagu 只需執行 dagu start-all 一個程序。這代表它可以在沒有網路連線的環境、樹莓派等級的硬體或暫時性的容器中運作。檔案式狀態的優點是部署簡單,但缺點也明顯:沒有內建的分散式鎖或交易機制,若多個 worker 同時寫入同一工作流程的狀態,可能產生競爭條件。README 提到可以擴充到多台 worker,但沒有詳細說明檔案同步或衝突處理方式,這在需要高可用或跨機器共享狀態的場景會是隱憂。對於單一節點或少量 worker 的內部自動化,這個取捨合理;但若你的工作流程需要嚴格的 exactly-once 語意,就必須謹慎評估。
實際機制:YAML 描述 DAG,執行器涵蓋 shell、Docker、Kubernetes 與 SSH
Dagu 的核心是宣告式 YAML 格式。你定義一個有向無環圖,每個步驟可以執行 shell 指令、Docker 容器、Kubernetes Job,或透過 SSH 在遠端主機執行指令。README 強調這些執行不需要修改你原有的腳本或容器,因為 Dagu 只是呼叫它們,而不是嵌入它們。例如,一個影片轉檔工作流程可以定義為依序執行 ffmpeg 指令的步驟,每個步驟有各自的日誌與重試設定。它支援子 DAG(Sub-DAG)來組合可重複使用的流程,並有 concurrency 控制來限制並行數量。排程使用 cron 語法,並涵蓋時區、重疊政策與補跑視窗。這些機制讓你能夠將既有的 runbook 轉換成有依賴圖與重試能力的生產工作流程,而不需要改寫業務邏輯。若你刪除 YAML 檔,原本的腳本仍然可以獨立執行,這是與框架綁定方案最大的不同。
安裝與啟動:從 curl 到 Docker 的具體指令
安裝方式多樣,macOS 與 Linux 可使用 curl 指令:curl -fsSL https://raw.githubusercontent.com/dagucloud/dagu/main/scripts/installer.sh | bash。Homebrew 使用者可執行 brew install dagu,npm 則有 @dagucloud/dagu 套件,Windows 有對應的 PowerShell 安裝腳本。Docker 使用者可執行 docker run --rm -v ~/.dagu:/var/lib/dagu -p 8080:8080 ghcr.io/dagucloud/dagu:latest dagu start-all,這個指令會掛載本機目錄作為狀態儲存,並啟動內建的 Web UI。注意 README 特別警告這個 Docker 指令不會暴露主機的 Docker daemon,這表示若你的工作流程需要執行 Docker 步驟,你必須自行處理 daemon 連線,例如掛載 docker.sock,但這個細節 README 並未展開。啟動後,你可以透過 Web UI 檢視佇列、執行中、完成與失敗的工作流程,並查看每個步驟的日誌。安裝過程需要網路下載,對於 air-gapped 環境,你需要事先準備好二進位檔,這點在文件中沒有明確說明,但可以從安裝腳本推測。
真正的限制:當 Dagu 不是正確工具的情況
Dagu 的設計哲學是「你的腳本從不 import 編排器」,這帶來極大的彈性,但也限制了某些進階場景。首先,它沒有像 Temporal 那樣的持久執行模型,若一個步驟執行到一半,程序崩潰,Dagu 如何恢復?README 沒有詳細說明檢查點或續跑機制,只有提到「durable execution」與檔案式狀態,但實際的保證程度不明。其次,並行控制與資源限制是透過佇列與 concurrency 設定達成,但沒有像 Airflow 那樣複雜的 SLA 或優先權佇列。對於需要大量 worker 且每個 worker 有不同資源需求的團隊,Dagu 的模型可能過於簡單。第三,它不適合需要將編排邏輯嵌入應用程式程式碼的場景,例如你需要在使用者請求觸發時動態建構工作流程,Dagu 的 YAML 靜態結構會成為障礙。最後,GPL-3.0 授權對某些企業是障礙,若你想將 Dagu 嵌入商業產品並散布,你需要開放原始碼,這可能不符合你的商業模式。
替代方案的真實差異:cron、Airflow 與 Temporal 的取捨
Dagu 的 README 直接點名三個替代方案。cron 是基礎排程器,但沒有依賴關係、重試或歷史紀錄,Dagu 補足了這些,但增加了 YAML 學習曲線。Airflow 提供完整的平台,包括排程器、中繼資料資料庫與 worker,但你需要維護一個 Python 環境,並將工作改寫成 DAG 程式碼。Dagu 的差異在於,它不要求你改寫工作,而是將工作視為外部指令。Temporal 則提供真正的持久執行,業務邏輯必須寫成其 SDK 的活動與工作流程,Dagu 沒有這種深度保證,但換來的是更低的整合成本。若你的團隊已經熟悉 Python 且需要複雜的資料管道排程,Airflow 的生態系與社群文件可能更豐富;若你需要嚴格的執行保證與長時間執行的工作流程,Temporal 的 SDK 雖然侵入性高,但提供了 Dagu 檔案式狀態無法比擬的可靠性。Dagu 的定位是「夠用就好」,但「夠用」的界線需要你自行測試。
維護與升級成本:單一二進位檔的雙面刃
Dagu 的維護成本在於其單一二進位檔的更新方式。由於沒有外部資料庫,升級通常只需替換執行檔,但你需要確認 YAML 格式的向後相容性。README 顯示近期有頻繁的版本發布,例如 v2.16.3 與 v2.16.2 相隔一週,這代表專案仍在快速迭代,升級時可能需要關注變更日誌。狀態儲存在本機檔案,這意味著備份策略很直接:備份 ~/.dagu 目錄即可。但檔案數量會隨執行歷史增長,README 沒有提到自動清理或保留政策,你需要自行實作日誌輪替,否則磁碟空間會耗盡。此外,Dagu 有內建的 MCP server,可以讓 AI 代理程式檢查工作流程與執行狀態,這對實驗性用途有趣,但也增加了安全考量,因為它允許外部控制執行。整體而言,Dagu 的維護成本低於 Airflow,但你需要承擔自行管理檔案成長與升級測試的責任。
編輯結論
若你的團隊以 shell 指令、既有腳本與容器為主,且不想為了排程而維護一套 Python 平台或 SDK,Dagu 的單一二進位檔與檔案式狀態極具吸引力。它適合內部自動化、ETL 與邊緣工作負載,但若你需要跨團隊的複雜狀態管理、精細的並行策略或長時間執行的可靠保證,應先驗證其佇列與並行控制是否足夠。GPL-3.0 授權意味著若你修改並散布程式碼,需開放原始碼,這對內部使用通常無礙,但對商業嵌入式產品需謹慎。採用前,請實際用你的腳本建立一個包含 retry 與 concurrency 設定的 DAG,並確認檔案式狀態在目標磁碟上的備份與清理策略。Dagu 的定位是減少編排的營運成本,而非提供一個全功能的分散式工作平台,界線明確。
社群筆記