管理员
收集备份 - /api/backups/collect
-
端点:
/api/backups/collect -
方法: POST
-
描述: 通过 API 直接从 Duplicati 服务器收集备份数据。此端点自动检测最佳连接协议(带 SSL 验证的 HTTPS、带自签名证书的 HTTPS 或作为备选的 HTTP),并连接到 Duplicati 服务器以检索备份信息并将其处理到本地数据库中。
-
认证:需要有效的会话和 CSRF 令牌
-
请求体:
{"hostname": "duplicati-server.local","port": 8200,"password": "your-password","downloadJson": false} -
响应:
{"success": true,"serverName": "Server Name","serverAlias": "My Server","stats": {"processed": 5,"skipped": 2,"errors": 0},"backupSettings": {"added": 2,"total": 7}} -
错误响应:
400: 请求参数无效或连接失败500: 备份收集期间发生服务器错误
-
注意事项:
- 端点自动检测最佳连接协议(HTTPS → 带自签名证书的 HTTPS → HTTP)
- 协议检测按安全偏好顺序进行
- 连接超时可通过环境变量配置
- 在开发模式下记录收集的数据用于调试
- 确保所有服务器和备份的备份设置完整
- 如果未指定则使用默认端口 8200
- 检测到的协议和服务器 URL 将自动存储在数据库中
serverAlias从数据库中检索,如果未设置别名则可能为空- 前端应使用
serverAlias || serverName进行显示 - 支持 JSON 下载和直接 API 收集方法
清理备份 - /api/backups/cleanup
-
端点:
/api/backups/cleanup -
方法: POST
-
描述: 根据保留期删除旧备份数据。此端点通过删除过时的备份记录来帮助管理数据库大小,同时保留最近和重要的数据。
-
认证:需要有效的会话和 CSRF 令牌
-
请求体:
{"retentionPeriod": "6 months"} -
保留期:
"6 months","1 year","2 years","Delete all data" -
响应:
{"message": "Successfully deleted 15 old backups","status": 200}
对于“删除所有数据”选项:
{
"message": "Successfully deleted all 15 backups and 3 servers, and cleared configuration settings",
"status": 200
}
- 错误响应:
401: 未授权 - 会话或 CSRF 令牌无效400: 指定的保留期无效500: 清理操作期间发生服务器错误,包含详细错误信息
- 注意事项:
- 清理操作不可逆
- 备份数据将从数据库中永久删除
- 即使删除了所有备份,机器记录也会被保留
- 当选择“删除所有数据”时,所有机器和备份都将被移除且配置被清除
- 增强的错误报告在开发模式下包含详细信息和堆栈跟踪
- 支持基于时间的保留和完全数据删除
删除备份任务 - /api/backups/delete-job
-
端点:
/api/backups/delete-job -
方法: DELETE
-
描述: 删除特定服务器-备份组合的所有备份记录。此端点仅在开发模式下可用。
-
认证:需要有效的会话和 CSRF 令牌
-
请求体:
{"serverId": "server-id","backupName": "Backup Name"} -
响应:
{"message": "Successfully deleted 5 backup record(s) for \"Files\" from server \"My Server\"","status": 200,"deletedCount": 5,"serverName": "My Server","backupName": "Files"} -
错误响应:
401: 未授权 - 会话或 CSRF 令牌无效403: 备份任务删除仅在开发模式下可用400: 需要服务器 ID 和备份名称404: 未找到要删除的备份500: 删除期间发生服务器错误,包含详细错误信息
-
注意事项:
- 此操作仅在开发模式下可用
- 此操作不可逆
- 指定服务器-备份组合的所有备份记录将被永久删除
- 返回已删除备份的数量和服务器信息
- 如有可用则使用服务器别名进行显示,否则回退到服务器名称
同步备份计划 - /api/backups/sync-schedule
-
端点:
/api/backups/sync-schedule -
方法:POST
-
描述:从 Duplicati 服务器同步备份计划信息。此端点连接到服务器,检索所有备份的计划信息,并使用计划详细信息更新本地备份设置,包括重复间隔、允许的星期几和计划时间。
-
认证:需要有效的会话和 CSRF 令牌
-
请求体:
{"hostname": "duplicati-server.local","port": 8200,"password": "your-password","serverId": "optional-server-id"}
或仅使用 serverId(使用存储的密码):
{
"serverId": "server-id"
}
或使用 serverId 和更新的凭据:
{
"serverId": "server-id",
"hostname": "new-hostname.local",
"port": 8200,
"password": "new-password"
}
-
响应:
{"success": true,"serverName": "Server Name","stats": {"processed": 5,"errors": 0}}
出现错误时:
{
"success": true,
"serverName": "Server Name",
"stats": {
"processed": 3,
"errors": 2
},
"errors": [
"Backup Name 1: Error message",
"Backup Name 2: Error message"
]
}
- 错误响应:
400:无效的请求参数,未提供 serverId 时缺少主机名/密码,或连接失败404:未找到服务器(提供 serverId 时)或服务器没有存储密码500:计划同步期间服务器错误
- 备注:
- 端点自动检测最佳连接协议(HTTPS → 自签名 HTTPS → HTTP)
- 可以仅使用 serverId 调用以使用存储的服务器凭据
- 可以使用 serverId 和新凭据调用以更新服务器连接详情
- 可以使用 hostname/port/password 而不带 serverId 调用用于新服务器
- 使用计划信息更新备份设置,包括:
expectedInterval:重复间隔(例如,"每日"、"每周"、"每月")allowedWeekDays:允许的星期几数组(0=星期日,1=星期一,等等)time:备份的计划时间
- 处理服务器上找到的所有备份
- 返回处理的备份统计信息和遇到的任何错误
- 为成功和失败的同步操作记录审计事件
- 如果未指定则使用默认端口 8200
测试服务器连接 - /api/servers/test-connection
-
端点:
/api/servers/test-connection -
方法:POST
-
描述:测试与 Duplicati 服务器的连接以验证其可访问性。
-
请求体:
{"server_url": "http://localhost:8200"} -
响应:
{"success": true,"message": "Connection successful"} -
错误响应:
400:无效的 URL 格式或缺少服务器 URL500:连接测试期间服务器错误
-
备注:
- 端点验证 URL 格式并测试连接性
- 如果服务器以 401 状态响应(登录端点在无凭据情况下预期的状态),则返回成功
- 测试与 Duplicati 服务器登录端点的连接
- 支持 HTTP 和 HTTPS 协议
- 使用超时配置进行连接测试
获取服务器 URL - /api/servers/:serverId/server-url
-
端点:
/api/servers/:serverId/server-url -
方法:GET
-
描述:检索特定服务器的服务器 URL。
-
参数:
serverId:服务器标识符
-
响应:
{"serverId": "server-id","server_url": "http://localhost:8200"} -
错误响应:
404:未找到服务器500:服务器错误
-
备注:
- 返回特定服务器的服务器 URL
- 用于服务器连接管理
- 如果未设置服务器 URL 则返回空字符串
更新服务器 URL - /api/servers/:serverId/server-url
-
端点:
/api/servers/:serverId/server-url -
方法:PATCH
-
描述:更新特定服务器的服务器 URL。
-
身份验证:需要有效的会话和 CSRF 令牌
-
参数:
serverId:服务器标识符
-
请求体:
{"server_url": "http://localhost:8200"} -
响应:
{"message": "Server URL updated successfully","serverId": "server-id","serverName": "Server Name","server_url": "http://localhost:8200"} -
错误响应:
401:未授权 - 无效的会话或 CSRF 令牌400:无效的 URL 格式404:未找到服务器500:更新期间服务器错误
-
备注:
- 端点在更新前验证 URL 格式
- 允许空或 null 的服务器 URL
- 支持 HTTP 和 HTTPS 协议
- 返回更新的服务器信息
获取服务器密码 - /api/servers/:serverId/password
-
端点:
/api/servers/:serverId/password -
方法:GET
-
描述:检索用于服务器密码操作的 CSRF 令牌。
-
身份验证:需要有效的会话
-
参数:
serverId:服务器标识符
-
响应:
{"csrfToken": "csrf-token-string","serverId": "server-id"} -
错误响应:
401: 会话无效或已过期500: 生成 CSRF 令牌失败
-
备注:
- 返回用于密码更新操作的 CSRF 令牌
- 会话必须有效才能生成令牌
更新服务器密码 - /api/servers/:serverId/password
-
端点:
/api/servers/:serverId/password -
方法:PATCH
-
描述:更新特定服务器的密码。
-
身份验证:需要有效的会话和 CSRF 令牌
-
参数:
serverId:服务器标识符
-
请求体:
{"password": "new-password"} -
响应:
{"message": "Password updated successfully","serverId": "server-id"} -
错误响应:
400:密码必须为字符串401:未授权 - 会话或 CSRF 令牌无效500:更新密码失败
-
备注:
- 密码可以为空字符串以清除密码
- 密码使用密钥管理系统安全存储
用户管理
列出用户 - /api/users
-
端点:
/api/users -
方法:GET
-
描述:列出所有用户,支持分页和可选的搜索过滤。返回用户信息,包括登录历史和账户状态。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
查询参数:
page(可选):页码(默认:1)limit(可选):每页项目数(默认:50)search(可选):按用户名过滤的搜索词
-
响应:
{"users": [{"id": "user-id","username": "admin","isAdmin": true,"accessAllServers": true,"serverIds": [],"mustChangePassword": false,"createdAt": "2024-01-01T00:00:00Z","lastLoginAt": "2024-01-15T10:30:00Z","lastLoginIp": "192.168.1.100","failedLoginAttempts": 0,"lockedUntil": null,"isLocked": false}],"pagination": {"page": 1,"limit": 50,"total": 5,"totalPages": 1}} -
错误响应:
401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限500:内部服务器错误
-
备注:
- 仅管理员用户可访问
- 支持分页和搜索过滤
- 返回用户账户状态,包括锁定状态
创建用户 - /api/users
-
端点:
/api/users -
方法:POST
-
描述:创建新用户账户。可以生成临时密码或使用提供的密码。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
请求体:
{"username": "newuser","password": "optional-password","isAdmin": false,"requirePasswordChange": true,"accessAllServers": false,"serverIds": ["server-id"]} -
username:必填,长度必须为 3-50 个字符,且唯一password:选填,若未提供,将生成安全的临时密码isAdmin:选填,默认值为 false。管理员用户始终接收所有服务器requirePasswordChange:选填,默认值为 trueaccessAllServers:选填,默认值为 true。当为 false 时,serverIds是该用户能看到的唯一服务器集合serverIds:选填,现有服务器 ID 数组。未知的 ID 将被拒绝。当用户为管理员或accessAllServers不为 false 时,此参数将被忽略
-
响应:
{"user": {"id": "user-id","username": "newuser","isAdmin": false,"mustChangePassword": true,"accessAllServers": true,"serverIds": []},"temporaryPassword": "generated-password-123"} -
仅在自动生成密码时包含
temporaryPassword -
错误响应:
400:用户名格式无效、密码策略违规或验证错误401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限409:用户名已存在500:内部服务器错误
-
备注:
- 仅管理员用户可访问
- 用户名不区分大小写并以小写形式存储
- 如未提供密码,则生成安全的 12 字符密码
- 生成的临时密码仅在响应中返回一次
- 用户创建记录到审计日志
更新用户 - /api/users/:id
-
端点:
/api/users/:id -
方法:PATCH
-
描述:更新用户信息,包括用户名、管理员状态、密码更改要求和密码重置。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
参数:
id:要更新的用户 ID
-
请求体:
{"username": "updated-username","isAdmin": true,"requirePasswordChange": false,"resetPassword": true,"password": "optional-custom-password","accessAllServers": false,"serverIds": ["server-id"]} -
所有字段均为选填
accessAllServers和serverIds:与创建时的规则相同。将用户提升为管理员会存储所有服务器访问权限。将管理员降级时,除非在同一请求中发送自定义列表,否则将重新从所有服务器开始resetPassword:如果为 true,则设置新密码。提供password时,将在策略检查后使用。省略password时,将生成临时密码requirePasswordChange:与resetPassword一起使用时,默认值为 true。发送false以清除必须更改密码的标志
-
响应(包含密码重置):
{"user": {"id": "user-id","username": "updated-username","isAdmin": true,"mustChangePassword": true,"accessAllServers": true,"serverIds": []},"temporaryPassword": "new-temp-password-456"} -
响应(不含密码重置):
{"user": {"id": "user-id","username": "updated-username","isAdmin": true,"mustChangePassword": false,"accessAllServers": true,"serverIds": []}} -
错误响应:
400:无效输入或验证错误401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限404:用户未找到409:用户名已存在(如果更改用户名)500:内部服务器错误
-
注意事项:
- 仅限管理员用户访问
- 更改用户名时会验证唯一性
- 省略重置密码时,将生成安全的 12 字符临时密码,仅返回一次
- 提供的重置密码必须符合密码策略,且不会返回
- 所有更改均会记录到审计日志中
删除用户 - /api/users/:id
-
端点:
/api/users/:id -
方法:DELETE
-
描述:删除用户账户。防止删除您自己或最后一个管理员账户。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
参数:
id:要删除的用户 ID
-
响应:
{"success": true,"message": "User deleted successfully"} -
错误响应:
400:无法删除您自己的账户或最后一个管理员账户401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限404:用户未找到500:内部服务器错误
-
注意事项:
- 仅管理员用户可访问
- 无法删除您自己的账户
- 无法删除最后一个管理员账户(必须至少保留一个管理员)
- 用户删除操作会记录到审计日志
- 相关会话将自动删除(级联)
审计日志管理
列出审计日志 - /api/audit-log
-
端点:
/api/audit-log -
方法:GET
-
描述:检索审计日志条目,支持过滤、分页和搜索功能。支持基于页面和基于偏移量的分页。
-
身份验证:需要有效会话和 CSRF 令牌(需要登录用户)
-
查询参数:
page(可选):基于页面分页的页码offset(可选):基于偏移量分页的偏移量(优先于页码)limit(可选):每页项目数(默认值:50)startDate(可选):从此日期开始筛选日志(ISO 格式)endDate(可选):到此日期结束筛选日志(ISO 格式)userId(可选):按用户 ID 筛选username(可选):按用户名筛选action(可选):按操作名称筛选category(可选):按类别筛选(auth、user_management、config、backup、server)status(可选):按状态筛选(success、failure、error)
-
响应:
{"logs": [{"id": 1,"timestamp": "2024-01-15T10:30:00Z","userId": "user-id","username": "admin","action": "login","category": "auth","targetType": "user","targetId": "user-id","status": "success","ipAddress": "192.168.1.100","userAgent": "Mozilla/5.0...","details": {"is_admin": true},"errorMessage": null}],"pagination": {"page": 1,"limit": 50,"total": 150,"totalPages": 3}} -
错误响应:
401:未授权 - 会话或 CSRF 令牌无效500:内部服务器错误
-
注意事项:
- 支持基于页面(
page)和基于偏移量(offset)的分页 details字段包含带附加上下文的解析 JSON- 所有审计日志查询都会被记录
- 支持基于页面(
获取审计日志筛选值 - /api/audit-log/filters
-
端点:
/api/audit-log/filters -
方法:GET
-
描述:检索可用于筛选审计日志的唯一筛选值。返回审计日志数据库中存在的所有不同操作、类别和状态。用于在 UI 中填充筛选下拉列表。
-
身份验证:需要有效会话和 CSRF 令牌(需要登录用户)
-
响应:
{"actions": ["login","logout","user_created","user_updated","config_updated"],"categories": ["auth","user_management","config","backup","server"],"statuses": ["success","failure","error"]} -
错误响应:
401:未授权 - 会话或 CSRF 令牌无效500:内部服务器错误
-
注意事项:
- 返回审计日志数据库中的唯一值数组
- 值按字母顺序排序
- 如果不存在数据或发生错误,则返回空数组
- 由审计日志查看器使用,以动态填充筛选下拉列表
下载审计日志 - /api/audit-log/download
- 端点:
/api/audit-log/download - 方法:GET
- 描述:以 CSV 或 JSON 格式下载审计日志,并支持可选的筛选。用于外部分析和报告。
- 身份验证:需要有效的会话和 CSRF 令牌(需要登录用户)
- 查询参数:
format(可选):导出格式 -csv或json(默认值:csv)startDate(可选):从此日期开始筛选日志(ISO 格式)endDate(可选):到此日期结束筛选日志(ISO 格式)userId(可选):按用户 ID 过滤username(可选):按用户名过滤action(可选):按操作名称过滤category(可选):按类别过滤status(可选):按状态过滤
- 响应(CSV):
- Content-Type:
text/csv - Content-Disposition:
attachment; filename="audit-log-YYYY-MM-DD.csv" - 带有标题的 CSV 文件:ID、时间戳、用户 ID、用户名、操作、类别、目标类型、目标 ID、状态、IP 地址、用户代理、详细信息、错误消息
- Content-Type:
- 响应(JSON):
- Content-Type:
application/json - Content-Disposition:
attachment; filename="audit-log-YYYY-MM-DD.json" - 审计日志条目的 JSON 数组
- Content-Type:
- 错误响应:
400:没有要导出的日志401:未授权 - 无效会话或 CSRF 令牌500:内部服务器错误
- 注意事项:
- 导出限制为 10,000 条记录
- CSV 格式正确转义特殊字符
- CSV 中的详细信息字段是 JSON 字符串化
- 文件名包含当前日期
清理审计日志 - /api/audit-log/cleanup
-
端点:
/api/audit-log/cleanup -
方法:POST
-
描述:根据保留期限手动触发旧审计日志的清理。支持预演模式以预览将要删除的内容。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
请求体:
{"retentionDays": 90,"dryRun": false} -
retentionDays(可选):覆盖保留天数(30-365),否则使用已配置的值dryRun(可选):如果为 true,则仅返回将要删除的内容而不实际删除
-
响应(预演):
{"dryRun": true,"wouldDeleteCount": 50,"oldestRemaining": "2024-01-01T00:00:00Z","retentionDays": 90,"cutoffDate": "2024-01-01"} -
响应(实际清理):
{"success": true,"deletedCount": 50,"oldestRemaining": "2024-01-01T00:00:00Z","retentionDays": 90} -
错误响应:
400:无效保留天数(必须为 30-365)401:未授权 - 无效会话或 CSRF 令牌403:禁止访问 - 需要管理员权限500:内部服务器错误
-
注意事项:
- 仅对管理员用户可访问
- 如果未配置,默认保留期为 90 天
- 清理操作记录到审计日志
- 预演模式对于预览清理影响很有用
获取审计日志保留期 - /api/audit-log/retention
-
端点:
/api/audit-log/retention -
方法:GET
-
描述:检索当前审计日志保留配置(以天为单位)。
-
身份验证:需要有效的会话和 CSRF 令牌(不需要登录用户)
-
响应:
{"retentionDays": 90} -
错误响应:
500:内部服务器错误
-
注意事项:
- 如果未配置,默认保留期为 90 天
- 可以在无需身份验证的情况下访问(只读)
更新审计日志保留期 - /api/audit-log/retention
-
端点:
/api/audit-log/retention -
方法:PATCH
-
描述:更新审计日志保留期限(以天为单位)。此设置确定审计日志在自动清理前保存多长时间。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
请求体:
{"retentionDays": 120} -
retentionDays:必需,必须在 30 到 365 天之间 -
响应:
{"success": true,"retentionDays": 120} -
错误响应:
400:无效保留天数(必须为 30-365)401:未授权 - 无效会话或 CSRF 令牌403:禁止访问 - 需要管理员权限500:内部服务器错误
-
注意事项:
- 仅对管理员用户可访问
- 配置更改记录到审计日志
- 保留期限影响自动和手动清理操作
API 密钥
列出 API 密钥 - /api/api-keys
- 端点:
/api/api-keys - 方法:GET
- 描述:列出所有 API 密钥。永远不会返回密钥;每个密钥都包含一个指纹(
Qk7v…3xTa)。 - 身份验证:需要管理员权限、有效会话和 CSRF 令牌
- 错误响应:
401:未授权 - 无效会话或 CSRF 令牌403:禁止访问 - 需要管理员权限500:内部服务器错误
创建 API 密钥 - /api/api-keys
-
端点:
/api/api-keys -
方法:POST
-
描述:创建一个作用域 API 密钥。明文密钥仅在此响应中返回。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
请求体:
{"name": "Duplicati uploads","scope": "upload","description": "Optional","expiresAt": null} -
错误响应:
400:缺少名称或无效作用域(upload或read)401:未授权 - 无效会话或 CSRF 令牌403:禁止访问 - 需要管理员权限500:内部服务器错误
更新 API 密钥 - /api/api-keys/:id
- 端点:
/api/api-keys/:id - 方法:PATCH
- 描述:启用或禁用密钥。
- 身份验证: 需要管理员权限、有效会话和CSRF令牌
删除 API 密钥 - /api/api-keys/:id
- 端点:
/api/api-keys/:id - 方法:DELETE
- 描述:删除密钥。使用该密钥的现有客户端立即失去访问权限。
- 身份验证: 需要管理员权限、有效会话和CSRF令牌
数据库管理
备份数据库 - /api/database/backup
- 端点:
/api/database/backup - 方法:GET
- 描述:以二进制(.db)或 SQL(.sql)格式创建数据库备份。备份文件将自动下载,并带有时间戳文件名。
- 身份验证:需要管理员权限、有效会话和 CSRF 令牌
- 查询参数:
format(可选):备份格式 -db(二进制)或sql(SQL 转储)。默认值:db
- 响应:
- Content-Type:
application/octet-stream(用于 .db)或text/plain(用于 .sql) - Content-Disposition:
attachment; filename="duplistatus-backup-YYYY-MM-DDTHH-MM-SS.db"或.sql - 二进制文件内容(用于 .db)或 SQL 文本内容(用于 .sql)
- Content-Type:
- 错误响应:
400:无效格式(必须是 "db" 或 "sql")401:未授权 - 无效会话或 CSRF 令牌403:禁止访问 - 需要管理员权限500:创建数据库备份失败
- 备注:
- 仅管理员用户可访问
- 二进制格式使用 SQLite 的备份方法确保完整性
- SQL 格式创建所有数据库内容的文本转储
- 文件名中的时间戳使用服务器本地时区
- 备份操作记录到审计日志
- 下载后临时文件自动清理
恢复数据库 - /api/database/restore
-
端点:
/api/database/restore -
方法:POST
-
描述:从备份文件(.db 或 .sql 格式)恢复数据库。恢复前创建安全备份,恢复后清除所有会话以确保安全。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
请求体:包含名为
database的文件字段的 FormData- 文件必须是
.db、.sqlite、.sqlite3(二进制格式)或.sql(SQL 格式) - 最大文件大小: 200MB
- 文件必须是
-
响应:
{"success": true,"message": "Database restored successfully from DB file","safetyBackupPath": "duplistatus-backup-YYYY-MM-DDTHH-MM-SS.db","requiresReauth": true} -
错误响应:
400:未提供文件、文件大小超过限制、无效的文件格式或数据库完整性检查失败401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限500:恢复数据库失败(如果恢复失败,将从安全备份中还原原始数据库)
-
注意事项:
- 仅管理员用户可访问
- 在恢复前自动创建安全备份
- 支持二进制(.db)和 SQL(.sql)格式
- 恢复后验证数据库完整性
- 如果恢复失败,自动从安全备份恢复
- 成功恢复后清除所有会话以确保安全
- 返回
requiresReauth: true表示用户需要重新登录 - 恢复操作记录到审计日志
- 对于 SQL 格式,在执行前验证 SQL 内容
- 恢复后重新初始化数据库连接
- 恢复后使所有缓存失效
备份时间戳
获取最后备份时间戳 - /api/backups/last-timestamps
-
端点:
/api/backups/last-timestamps -
方法:GET
-
描述:检索每个服务器-备份组合的最后备份时间戳。返回映射以便轻松查找。
-
身份验证:需要有效的会话和 CSRF 令牌
-
响应:
{"timestamps": {"server-id-1:Backup Name 1": "2024-03-20T10:00:00Z","server-id-1:Backup Name 2": "2024-03-20T11:00:00Z","server-id-2:Backup Name 1": "2024-03-20T12:00:00Z"},"raw": [{"server_name": "Server Name","server_id": "server-id-1","backup_name": "Backup Name 1","date": "2024-03-20T10:00:00Z"}]} -
错误响应:
401:未授权 - 会话或 CSRF 令牌无效500:获取最后备份时间戳失败
-
注意事项:
- 返回映射(便于通过
server_id:backup_name轻松查找)和原始数组格式 - 包含缓存控制头以防止缓存
- 用于跟踪所有服务器-备份组合的最后备份时间
- 时间戳采用 ISO 格式
- 返回映射(便于通过
应用程序日志管理
获取应用程序日志 - /api/application-logs
-
端点:
/api/application-logs -
方法:GET
-
描述:从日志文件检索应用程序日志条目。支持读取当前日志文件和轮转的日志文件,并具有尾部功能。
-
身份验证:需要管理员权限、有效会话和 CSRF 令牌
-
查询参数:
file(可选):要读取的日志文件名 -application.log、application.log.1、application.log.2等。如果不提供,则返回可用文件列表tail(可选):从文件末尾返回的行数(默认值:1000,最小值:1,最大值:10000)
-
响应(带文件参数):
{"logs": "log content as string...","fileSize": 1024000,"lastModified": "2024-03-20T10:00:00Z","lineCount": 5000,"currentFile": "application.log","availableFiles": ["application.log", "application.log.1", "application.log.2"]} -
响应(不带文件参数):
{"logs": "","fileSize": 0,"lastModified": "2024-03-20T10:00:00Z","lineCount": 0,"currentFile": "","availableFiles": ["application.log", "application.log.1", "application.log.2"]} -
错误响应:
400:无效的 tail 参数(必须是 1-10000)或无效的文件参数格式401:未授权 - 会话或 CSRF 令牌无效403:禁止 - 需要管理员权限404:找不到日志文件500:读取日志文件失败
-
注意事项:
- 仅管理员用户可访问
- 支持读取当前日志文件和轮转的日志文件(最多 10 个轮转文件)
- 从指定的日志文件返回最后 N 行(tail)
- 日志文件名由环境变量确定(默认值:
application.log) - 当未提供文件参数时返回可用日志文件列表
- 验证文件名以防止目录遍历攻击
- 轮转文件按顺序编号(
.1、.2等)
导出应用程序日志 - /api/application-logs/export
- 端点:
/api/application-logs/export - 方法:GET
- 描述:以过滤的文本格式导出应用程序日志条目。支持按日志级别和搜索字符串进行过滤。
- 身份验证:需要管理员权限、有效会话和 CSRF 令牌
- 查询参数:
file(必需):要导出的日志文件名 -application.log、application.log.1、application.log.2等logLevels(可选):包含日志级别的逗号分隔列表 -INFO、WARN、ERROR(默认值:INFO,WARN,ERROR)search(可选):用于筛选日志行的搜索字符串(不区分大小写)
- 响应:
- Content-Type:
text/plain - Content-Disposition:
attachment; filename="duplistatus-logs-YYYY-MM-DDTHH-MM-SS.txt" - 过滤后的日志内容为纯文本
- Content-Type:
- 错误响应:
400:文件参数为必填项或文件参数格式无效401:未授权 - 会话或 CSRF 令牌无效403:禁止访问 - 需要管理员权限500:导出日志失败
- 注意事项:
- 仅管理员用户可访问
- 根据日志级别和搜索条件导出过滤的日志条目
- 支持按日志级别过滤:
INFO、WARN、ERROR - 搜索字符串筛选不区分大小写
- 自动过滤空行
- 日志文件名由环境变量确定(默认值:
application.log) - 验证文件名以防止目录遍历攻击
- 导出的文件在文件名中包含时间戳
- 适用于外部分析和故障排除