From dd489e10d14b0218871ab0fac69b25209ff34b03 Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Tue, 4 Aug 2026 20:23:25 +0900 Subject: [PATCH] docs: document the Documents feature --- .vitepress/config.js | 1 + [page].md | 8 ++ getting-started/cli.md | 3 + overview/web-ui.md | 27 +++- public/_redirects | 6 +- public/documents.png | Bin 0 -> 85500 bytes server-admin/configuration.md | 35 +++++ server-admin/deployment/multi-environment.md | 8 +- server-admin/git-sync.md | 10 +- server-admin/index.md | 4 + server-admin/reference.md | 3 + web-ui/api.md | 45 +++++++ web-ui/documents.md | 135 +++++++++++++++++++ web-ui/workspaces.md | 32 ++++- writing-workflows/runtime-variables.md | 25 ++++ 15 files changed, 324 insertions(+), 18 deletions(-) create mode 100644 public/documents.png create mode 100644 web-ui/documents.md diff --git a/.vitepress/config.js b/.vitepress/config.js index bfa6599..525baed 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -122,6 +122,7 @@ const fullSidebar = [ collapsed: true, items: [ { text: "Cockpit", link: "/web-ui/cockpit" }, + { text: "Documents", link: "/web-ui/documents" }, { text: "Workspaces", link: "/web-ui/workspaces" }, { text: "Profiles", link: "/web-ui/profiles" }, { text: "DAG Secret Refs", link: "/web-ui/secrets" }, diff --git a/[page].md b/[page].md index 39d49de..f589f9d 100644 --- a/[page].md +++ b/[page].md @@ -133,6 +133,10 @@ Want to explore without installing anything? Open the [live demo](https://dagu-d

See every run

Use the Web UI to inspect live status, read step logs, review history, retry failures, and edit workflow YAML.

+
+

Keep runbooks with workflows

+

Write Markdown, preview Mermaid diagrams, organize nested documents, search their contents, and synchronize them through Git.

+

Make jobs reliable

Add dependencies, schedules, retries, timeouts, approvals, notifications, and artifacts in the workflow file.

@@ -164,6 +168,10 @@ Want to explore without installing anything? Open the [live demo](https://dagu-d

Workflow examples

Start from practical YAML for scripts, data jobs, containers, and operations.

+
+

Documents and runbooks

+

Keep operational Markdown, diagrams, and troubleshooting guides next to the workflows they explain.

+

Core concepts

Learn how steps, dependencies, parameters, runs, and schedules fit together.

diff --git a/getting-started/cli.md b/getting-started/cli.md index 6ee5463..691e0bb 100644 --- a/getting-started/cli.md +++ b/getting-started/cli.md @@ -866,6 +866,7 @@ Provide either an item ID or `--all`, not both. ```bash dagu sync publish my-dag -m "Update dag" +dagu sync publish docs/operations/runbook -m "Update runbook" dagu sync publish skills/review -m "Update review skill" dagu sync publish --all -m "Batch update" dagu sync publish my-dag --force -m "Overwrite remote" @@ -944,6 +945,7 @@ Provide either an item ID or `--all-missing`, not both. Untracked items cannot b ```bash dagu sync delete my-dag -m "Remove old dag" +dagu sync delete docs/operations/runbook -m "Remove old runbook" dagu sync delete my-dag --force -m "Remove despite modifications" dagu sync delete --all-missing -m "Clean up missing" dagu sync delete my-dag --dry-run @@ -968,6 +970,7 @@ Both source and destination must be of the same kind. ```bash dagu sync mv old-dag new-dag -m "Rename workflow" +dagu sync mv docs/operations/runbook docs/operations/deploy -m "Rename runbook" dagu sync mv old-dag new-dag --force -m "Move despite conflict" dagu sync mv old-dag new-dag --dry-run ``` diff --git a/overview/web-ui.md b/overview/web-ui.md index 19a2b28..268a277 100644 --- a/overview/web-ui.md +++ b/overview/web-ui.md @@ -1,6 +1,6 @@ # Web UI -Use Dagu's web UI to run workflows, inspect results, edit DAGs, review logs, and manage the server from a browser. +Use Dagu's web UI to run workflows, inspect results, edit DAGs, maintain Markdown documents, review logs, and manage the server from a browser. ## Start the UI @@ -21,18 +21,19 @@ dagu start-all --host 0.0.0.0 --port 9000 Dagu's UI is organized around a few everyday jobs: - **Cockpit** for a live board of recent runs +- **Documents** for Markdown runbooks, Mermaid diagrams, and operational notes - **Dashboard** for recent activity and trends - **Definitions** for the list of workflows - **Run details** for human tasks, approvals, outputs, artifacts, logs, and retries - **Notifications** for Slack, email, Telegram, and webhook routing - **Incidents** for PagerDuty and SolarWinds Incident Response routing - **Profiles** for runtime variables and secrets selected when a run starts -- **Search** for finding workflows quickly +- **Search** for finding workflows and document content quickly - **System Status** for scheduler, coordinator, worker, and resource health ## Workspace Selector -The workspace selector sits at the top of the navigation and affects workspace-aware pages such as Cockpit, Dashboard, Definitions, Runs, Search, and Design. +The workspace selector sits at the top of the navigation and affects workspace-aware pages such as Cockpit, Documents, Dashboard, Definitions, Runs, Search, and Design. ![Workspace selector](/web-ui-workspace-selector-demo.png) @@ -59,6 +60,24 @@ Use it when you want to: See [Cockpit](/web-ui/cockpit) for the dedicated guide. +## Documents + +Documents gives runbooks and workflow notes a first-class home in Dagu. + +![Documents editor](/documents.png) + +Use it to: + +- organize Markdown files in a nested tree +- work across several documents with tabs +- edit and preview Markdown, including Mermaid diagrams +- navigate long documents from their heading outline +- search file names and contents +- keep documents scoped to a workspace +- publish and pull documents with Git Sync + +Unsaved drafts are kept in browser storage, and the editor reports external changes before they can overwrite local work. See [Documents](/web-ui/documents) for file operations, workspace behavior, storage configuration, runtime paths, and Git Sync. + ## Dashboard The Dashboard gives you a broader operations view than Cockpit. @@ -197,6 +216,7 @@ Search helps when you know roughly what you need but not exactly where it lives. You can search: - **DAGs** for workflow definitions +- **Documents** for Markdown files and matching lines ## Profiles & Secrets @@ -310,6 +330,7 @@ ui: - [Workspaces](/web-ui/workspaces) - [Cockpit](/web-ui/cockpit) +- [Documents](/web-ui/documents) - [Profiles and profile-owned secrets](/web-ui/profiles) - [Notifications](/web-ui/notifications) - [Incident Routing](/web-ui/incidents) diff --git a/public/_redirects b/public/_redirects index fbd296c..7705b79 100644 --- a/public/_redirects +++ b/public/_redirects @@ -54,8 +54,8 @@ /features/data-flow/ /writing-workflows/data-flow 301 /features/distributed-execution /server-admin/distributed/ 301 /features/distributed-execution/ /server-admin/distributed/ 301 -/features/documents /overview/web-ui 301 -/features/documents/ /overview/web-ui 301 +/features/documents /web-ui/documents 301 +/features/documents/ /web-ui/documents 301 /features/email-notifications /writing-workflows/email-notifications 301 /features/email-notifications/ /writing-workflows/email-notifications 301 /features/exec /migration/from-cron 301 @@ -128,8 +128,6 @@ /step-types/harness /step-types/harness/ 301 /server-admin/mcp /mcp/ 301 /server-admin/mcp/ /mcp/ 301 -/web-ui/documents /overview/web-ui 301 -/web-ui/documents/ /overview/web-ui 301 # Earlier guide hierarchy /github-integration /dagu-actions/official/github-cli 301 diff --git a/public/documents.png b/public/documents.png new file mode 100644 index 0000000000000000000000000000000000000000..065e8c86fd8e26bae2c06cb9428934e01366b819 GIT binary patch literal 85500 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

!X9a!)x6 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�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 literal 0 HcmV?d00001 diff --git a/server-admin/configuration.md b/server-admin/configuration.md index de4470b..9481f53 100644 --- a/server-admin/configuration.md +++ b/server-admin/configuration.md @@ -56,6 +56,7 @@ auth: paths: dags_dir: /opt/dagu/dags + docs_dir: /opt/dagu/dags/docs log_dir: /var/log/dagu data_dir: /var/lib/dagu/data dag_state_dir: /var/lib/dagu/data/dag-state @@ -69,6 +70,7 @@ Configuration fields can be overridden with `DAGU_` environment variables. Neste export DAGU_HOST=0.0.0.0 export DAGU_PORT=8080 export DAGU_DAGS_DIR=/opt/dagu/dags +export DAGU_DOCS_DIR=/opt/dagu/dags/docs export DAGU_DAG_DISCOVERY_RECURSIVE=true export DAGU_DATA_DIR=/var/lib/dagu/data export DAGU_DAG_STATE_DIR=/var/lib/dagu/data/dag-state @@ -84,6 +86,7 @@ Common examples: | `DAGU_PORT` | `port` | Web UI port | | `DAGU_PUBLIC_URL` | `public_url` | External URL used in generated links | | `DAGU_DAGS_DIR` | `paths.dags_dir` | DAG definition directory | +| `DAGU_DOCS_DIR` | `paths.docs_dir` | Markdown document directory | | `DAGU_DAG_DISCOVERY_RECURSIVE` | `dag_discovery.recursive` | Discover DAG definitions in subdirectories | | `DAGU_DATA_DIR` | `paths.data_dir` | Data directory used by derived stores | | `DAGU_LOG_DIR` | `paths.log_dir` | Log directory | @@ -127,6 +130,7 @@ Typical layout: |-- config.yaml |-- base.yaml |-- dags/ +| `-- docs/ |-- logs/ `-- data/ |-- artifacts/ @@ -145,6 +149,7 @@ Most persistent runtime data is stored under `paths.data_dir` by default. | Config field | Default | Purpose | | --- | --- | --- | | `paths.dags_dir` | `~/.config/dagu/dags` | DAG definitions | +| `paths.docs_dir` | `{dags_dir}/docs` | Markdown documents and runbooks | | `paths.log_dir` | `~/.local/share/dagu/logs` | DAG logs | | `paths.data_dir` | `~/.local/share/dagu/data` | Base directory for runtime data | | `paths.tools_dir` | `{data_dir}/tools` | Managed DAG tool cache | @@ -158,6 +163,35 @@ Most persistent runtime data is stored under `paths.data_dir` by default. | `paths.contexts_dir` | `{data_dir}/contexts` | CLI contexts | | `paths.workspaces_dir` | `{data_dir}/workspaces` | Web UI workspaces | +## Documents Directory + +`paths.docs_dir` is the storage root for Markdown files managed by the Documents Web UI and Git Sync: + +```yaml +paths: + dags_dir: /opt/dagu/dags + docs_dir: /srv/dagu/documents +``` + +The equivalent environment variable is: + +```bash +export DAGU_DOCS_DIR=/srv/dagu/documents +``` + +When `paths.docs_dir` is not configured, Dagu uses `/docs`. Default-workspace documents live directly in that directory. Named workspaces use a directory named after the workspace: + +```text +/srv/dagu/documents/ +|-- shared-runbook.md +`-- finance/ + `-- month-end-close.md +``` + +`shared-runbook.md` belongs to Default. The second path is owned by the `finance` workspace when that workspace exists. Treat the document root and workspace records as related state when designing backups. Dagu moves the matching document directory when a workspace is renamed and blocks workspace deletion until its documents are removed. + +Each workflow run also receives a per-DAG document path as `${context.paths.docs_dir}` and `DAG_DOCS_DIR`. See [Documents](/web-ui/documents) and [Runtime Context and Variables](/writing-workflows/runtime-variables#documents-directory-context-paths-docs-dir). + ## Recursive DAG Discovery By default, Dagu discovers DAG definitions only at the top level of @@ -240,3 +274,4 @@ Do not put `paths`, `auth`, `coordinator`, `worker`, or other server process set - [Queue Configuration](/server-admin/queues) - [Distributed Execution](/server-admin/distributed/) - [Persistent State](/writing-workflows/persistent-state) +- [Documents](/web-ui/documents) diff --git a/server-admin/deployment/multi-environment.md b/server-admin/deployment/multi-environment.md index 4819b94..71e4000 100644 --- a/server-admin/deployment/multi-environment.md +++ b/server-admin/deployment/multi-environment.md @@ -1,6 +1,6 @@ # Multi-Environment Deployments -Run a separate Dagu deployment for each environment when development, staging, and production must have independent execution boundaries. Each deployment can synchronize reviewed workflow definitions from Git while keeping its scheduler, workers, storage, credentials, and runtime configuration separate. +Run a separate Dagu deployment for each environment when development, staging, and production must have independent execution boundaries. Each deployment can synchronize reviewed workflows and documents from Git while keeping its scheduler, workers, storage, credentials, and runtime configuration separate. ::: warning Do Not Use Workspaces as Environments [Workspaces](/web-ui/workspaces) organize and authorize workflows inside one Dagu installation. They do not create separate schedulers, local execution environments, coordinators, workers, queues, storage, or Git Sync configurations. @@ -32,17 +32,17 @@ Do not mount the same writable data directory into independent environments. Sha ## Promote Workflows with Git Sync -[Git Sync](/server-admin/git-sync) distributes DAG definitions from a repository. Use a branch promotion workflow so each deployment advances only after the workflow version has passed the preceding environment. +[Git Sync](/server-admin/git-sync) distributes DAG definitions, Markdown documents, and workflow-authoring skills from a repository. Use a branch promotion workflow so each deployment advances only after the repository version has passed the preceding environment. A typical flow is: -1. Author and validate a workflow in development. +1. Author and validate a workflow or its operational documents in development. 2. Review the change in Git. 3. Promote the reviewed commit to the branch tracked by staging. 4. Validate the workflow and its integrations in staging. 5. Promote the approved commit to the branch tracked by production. -Configure each deployed environment to track its own branch. Staging and production should normally be read-only so workflow edits cannot publish directly from those installations. +Configure each deployed environment to track its own branch. Staging and production should normally be read-only so workflow and document edits cannot publish directly from those installations. ```yaml # Staging config.yaml diff --git a/server-admin/git-sync.md b/server-admin/git-sync.md index 4f9dab6..bb798d0 100644 --- a/server-admin/git-sync.md +++ b/server-admin/git-sync.md @@ -1,14 +1,17 @@ # Git Sync -Git Sync keeps Dagu workflows and workflow-authoring skill files aligned with a Git repository. +Git Sync keeps Dagu workflows, Markdown documents, and workflow-authoring skill files aligned with a Git repository. ## What It Syncs Git Sync can track: - DAG files +- Markdown documents - skills +DAG files live at the configured repository root, documents live under `docs/`, and skills live under `skills/`. Pulling a repository routes each kind to its configured local storage directory. + ## Tracked Items And IDs Git Sync refers to each tracked file by an `itemId`. You will see that term in the CLI and REST API. @@ -17,6 +20,7 @@ Git Sync refers to each tracked file by an `itemId`. You will see that term in t |---|---|---| | `my-dag.yaml` | `my-dag` | `dag` | | `subdir/report.yml` | `subdir/report` | `dag` | +| `docs/operations/runbook.md` | `docs/operations/runbook` | `doc` | | `skills/review/SKILL.md` | `skills/review/SKILL` | `skill` | ## Basic Configuration @@ -115,6 +119,7 @@ dagu sync pull ```bash dagu sync publish my-dag -m "Update workflow" +dagu sync publish docs/operations/runbook -m "Update operations runbook" dagu sync publish skills/review -m "Update review skill" dagu sync publish --all -m "Batch update" ``` @@ -137,6 +142,7 @@ dagu sync cleanup ```bash dagu sync delete my-dag -m "Remove old workflow" dagu sync mv old-dag new-dag -m "Rename workflow" +dagu sync mv docs/operations/runbook docs/operations/deploy -m "Rename runbook" ``` ## REST API @@ -173,6 +179,7 @@ Write operations are blocked when Git Sync is configured as read-only (`push_ena ## Operational Notes - Manage Git Sync through the UI, CLI, or API rather than editing its internal state directly. +- Documents edited in the Web UI appear as `doc` items in Git Sync status, diff, publish, discard, delete, and move operations. - Pull before publishing when multiple people or systems may change the same repository. - Use clear commit messages because Git Sync publishes normal Git commits. - For staging and production, prefer read-only Git Sync configurations and promote reviewed workflow versions between environment branches. See [Multi-Environment Deployments](/server-admin/deployment/multi-environment). @@ -180,4 +187,5 @@ Write operations are blocked when Git Sync is configured as read-only (`push_ena ## Related Pages - [Server Administration](/server-admin/) +- [Documents](/web-ui/documents) - [Multi-Environment Deployments](/server-admin/deployment/multi-environment) diff --git a/server-admin/index.md b/server-admin/index.md index 56dd7c5..63a712a 100644 --- a/server-admin/index.md +++ b/server-admin/index.md @@ -42,6 +42,7 @@ auth: paths: dags_dir: /opt/dagu/workflows + docs_dir: /opt/dagu/workflows/docs log_dir: /var/log/dagu ``` @@ -60,6 +61,7 @@ docker run -d \ **[Configuration](/server-admin/configuration)** - Config file, environment variables, and precedence - `DAGU_HOME` and path defaults +- Documents and runbook storage - Persistent state directory configuration **[Server Configuration](/server-admin/server)** @@ -150,6 +152,7 @@ export DAGU_PORT=8080 # Paths export DAGU_DAGS_DIR=/opt/workflows +export DAGU_DOCS_DIR=/opt/workflows/docs export DAGU_LOG_DIR=/var/log/dagu # Auth @@ -164,6 +167,7 @@ dagu start-all - [Set up authentication](/server-admin/server#authentication) for production - [Understand configuration precedence](/server-admin/configuration) before mixing flags, environment variables, and `config.yaml` - [Configure base defaults](/server-admin/base-config) for shared DAG settings +- [Configure Documents](/web-ui/documents) for Markdown runbooks and Git Sync - [Configure monitoring](/server-admin/operations#monitoring) for visibility - [Set up distributed execution](/server-admin/distributed/) for scaling - [Review all options](/server-admin/reference) for fine-tuning diff --git a/server-admin/reference.md b/server-admin/reference.md index cf743c5..4ee67ef 100644 --- a/server-admin/reference.md +++ b/server-admin/reference.md @@ -56,6 +56,7 @@ sse: # Directories (must be under "paths" key) paths: dags_dir: "~/.config/dagu/dags" + docs_dir: "" # Auto: {dags_dir}/docs alt_dags_dir: "" # Additional read-only DAG directories log_dir: "~/.local/share/dagu/logs" data_dir: "~/.local/share/dagu/data" @@ -320,6 +321,7 @@ All options support `DAGU_` prefix. - `DAGU_HOME` - Set all directories to this path (can be overridden by `--dagu-home` flag) - `DAGU_DAGS_DIR` - DAG definitions - `DAGU_DAGS` - Alternative to `DAGU_DAGS_DIR` +- `DAGU_DOCS_DIR` - Markdown documents and runbooks (default: `{dags_dir}/docs`) - `DAGU_ALT_DAGS_DIR` - Additional read-only DAG directories - `DAGU_LOG_DIR` - Log files - `DAGU_DATA_DIR` - Application data @@ -771,6 +773,7 @@ peer: ### Auto-generated Paths When not specified, these paths are automatically derived: +- `paths.docs_dir`: `{paths.dags_dir}/docs` - Stores Markdown documents and runbooks - `paths.artifact_dir`: `{paths.data_dir}/artifacts` - Stores DAG run artifacts - `paths.tools_dir`: `{paths.data_dir}/tools` - Stores managed DAG tool cache, locks, manifests, and shims - `paths.dag_state_dir`: `{paths.data_dir}/dag-state` - Stores persistent DAG state values diff --git a/web-ui/api.md b/web-ui/api.md index 3305c76..768cada 100644 --- a/web-ui/api.md +++ b/web-ui/api.md @@ -3335,6 +3335,51 @@ Retrieves information about connected workers in the distributed execution syste } ``` +## Documents Endpoints + +Documents endpoints accept optional `workspace` and `remoteNode` query parameters. Document paths are relative to the selected workspace and omit the `.md` extension. All authenticated users can list, read, and search documents they can access. Mutations require `permissions.write_dags` and a write-capable workspace role. + +| Method | Endpoint | Description | +| --- | --- | --- | +| `GET` | `/api/v1/docs` | List the document tree, or use `flat=true` for a flat list. | +| `POST` | `/api/v1/docs` | Create a Markdown document. | +| `GET` | `/api/v1/docs/search?q=...` | Search document content. | +| `GET` | `/api/v1/docs/doc?path=...` | Read one document. | +| `PATCH` | `/api/v1/docs/doc?path=...` | Replace one document's content. | +| `DELETE` | `/api/v1/docs/doc?path=...` | Delete one document. | +| `POST` | `/api/v1/docs/doc/rename?path=...` | Rename or move a document or directory. | +| `POST` | `/api/v1/docs/delete-batch` | Delete several documents or directories. | + +Create a document in the `operations` directory of the default workspace: + +```bash +curl -X POST "http://localhost:8080/api/v1/docs?workspace=default" \ + -H "Content-Type: application/json" \ + -d '{"id":"operations/runbook","content":"# Operations runbook\n"}' +``` + +Read or update the same document: + +```bash +curl "http://localhost:8080/api/v1/docs/doc?workspace=default&path=operations%2Frunbook" + +curl -X PATCH "http://localhost:8080/api/v1/docs/doc?workspace=default&path=operations%2Frunbook" \ + -H "Content-Type: application/json" \ + -d '{"content":"# Updated operations runbook\n"}' +``` + +Rename and batch-delete requests use `newPath` and `paths` respectively: + +```json +{"newPath":"operations/deploy"} +``` + +```json +{"paths":["operations/deploy","legacy"]} +``` + +See [Documents](/web-ui/documents) for Web UI behavior, workspace ownership, storage, and Git Sync. + ## Git Sync Endpoints All sync endpoints accept an optional `remoteNode` query parameter. diff --git a/web-ui/documents.md b/web-ui/documents.md new file mode 100644 index 0000000..449cf17 --- /dev/null +++ b/web-ui/documents.md @@ -0,0 +1,135 @@ +# Documents + +Documents keeps operational knowledge next to the workflows it explains. Use the Web UI to write Markdown runbooks, troubleshooting notes, handoff guides, and diagrams without leaving Dagu. + +![Documents editor with file tree, Markdown preview, and outline](/documents.png) + +## What You Can Do + +- organize Markdown files in a nested file tree +- create, rename, move, and delete files and folders +- keep several documents open in tabs +- edit Markdown and preview the rendered result side by side +- render Mermaid diagrams in the preview +- jump through long documents from the generated outline +- search document names and contents +- scope documents to the default or a named workspace +- synchronize documents with a Git repository through [Git Sync](/server-admin/git-sync) + +## Browse And Organize Documents + +Open **Documents** from the navigation. The sidebar shows the document tree for the selected workspace. + +Use the tree actions to: + +- create a document or folder +- rename an item +- drag an item into another folder +- select several items for deletion +- expand or collapse nested folders + +Document names use the `.md` extension. Dagu adds it when a new document name omits the extension. A file and a directory cannot have the same path identity, so names such as `runbook.md` and `runbook/` cannot exist side by side. + +Moving documents between workspaces is not supported. Select the destination workspace first and create or synchronize the document there. + +## Edit And Preview Markdown + +Open a document to add it as a tab. The editor provides: + +- **Edit** and **Preview** modes +- standard Markdown rendering +- Mermaid diagram rendering +- an outline generated from headings +- `Ctrl+S` or `Cmd+S` to save + +Dagu keeps unsaved content in browser storage so an accidental navigation or reload does not immediately lose the draft. Drafts are separated by authenticated user, remote node, and workspace. Saving or discarding the draft clears the stored copy. + +An open document with unsaved changes must be saved before it can be renamed or moved. This keeps the editor buffer attached to the correct file. + +When another user or Git Sync changes an open document, the editor reports the external update instead of silently overwriting local edits. Documents receives live update events when available and falls back to periodic refreshes. + +## Workspace Scoping + +Documents follows the workspace selector: + +| Selection | Documents shown | +| --- | --- | +| **All workspaces** | Documents from every workspace the account can access. This aggregate view is for browsing and search. | +| **Default** | Documents that are not assigned to a named workspace. | +| **Named workspace** | Only documents owned by that workspace. | + +Select **Default** or a specific named workspace before creating, renaming, moving, or deleting content. + +On disk, Dagu stores default documents directly under `paths.docs_dir` and named-workspace documents under a workspace directory: + +```text +/ +|-- operations/ +| `-- runbook.md +`-- platform/ + `-- incident-response.md +``` + +In this example, `operations/runbook.md` belongs to **Default**, while `platform/incident-response.md` belongs to the `platform` workspace. + +Renaming a workspace moves its document tree to the new workspace name. A workspace cannot be deleted while it still contains documents; move or remove those documents first. + +See [Workspaces](/web-ui/workspaces) for access rules and lifecycle behavior. + +## Search + +The Documents sidebar filters the current tree by file name and document content. Dagu's global **Search** page also returns matching documents and the lines containing the query, subject to workspace access. + +## Storage Configuration + +The document root is configured with `paths.docs_dir`: + +```yaml +paths: + dags_dir: /opt/dagu/dags + docs_dir: /opt/dagu/dags/docs +``` + +The equivalent process configuration variable is `DAGU_DOCS_DIR`. When no value is configured, Dagu uses `/docs`. + +See [Configuration](/server-admin/configuration#documents-directory) for deployment and storage details. + +## Use Documents From A Workflow + +Each run receives the document directory for its DAG as `${context.paths.docs_dir}`. Processes receive the same path as `DAG_DOCS_DIR`. + +```yaml +steps: + - id: print_runbook + run: cat "${context.paths.docs_dir}/runbook.md" +``` + +For a default-workspace DAG named `operations`, the path resolves to `/operations`. For the same DAG in the `platform` workspace, it resolves to `/platform/operations`. + +`DAGU_DOCS_DIR` configures the server-wide document root. `DAG_DOCS_DIR` is the per-DAG path projected into a running step. + +See [Runtime Context and Variables](/writing-workflows/runtime-variables#documents-directory-context-paths-docs-dir) for the full runtime contract. + +## Git Sync + +Git Sync tracks documents under `docs/` in the repository. For example, the local document `operations/runbook.md` is represented as: + +```text +repository path: docs/operations/runbook.md +itemId: docs/operations/runbook +kind: doc +``` + +Pulling writes repository documents into the configured document root. Publishing sends Web UI edits back to the repository when Git Sync writes are enabled. See [Git Sync](/server-admin/git-sync) for setup, status, conflicts, and CLI commands. + +## Permissions + +Authenticated users can browse documents in workspaces they are allowed to access. Creating, saving, renaming, moving, and deleting documents requires `permissions.write_dags` and a write-capable role for the selected workspace. + +## Related + +- [Web UI](/overview/web-ui) +- [Workspaces](/web-ui/workspaces) +- [Git Sync](/server-admin/git-sync) +- [Configuration](/server-admin/configuration#documents-directory) +- [Runtime Context and Variables](/writing-workflows/runtime-variables#documents-directory-context-paths-docs-dir) diff --git a/web-ui/workspaces.md b/web-ui/workspaces.md index dd69bd5..16d82e7 100644 --- a/web-ui/workspaces.md +++ b/web-ui/workspaces.md @@ -2,7 +2,7 @@ Workspaces organize workflows and runs inside one Dagu installation. Use them to separate workflows by team, business function, product, or operational responsibility, such as `finance`, `data-platform`, `customer-support`, or `platform-ops`. -Workspaces can also scope access, managed secrets, profile defaults, notifications, and incident routing. +Workspaces can also scope access, documents, managed secrets, profile defaults, notifications, and incident routing. ![Workspace selector](/web-ui-workspace-selector-demo.png) @@ -16,6 +16,7 @@ Use workspaces when you want to: - keep the DAG list focused on one team or business function - review only the runs that belong to a project +- keep runbooks and operational notes with the team that owns them - keep Web UI-managed secrets scoped to the workflows that use them - route notifications to the responsible team's channels - route incidents to the responsible team's PagerDuty or SolarWinds connections @@ -39,13 +40,13 @@ The scheduler loads and evaluates workflows across the deployment regardless of ## Selecting a Workspace -The workspace selector is in the left navigation above the remote node selector. It affects workspace-aware pages such as Cockpit, Dashboard, Definitions, Runs, Search, Design, Notifications, and Incident Routing. +The workspace selector is in the left navigation above the remote node selector. It affects workspace-aware pages such as Cockpit, Documents, Dashboard, Definitions, Runs, Search, Design, Notifications, and Incident Routing. | Selection | What You See | | --- | --- | -| **All workspaces** | Everything your account can access. | -| **Default** | Workflows that do not have a workspace label. | -| **Named workspace** | Only workflows and runs for that workspace. | +| **All workspaces** | Everything your account can access across workflows, runs, and documents. Document changes are disabled in this aggregate view. | +| **Default** | Workflows without a workspace label and documents outside named-workspace directories. | +| **Named workspace** | Only workflows, runs, and documents for that workspace. | The selector stays on your last choice in the browser, so switching from `finance` to Runs keeps the same focus. @@ -77,6 +78,21 @@ After saving the DAG, select `finance` in the Web UI to see it with the matching When you start or enqueue a workflow from Cockpit while a named workspace is selected, Dagu adds the matching workspace label to the run so it appears in the same workspace view. +## Documents in Workspaces + +The [Documents](/web-ui/documents) page uses the same workspace selector as workflows and runs. Default documents live directly under `paths.docs_dir`; documents in a named workspace live under `//`. + +```text +/ +|-- shared-runbook.md # Default +`-- finance/ + `-- month-end-close.md # finance workspace +``` + +Workspace access filters the document tree, content search, and global search results. **All workspaces** combines the documents the current account can access for browsing and search. Select **Default** or one named workspace before creating, renaming, moving, or deleting a document. + +Documents cannot be dragged across workspace boundaries. Renaming a workspace moves its document directory to the new name. Deletion is blocked while the workspace still contains documents, which prevents them from losing their workspace ownership. + ## Secrets in Workspaces The **DAG Secret Refs** tab on the **Profiles & Secrets** page supports global and workspace scopes. A Dagu-managed secret with ref `database/password` in `finance` is different from a secret with the same ref in `data-platform`. @@ -150,13 +166,16 @@ See [User Management](/server-admin/authentication/user-management) and [API Key ## Deleting a Workspace -Deleting a workspace removes it from the selector. It does not delete DAG files, run history, users, or API keys. +Deleting a workspace removes it from the selector. It does not delete DAG files, documents, run history, users, or API keys. Before deleting a workspace, check whether: +- its Documents tree is empty; move or remove its documents first - any DAGs still use `workspace=` - users or API keys are scoped to that workspace +Dagu rejects the deletion while documents remain in the workspace. This keeps those files from becoming visible as default documents after their workspace disappears. + After deletion, update affected DAG labels and access grants so future work stays easy to find. ## API Access @@ -175,6 +194,7 @@ For request and response details, see [REST API](/web-ui/api). ## Related - [Cockpit](/web-ui/cockpit) +- [Documents](/web-ui/documents) - [Notifications](/web-ui/notifications) - [Incident Routing](/web-ui/incidents) - [DAG Secret Refs](/web-ui/secrets) diff --git a/writing-workflows/runtime-variables.md b/writing-workflows/runtime-variables.md index ffa2b03..8791f46 100644 --- a/writing-workflows/runtime-variables.md +++ b/writing-workflows/runtime-variables.md @@ -27,6 +27,7 @@ Use `${context.*}` references in value-resolved fields such as `run`, `with`, `e | `${context.trigger.actor}` | Runs started by an attributable actor | None | | `${context.paths.log_file}` | All steps and handlers | `DAG_RUN_LOG_FILE` | | `${context.paths.work_dir}` | When a per-run work directory is available | `DAG_RUN_WORK_DIR` | +| `${context.paths.docs_dir}` | All steps and handlers | `DAG_DOCS_DIR` | | `${context.paths.artifacts_dir}` | When artifact storage is active | `DAG_RUN_ARTIFACTS_DIR` | | `${context.paths.step_stdout_file}` | Current executable step after stdout is assigned | `DAG_RUN_STEP_STDOUT_FILE` | | `${context.paths.step_stderr_file}` | Current executable step after stderr is assigned | `DAG_RUN_STEP_STDERR_FILE` | @@ -66,6 +67,7 @@ Values are refreshed for each step, so `DAG_RUN_STEP_NAME`, `DAG_RUN_STEP_STDOUT | `DAG_WAITING_STEPS` | Wait handler only | Comma-separated list of step names currently waiting for human-task completion or approval. | `release_review,security_review` | | `PWD` | Current step only | Working directory for the step. Defaults to DAG's `working_dir` or the DAG file's directory. | `/home/user/project` | | `DAG_RUN_WORK_DIR` | All steps & handlers | Absolute path to the per-DAG-run working directory. Each run gets its own isolated directory. In local mode, this is `/work/`. In shared-nothing (distributed) mode, this is a temporary directory under the system temp dir. Not set during dry runs. | `/data/dagu/dag-runs/daily-backup/dag-run_20241012_040000Z_c1f4b2/work` | +| `DAG_DOCS_DIR` | All steps & handlers | Absolute path to the current DAG's document directory. Named-workspace DAGs include the workspace directory. | `/opt/dagu/dags/docs/platform/daily-backup` | | `DAG_RUN_ARTIFACTS_DIR` | All steps & handlers when artifact storage is active | Absolute path to the per-DAG-run artifact directory, or a worker-local staging directory in shared-nothing mode. Artifact storage is active when enabled explicitly or auto-enabled by `${context.paths.artifacts_dir}` references, artifact actions, or artifact stream outputs. | `/data/dagu/artifacts/daily-backup/dag-run_20241012_040000Z_c1f4b2` | | `DAG_PARAMS_JSON` | All steps & handlers | JSON string containing the resolved parameter map. Resolved DAG params are serialized as strings; if the run was started with raw JSON parameters, the original payload is preserved. Not set when the DAG has no resolved parameters. | `{"ENVIRONMENT":"prod","batchSize":"1000"}` | | `DAG_PUSHBACK` | Steps re-executed after approval push-back only | JSON string containing the current push-back iteration, latest inputs, authenticated actor, server timestamp, and chronological history. Not set on the initial execution. | `{"iteration":2,"by":"reviewer","at":"2026-04-26T06:18:43Z","inputs":{"FEEDBACK":"Tighten summary"},"history":[...]}` | @@ -122,6 +124,29 @@ steps: - build ``` +## Documents Directory (`${context.paths.docs_dir}`) + +`${context.paths.docs_dir}` points to the document directory associated with the current DAG. Processes receive the same path through `DAG_DOCS_DIR`. + +```yaml +steps: + - id: show_runbook + run: cat "${context.paths.docs_dir}/runbook.md" +``` + +The path is derived from the server's `paths.docs_dir` and the DAG identity: + +| DAG scope | Runtime document directory | +| --- | --- | +| Default workspace, DAG `operations` | `/operations` | +| Workspace `platform`, DAG `operations` | `/platform/operations` | + +This directory is shared across runs of the same DAG, unlike `${context.paths.work_dir}` and `${context.paths.artifacts_dir}`, which are run-specific. It is suitable for durable Markdown instructions and other documents managed from the [Documents Web UI](/web-ui/documents). + +`DAGU_DOCS_DIR` is the process configuration variable that overrides the server-wide root. `DAG_DOCS_DIR` is the per-DAG runtime projection supplied to steps and handlers. + +See [Documents](/web-ui/documents) for editing, workspace scoping, and Git Sync, and [Configuration](/server-admin/configuration#documents-directory) for the storage root. + ## Artifacts Directory (`${context.paths.artifacts_dir}`) `${context.paths.artifacts_dir}` is available, and `DAG_RUN_ARTIFACTS_DIR` is set for processes, when the DAG enables artifact storage explicitly: