Automatisch 常用命令与运维实战

Automatisch v0.15.0 常用命令与运维实战:服务进程运维、BullMQ 队列仪表盘、认证与内部 API 全流程实测(登录/flow/触发/执行记录)、Webhook 端到端验证、pg_dump 与卷备份恢复、社区版公开 API 404 边界与排障速查。

AutomatischAutomatisch工作流自动化2026/10/28

Automatisch 常用命令与运维实战

目标:面向已按部署篇完成 Automatisch v0.15.0 安装的运维人员,给出服务进程运维、BullMQ 队列观测、认证与内部 API 全流程实测、flow 触发端到端验证、备份恢复与排障速查。本文全部命令输入与输出回显均为 2026-10-28 在 Docker 环境模拟真实服务器上的实测记录,逐行照抄。

一、环境信息

项目实测值
Automatisch 版本0.15.0(官方镜像方式部署,见《Automatisch Docker Compose 部署实战》)
服务入口http://127.0.0.1:8140(宿主 8140 → 服务 3000)
进程角色main(Web/API/接入)+ worker(执行器),PostgreSQL 14.5 + Redis 7.0.4
演示账号user@automatisch.io / sample(官方内置,详见第二章)

先盘点栈的整体状态,确认四进程健康:

$ docker compose ps --format 'table {{.Name}}\t{{.Status}}\t{{.Ports}}'
NAME                          STATUS                   PORTS
automatisch-0.15.0-main       Up 45 seconds            0.0.0.0:8140->3000/tcp, [::]:8140->3000/tcp
automatisch-0.15.0-postgres   Up 2 minutes (healthy)   5432/tcp
automatisch-0.15.0-redis      Up 2 minutes             6379/tcp
automatisch-0.15.0-worker     Up 45 seconds            3000/tcp

main 对外暴露 8140(宿主映射),postgres/redis 只在栈内网络互通(无宿主端口),这是生产应有的暴露面。worker 的 3000/tcp 是镜像声明但未映射的端口,实际不对外。

二、服务进程运维命令

2.1 日志查看

$ docker logs automatisch-0.15.0-main | tail -5
2026-10-28 04:12:11:1211 [info]: Server is listening on http://localhost:3000
$ docker logs automatisch-0.15.0-worker | tail -5
2026-10-28 04:12:10:1210 [info]: Workers are ready!

main 的就绪标志是 Server is listening on ...,worker 的就绪标志是 Workers are ready!。默认 LOG_LEVEL=info 下执行期日志很安静(worker 消费任务不打逐条日志),需要观测任务流转细节时把 main/worker 两个服务的 LOG_LEVEL 调到 debug 后重建(配置见《Automatisch 配置参数详解》第七章)。

跟随日志实时输出:

$ docker logs -f automatisch-0.15.0-worker

2.2 重启与重建

$ docker compose restart worker         # 仅重启 worker(执行器,重启无损 flow 状态)
worker Restarting
$ docker compose up -d --force-recreate worker   # 环境变量变更后需重建而非 restart

注意:restart 不会重读编排文件中修改的环境变量——改配置(如 LOG_LEVEL、WEBHOOK_URL)后必须 up -d --force-recreate(或直接 up -d,Compose 检测到配置变化会自动重建)。这一差异在部署篇第六章的 WEBHOOK_URL 实测中已实际应用。

2.3 数据库就绪探针

$ docker exec automatisch-0.15.0-postgres pg_isready -U automatisch_user
/var/run/postgresql:5432 - accepting connections

pg_isready 也是编排中 postgres 健康检查的探针命令,排障时手动执行可快速区分「数据库挂了」与「应用连不上」。

三、BullMQ 队列运维

Automatisch 的任务队列基于 BullMQ(Redis 之上),main 投递、worker 消费。队列状态通过官方内置的 bull-board 仪表盘观测:路径 /admin/queues,需在编排中同时设置 ENABLE_BULLMQ_DASHBOARD=true 与 BULLMQ_DASHBOARD_USERNAME/PASSWORD(三个变量缺一不生效,生效条件与安全提示见配置篇第六章)。

实测仪表盘访问(admin/q1w2e3r4 为实测演示账号):

$ curl -s -o /dev/null -w 'no-auth: %{http_code}\n' http://127.0.0.1:8140/admin/queues
no-auth: 401
$ curl -s -u admin:q1w2e3r4 http://127.0.0.1:8140/admin/queues -o /dev/null -w 'with-auth: %{http_code}\n'
with-auth: 200

未认证 401(Basic 认证挑战生效)、认证后 200(仪表盘 UI)。仪表盘中可观测的队列(源码固定注册):flow(工作流执行主队列)、email(邮件通知)、delete-user(用户数据清理);生产观测重点在 flow 队列的 waiting/active/failed 三个计数——waiting 持续增长说明 worker 消费能力不足(考虑加 worker 副本),failed 堆积说明 flow 步骤存在持续性错误(结合执行历史定位)。

四、认证与内部 API 实测

Automatisch 0.15.0 的 API 面分两层,社区版与付费版的边界在这里,务必认清:

API 层路径认证社区版可用性
内部 API(前端同款)/internal/api/v1/*登录换发的 access token(Authorization 头)✅ 完整可用
公开 REST API/api/v1/*企业许可 + x-api-token❌ 无许可一律 404
触发入口/webhooks/flows/<flowId>[ /sync]无(flow 自带地址)✅ 可用
健康检查/healthcheck无✅ 可用

公开 REST API 的企业版守卫实测:对 /api/v1/* 任意路径的访问在无商业许可的社区版上统一返回 404(源码 checkIsEnterprise 中间件:hasValidLicense() 为假时直接 404,连认证环节都不进入)。实测:

$ curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8140/api/v1/users/signup
HTTP 404
$ curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8140/api/v1/flows
HTTP 404

这是 0.15.0 相对早期版本的重大行为变化(早期社区版提供 token 化 REST API),「用脚本驱动 flow 管理」的选型务必据此评估(见《Automatisch 介绍与选型指南》第四章)。社区版自动化替代路径:内部 API(本章实测)或 Webhook 直触发(第五章)。

4.1 登录换发 token

$ curl -s -X POST http://127.0.0.1:8140/internal/api/v1/access-tokens \
    -H 'Content-Type: application/json' \
    -d '{"email":"user@automatisch.io","password":"sample"}'
{"data":{"token":"5f2e6f6c820dce5941784ff2b351a079c7fa8a192fdd5b69a9adff690df1ef25515b4eb1a7a0539436a9b9a4ce005282"},"meta":{"type":"Object","count":1,"isArray":false,"currentPage":null,"totalPages":null}}

响应包裹在 data 字段。token 有时效(服务端 access-token 过期机制),过期后重新 POST 换发即可。后续所有请求把 token 放入 Authorization 头(裸 token,不加 Bearer 前缀,前端源码即此格式)。

4.2 当前用户信息

$ TOKEN=5f2e6f6c820dce5941784ff2b351a079c7fa8a192fdd5b69a9adff690df1ef25515b4eb1a7a0539436a9b9a4ce005282
$ curl -s http://127.0.0.1:8140/internal/api/v1/users/me -H "Authorization: $TOKEN"
{"data":{"id":"e11b6e20-3bde-48af-8efd-592181401e98","email":"user@automatisch.io","createdAt":1793160730721,"updatedAt":1793160730721,"status":"active","fullName":"Initial admin","role":{"id":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","name":"Admin","description":null,"createdAt":1793160729340,"updatedAt":1793160729340,"isAdmin":true},"permissions":[{"id":"88324ac3-9137-46ca-a264-13e1ecc1d790","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"read","subject":"Connection","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"58aada4e-b1df-4877-a26f-cbafc4f6e6c3","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"read","subject":"Execution","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"8490c442-3f81-427d-a438-e468af258aef","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"read","subject":"Flow","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"923aa78f-514a-4dd9-aa1f-99a50304eb23","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"read","subject":"User","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"dc1aad72-d0ee-4a57-a335-10d48aae82ca","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"manage","subject":"Connection","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"d97d7624-375c-40b1-9572-f56668be9d87","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"manage","subject":"Flow","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340},{"id":"afa88cc0-2a12-47e2-82ff-89a8d2f33989","roleId":"4b947f29-d11c-4c82-890f-ea7b4aed3ba1","action":"manage","subject":"User","conditions":[],"createdAt":1793160729340,"updatedAt":1793160729340}]},"meta":{"type":"User","count":1,"isArray":false,"currentPage":null,"totalPages":null}}

回显要点:Admin 角色(isAdmin: true)携带 7 项权限——Connection/Execution/Flow/User 四类资源的 read 权限加 Connection/Flow/User 三类的 manage 权限。token 无效或过期时该接口返回 401 空响应体,是脚本里最常用的会话探针。

五、Flow 端到端实测(建 flow → 触发 → 执行记录)

本章完成一条真实 flow 的全生命周期:创建 → 配置 Webhook 触发器 + Formatter 动作(两步)→ 激活 → 触发 → 查询执行记录与步骤数据回放。这是社区版「无 REST API」前提下做自动化交付的完整闭环。

5.1 创建 flow 与初始结构

$ curl -s -X POST http://127.0.0.1:8140/internal/api/v1/flows \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' \
    -d '{"name":"webhook-formatter-demo"}'
{"data":{"id":"438ba068-5018-49f8-a60e-1018c9450566","name":"Name your flow","active":false,"status":"draft","executionInterval":15,"createdAt":1793160988930,"updatedAt":1793160988930},"meta":{"type":"Flow","count":1,"isArray":false,"currentPage":null,"totalPages":null}}

两个细节:创建请求中的 name 未生效(返回默认名 Name your flow),需要随后 PATCH 改名;响应中 executionInterval: 15 是轮询类触发器的默认间隔(分钟)。改名并查看 flow 自动生成的初始步骤:

$ FLOW=438ba068-5018-49f8-a60e-1018c9450566
$ curl -s -X PATCH http://127.0.0.1:8140/internal/api/v1/flows/$FLOW \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' \
    -d '{"name":"webhook-formatter-demo"}' -o /dev/null -w 'HTTP %{http_code}\n'
HTTP 200
$ curl -s http://127.0.0.1:8140/internal/api/v1/flows/$FLOW -H "Authorization: $TOKEN" | python3 -m json.tool | head -32
{
    "data": {
        "id": "438ba068-5018-49f8-a60e-1018c9450566",
        "name": "webhook-formatter-demo",
        "active": false,
        "status": "draft",
        "executionInterval": 15,
        "createdAt": 1793160988930,
        "updatedAt": 1793160996660,
        "isOwner": true,
        "steps": [
            {
                "id": "e89b9bc3-84d3-460d-a32a-46b843af5eaf",
                "type": "trigger",
                "key": null,
                "name": null,
                "appKey": null,
                "iconUrl": null,
                "webhookUrl": null,
                "status": "incomplete",
                "position": 1,
                "parameters": {}
            },
            {
                "id": "31addb17-ef7b-4a60-9c1e-49ff7a4e7061",
                "type": "action",
                "key": null,
                "name": null,
                "appKey": null,
                "iconUrl": null,
                "webhookUrl": null,
                "status": "incomplete",
                "position": 2,
                "parameters": {}
            }
        ]
    }
}

新 flow 自动带两个空步骤:position 1 的 trigger 与 position 2 的 action,状态 incomplete。后续配置围绕这两个 stepId 展开。

5.2 配置 Webhook 触发器(步骤一)

触发器选内置 webhook 应用的 catchRawWebhook(Catch raw webhook,无需任何第三方凭据):

$ curl -s -X PATCH http://127.0.0.1:8140/internal/api/v1/steps/e89b9bc3-84d3-460d-a32a-46b843af5eaf \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' \
    -d '{"appKey":"webhook","key":"catchRawWebhook","name":"Catch raw webhook","parameters":{"workSynchronously":true}}'
{"data":{"id":"e89b9bc3-84d3-460d-a32a-46b843af5eaf","type":"trigger","key":"catchRawWebhook","name":"Catch raw webhook","appKey":"webhook","iconUrl":"http://localhost:3000/apps/webhook/assets/favicon.svg","webhookUrl":"http://localhost:3000/webhooks/flows/438ba068-5018-49f8-a60e-1018c9450566/sync","status":"incomplete","position":1,"parameters":{"workSynchronously":true}},"meta":{"type":"Step","count":1,"isArray":false,"currentPage":null,"totalPages":null}}

配置成功后系统下发该 flow 的专属触发地址 webhookUrl。注意此处返回的是 http://localhost:3000/...——这正是部署篇第六章排障的场景:对外部署需设 WEBHOOK_URL 让该地址可被外部回调(本实测栈修正后为 http://192.168.146.128:8140/webhooks/flows/438ba068-5018-49f8-a60e-1018c9450566/sync)。参数 workSynchronously: true 表示触发请求同步等待流程执行完再返回,便于端到端验证。

5.3 配置 Formatter 动作(步骤二)

动作选内置 formatter 应用的 text 动作(capitalize 转换,同样零凭据),入参引用触发器收到的 body.message 字段(变量模板 {{step.<triggerStepId>.<字段路径>}}):

$ curl -s -X PATCH http://127.0.0.1:8140/internal/api/v1/steps/31addb17-ef7b-4a60-9c1e-49ff7a4e7061 \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' \
    -d '{"appKey":"formatter","key":"text","name":"Capitalize text","parameters":{"transform":"capitalize","input":"{{step.e89b9bc3-84d3-460d-a32a-46b843af5eaf.body.message}}"}}'
{"data":{"id":"31addb17-ef7b-4a60-9c1e-49ff7a4e7061","type":"action","key":"text","name":"Capitalize text","appKey":"formatter","iconUrl":"http://localhost:3000/apps/formatter/assets/favicon.svg","webhookUrl":null,"status":"incomplete","position":2,"parameters":{"input":"{{step.e89b9bc3-84d3-460d-a32a-46b843af5eaf.body.message}}","transform":"capitalize"}},"meta":{"type":"Step","count":1,"isArray":false,"currentPage":null,"totalPages":null}}

两步配置完成。此时 flow 仍是草稿(active: false),直接激活会被 422 拒绝(见 5.4 排障实录)。

5.4 激活 flow(含 422 排障实录)

直接激活的真实回显:

$ curl -s -X PATCH http://127.0.0.1:8140/internal/api/v1/flows/$FLOW/status \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' -d '{"active":true}'
{"errors":{"flow":["All steps should be completed before updating flow status!"]},"meta":{"type":"incompleteStepsError"}}

HTTP 422,原因 incompleteStepsError:步骤虽已配置参数,但状态仍是 incomplete——每个步骤必须先「测试通过」或显式跳过测试(Continue without test)才算完成。对两个步骤依次调用跳过测试接口:

$ for STEP in e89b9bc3-84d3-460d-a32a-46b843af5eaf 31addb17-ef7b-4a60-9c1e-49ff7a4e7061; do
>   curl -s -X POST http://127.0.0.1:8140/internal/api/v1/steps/$STEP/continue-without-test \
>     -H "Authorization: $TOKEN" -H 'Content-Type: application/json' -d '{}' -o /dev/null -w "step $STEP: HTTP %{http_code}\n"
> done
step e89b9bc3-84d3-460d-a32a-46b843af5eaf: HTTP 200
step 31addb17-ef7b-4a60-9c1e-49ff7a4e7061: HTTP 200
$ curl -s -X PATCH http://127.0.0.1:8140/internal/api/v1/flows/$FLOW/status \
    -H "Authorization: $TOKEN" -H 'Content-Type: application/json' -d '{"active":true}' \
    | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print('active:', d['active'], '| status:', d['status'])"
active: True | status: published

激活成功,flow 从 draft 进入 published。发布激活是一个容易踩坑的幂等点:任何步骤后续被修改回 incomplete 后,需要重新走一遍测试/跳过流程才能再次发布。

5.5 触发执行

向触发地址 POST 数据(同步模式,请求挂起至流程执行完成):

$ curl -s -X POST http://127.0.0.1:8140/webhooks/flows/$FLOW/sync \
    -H 'Content-Type: application/json' \
    -d '{"message":"hello automatisch from quzuo"}' -w '\nHTTP %{http_code}\n'

HTTP 204

HTTP 204 表示已受理(同步模式下流程执行完成但不回传执行数据——raw webhook 触发器的同步响应体为空)。连续触发多次以积累执行记录。

5.6 执行记录与数据回放

$ curl -s "http://127.0.0.1:8140/internal/api/v1/executions?flowId=$FLOW" -H "Authorization: $TOKEN" \
  | python3 -c "
import json,sys
d=json.load(sys.stdin)['data']
print('executions:', len(d))
for e in d: print(e['id'][:8], 'status:', e['status'], 'testRun:', e['testRun'])"
executions: 3
6934870a status: success testRun: False
0de09edb status: success testRun: False
a7d87e63 status: success testRun: True

三条执行记录全部 success。testRun 字段是值得注意的机制细节:a7d87e63 产生于 flow 激活之前的触发(草稿态的 webhook 请求被记为测试执行),后两条产生于激活后(正式执行)。也就是说草稿态 flow 收到 webhook 并不会报错丢弃,而是以测试语义执行并留痕——排障时可用 testRun 区分测试流量与生产流量。

查单次执行的逐步数据(以 6934870a 为例):

$ EXEC=6934870a-c118-4570-88fc-643d9fb92f5e
$ curl -s "http://127.0.0.1:8140/internal/api/v1/executions/$EXEC/execution-steps" -H "Authorization: $TOKEN" \
  | python3 -c "
import json,sys
for s in json.load(sys.stdin)['data']:
    print('==', s['step']['name'], '| status:', s['status'])
    print('   dataIn :', json.dumps(s['dataIn'], ensure_ascii=False))
    print('   dataOut:', json.dumps(s['dataOut'], ensure_ascii=False))"
== Catch raw webhook | status: success
   dataIn : {"workSynchronously": true}
   dataOut: {"body": {"message": "second execution test"}, "query": {}, "headers": {"host": "127.0.0.1:8140", "accept": "*/*", "user-agent": "curl/8.5.0", "content-type": "application/json", "content-length": "35"}}
== Capitalize text | status: success
   dataIn : {"input": "second execution test", "transform": "capitalize"}
   dataOut: {"output": "Second Execution Test"}

端到端链路完全验证:触发器步骤 dataOut.body 完整回放了 webhook 请求(body/query/headers),动作步骤把变量模板解析后的 second execution test 经 capitalize 转换输出 Second Execution Test——变量引用 {{step.<id>.body.message}} 的解析、Formatter 转换、执行留痕三环节全部工作正常。

六、备份与恢复实测

备份对象是三个数据卷(卷名中的 . 已被 Compose 规范化为 -,见部署篇第五章):

$ docker volume ls --format '{{.Name}}' | grep automatisch
automatisch-0150-stack_automatisch_storage
automatisch-0150-stack_postgres_data
automatisch-0150-stack_redis_data

三卷的备份价值分级:postgres_data 是唯一必选项(全部业务数据);storage 卷在镜像方式部署下为空、仓库源码方式下存密钥 .env(备份价值随部署方式而定);redis_data 存队列瞬时状态,不值得备份(重启后由 PostgreSQL 中的 flow 定义重建语义)。

6.1 逻辑备份(推荐日常使用)

$ docker exec automatisch-0.15.0-postgres pg_dump -U automatisch_user -d automatisch > automatisch_pg_$(date +%Y%m%d).sql
$ ls -la automatisch_pg_20261028.sql
-rw-r--r-- 1 root root 46353 Oct 28 12:19 automatisch_pg_20261028.sql
$ head -5 automatisch_pg_20261028.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 14.5 (Debian 14.5-2.pgdg110+2)

46 KB 的纯 SQL(含建表与全部数据)。恢复到全新库:cat automatisch_pg_20261028.sql | docker exec -i automatisch-0.15.0-postgres psql -U automatisch_user -d automatisch(目标库需先建空库;跨大版本恢复前先核对 pg_dump 与目标库版本兼容性)。

密钥与备份的绑定关系:备份 SQL 中的凭据是 ENCRYPTION_KEY 加密后的密文,恢复时必须使用同一把密钥——把编排文件(含密钥)与 SQL 备份纳入同一恢复单元管理,否则恢复出的实例打不开任何连接。

6.2 物理快照(配合停机窗口)

$ docker run --rm -v automatisch-0150-stack_postgres_data:/data \
    -v /opt/backup:/backup alpine tar czf /backup/postgres-volume.tgz -C /data .
$ docker run --rm -v automatisch-0150-stack_automatisch_storage:/data \
    -v /opt/backup:/backup alpine tar czf /backup/storage-volume.tgz -C /data .
$ ls -la /opt/backup/
-rw-r--r-- 1 root root 46353 Oct 28 12:19 automatisch_pg_20261028.sql
-rw-r--r-- 1 root root 6756596 Oct 28 12:19 postgres-volume.tgz
-rw-r--r-- 1 root root      87 Oct 28 12:19 storage-volume.tgz

postgres 卷快照 6.7 MB、storage 卷 87 字节(空卷的印证)。物理快照要求一致性问题:运行中对 postgres 数据目录打 tar 存在文件级不一致风险,严格做法是先 docker compose stop main worker(停应用写入)再快照,或直接采用 6.1 的 pg_dump(逻辑一致性天然保证)——生产日常备份以 pg_dump 为主,物理快照仅用于迁移整栈。

七、常用排障速查(FAQ)

Q1:worker 就绪但 flow 不执行? 按链路查:① flow 是否 published(GET /internal/api/v1/flows/<id> 看 active 字段,草稿态触发只记 testRun);② Redis 是否可达(docker exec automatisch-0.15.0-redis redis-cli ping);③ BullMQ 仪表盘 flow 队列是否堆积(waiting 增长 = worker 消费异常)。本次实测中三处均正常。

Q2:激活 flow 报 422 incompleteStepsError? 所有步骤先「测试通过」或「Continue without test」(POST /internal/api/v1/steps/<stepId>/continue-without-test)置为 completed 再激活(5.4 节实录)。

Q3:webhook 外部系统调不通? 查触发地址的实际形态:GET /internal/api/v1/flows/<id> 看 trigger 的 webhookUrl。若是 http://localhost:3000/...,设置 WEBHOOK_URL(main+worker 双侧)后重建并让系统重新下发地址(部署篇第六章实录);若地址正确但外部不可达,查端口映射与防火墙。

Q4:登录接口返回什么算成功?token 失效什么表现? POST /internal/api/v1/access-tokens 返回 {"data":{"token":"..."}} 即成功;token 失效时内部 API 一律 401 空响应体,重新换发即可。

Q5:公开 API 404 是故障吗? 不是。0.15.0 社区版无商业许可时 /api/v1/* 全部 404(企业版守卫,第四章实测),只有 /internal/api/v1/* 可用。排查公开 API 前先确认手上有有效企业许可。

Q6:如何区分测试执行与正式执行? 执行记录的 testRun 字段(5.6 节实录):激活前的触发记为 true,激活后为 false。界面上对应「Test run」与正式执行两类历史。

八、参考链接

  1. 官方安装文档(双进程模型与密钥警示):https://automatisch.io/docs/guide/installation (查询日期 2026-10-28)
  2. 官方配置文档(LOG_LEVEL/仪表盘变量):https://automatisch.io/docs/advanced/configuration (查询日期 2026-10-28)
  3. 内部 API 路由源码(本文接口路径的权威依据):https://github.com/automatisch/automatisch/tree/main/packages/backend/src/routes/internal/api/v1
  4. 本专栏配套篇:《Automatisch 介绍与选型指南》、《Automatisch Docker Compose 部署实战》、《Automatisch 配置参数详解》