ジョブ管理システム

ノード単位のライセンスがいらないジョブ管理システム。

スケジュール、依存関係、営業日カレンダー、リトライ、リカバリジョブ、実行履歴。ジョブネットをバージョン管理された YAML として定義し、単一のセルフホストバイナリが実行します。

単一バイナリ。管理サーバーもノードごとのエージェントも不要
定義はバージョン管理された YAML
運用担当と定義変更者を権限で分離
セルフホストは無料、サーバー数は無制限
01

ジョブ管理システムに本当に要るもの

この分野はスケジュール実行だけを指しません。時刻で起動するところまでは cron がすでにやっています。ジョブ管理システムが必要になるのは、ジョブ同士に依存関係が生まれ、翌朝それについて誰かが説明責任を負うようになってからです。

  • スケジュールで動かし、しかも実際に業務が動く日にだけ動かす
  • ジョブ間の順序を表現し、前段が失敗したら後段を止める
  • 一時的な障害はリトライし、そうでないものは通知し、人が読める履歴を残す
  • 失敗したジョブを再実行する権限と、その定義を変更する権限を分ける
02

cron で足りなくなる地点

多くのチームは cron やタスクスケジューラからここに来ます。決断というより、たいてい同じ 3 つの症状が出た結果です。

  • 順序を時刻で表現している。前のジョブがだいたい 02:20 に終わるから、次を 02:30 に置いている
  • 失敗をシステムではなく人が見つけている。しかもたいてい翌朝
  • 定義が 1 台のサーバーの上にしかないため、変更をレビューできず、テスト環境で再現もできない
03

ジョブネットは 1 ファイル

依存関係、カレンダー、リトライ、リカバリは、crontab の行とラッパースクリプトに散らばった慣習ではなく、ワークフローの項目になります。2 つの取得ジョブが並行で走り、集計は両方の完了を待ちます。

  • preconditions が、どのステップより先に営業日判定で実行可否を決めます
  • depends が順序をそのまま表現するので、取得の失敗が古いデータを集計に流し込まずに止まります
  • handler_on.failure がリカバリジョブにあたり、max_active_runs が遅れた夜間処理と翌日の重なりを防ぎます
夜間バッチのジョブネット
# nightly-jobnet.yaml
schedule: "0 2 * * *"
max_active_runs: 1

# 営業日だけ実行する
preconditions:
  - eval: "$(date +%u)"
    expected: "re:[1-5]"

steps:
  - id: fetch_sales
    run: /opt/batch/fetch-sales.sh
    retry_policy:
      limit: 2
      interval_sec: 300

  - id: fetch_inventory
    run: /opt/batch/fetch-inventory.sh
    retry_policy:
      limit: 2
      interval_sec: 300

  - id: aggregate
    run: /opt/batch/aggregate.sh
    depends: [fetch_sales, fetch_inventory]

  - id: publish
    run: /opt/batch/publish-report.sh
    depends: [aggregate]

# 異常時のリカバリと完了処理
handler_on:
  failure:
    run: /opt/batch/recovery.sh
  success:
    run: /opt/batch/mark-complete.sh

mail_on:
  failure: true
04

いまあるサーバーに届かせる

ジョブはたいていすでにあるマシンの上で動いています。Dagu は常駐エージェントなしに SSH でそれらを実行し、常駐する実行基盤が適している場合はワーカープロセスを置きます。

  • SSH ステップが、対象ホストに何もインストールせずに既存の Linux や UNIX でコマンドを実行します
  • ワーカーは worker_selector のラベルで選ばれ、ホスト単位のライセンスはありません
  • コーディネーターとワーカー間の通信は自社ネットワーク内の gRPC で完結します
05

再実行する人と、定義を変える人を分ける

深夜 3 時に失敗したジョブを再実行する運用担当が、その中身を黙って変更できる必要はありません。ロール、SSO、監査ログはライセンス版のセルフホストに含まれます。

  • operator は実行と停止はできますが定義は変更できません。viewer は参照のみ、developer と manager はワークフローを変更できます
  • OIDC で既存の ID 基盤にログインを寄せられるため、利用者情報を二重管理せずに済みます
  • 監査ログに管理操作とセキュリティ上重要な操作が記録されます
06

AI ツールに昨夜の状況を聞く。鍵は渡さずに

Dagu は同じ HTTP サーバーの /mcp エンドポイントに MCP サーバーを内蔵しています。別途インストールするパッケージはありません。MCP 対応の AI ツールは、REST API と同じ認証境界を通してワークフロー、実行状態、ログを読めます。運用にとって重要なのは、権限の仕組みが既存のものと同じだという点です。

  • 公開されているのは 3 つのツールだけです。状態を読む dagu_read、DAG を編集する dagu_change、実行を制御する dagu_execute
  • API キーは surface を mcp のみに限定できるため、Dagu を読む AI ツールに REST API を一切触らせないことができます
  • そのキーに viewer ロールを与えれば、昨夜のバッチがなぜ落ちたかを説明させつつ、実行の開始も停止も定義の変更も構造的にできない状態にできます
  • キーはユーザー所有かサービスアカウントとして帰属が記録されるため、MCP の呼び出しとそこから起きた操作が、名前のある主体として監査に残ります
  • Claude Code、Codex、Gemini CLI、GitHub Copilot など、リモート MCP サーバーに対応したツールならそのまま接続できます。エンドポイントは標準の Streamable HTTP なので、Dagu 側にクライアント固有の対応は要りません

監査ログはライセンス版の機能で、コミュニティ版の API キーは 2 本までです。

07

費用と、向かない場合

コミュニティ版のセルフホストはサーバー数もワーカー数も無制限で無料です。ライセンス版は実行ノードではなく Dagu サーバー単位の課金で、サーバーライセンス 3 つ年額 500 ドルから。ただしそれで買えないものがあります。従来型のベンダーとの関係です。

  • スケジューラーは単一インスタンスで動き、リーダー選出は内蔵していないため、可用性の設計は自社で組む必要があります
  • サポートは無料版が Discord コミュニティ、有償プランがメールサポートで、日本語対応の保守契約ではありません
  • サーバーを持つ担当者が置けない場合や、ジョブを定義する人が Git 上の YAML に馴染まない場合は、商用製品のほうが正直な答えです

FAQ

導入前によくある質問

既存のジョブ管理製品からどう移行しますか?

自動の変換ツールはありません。現実的な進め方は、既存製品からユニット定義をテキストで出力し、DAG ファイルを生成するスクリプトを書き、dagu validate で検証したうえで、まず 1 ジョブネットグループだけ既存製品と並行稼働させることです。変換先がプレーンな YAML なので、この変換処理は自社で持って何度でも流し直せます。データ移行ではなく開発作業として工数を見積もってください。

営業日カレンダーや月末処理はどう表現しますか?

スケジュールは cron 式で指定し、実行可否は preconditions で判定します。曜日や日付の条件はワークフローまたはステップの条件として書きます。営業日カレンダーを別のシステムが持っている場合は、ステップからそれを取得して条件に使えます。

AI ツールに本番のジョブを触らせて大丈夫ですか?

権限で分けてください。MCP は Dagu の既存のロールと API キーの仕組みをそのまま使うので、surface を mcp のみに限定し viewer ロールを与えたキーなら、AI ツールは状態とログを読めますが、実行の開始も停止も定義の変更もできません。実際に操作させたいところにだけ operator や developer を渡します。呼び出しは監査に残り、キーの帰属先も記録されます。

可用性はどうなりますか?

スケジューラーは単一インスタンスで動きます。リーダー選出の仕組みは内蔵していないため、可用性が要件になる場合はプロセス監視と共有ストレージを含めた構成を自社で設計する必要があります。ワーカー側は複数台に増やせます。

無料で使える範囲はどこまでですか?

コミュニティ版のセルフホストはサーバー数もワーカー数も無制限で、スケジュール実行、依存関係、リトライ、Web UI、Docker と SSH と HTTP のステップまで含めて無料です。SSO、ロールベースアクセス制御、監査ログ、メールサポートはライセンス版に含まれます。API キーはコミュニティ版で 2 本までです。

次のステップ

まず 1 本から始める。

Dagu を入れて、いま cron で動いているスクリプトを 1 本だけ YAML に移し、実際の実行履歴で判断してください。