SeedDMS 6.0.42 常用 CLI 命令与工具详解

SeedDMS 6.0.42 两代命令行体系实测:Symfony console dms/cache/ext 命令族逐项回显、传统 seeddms-* 工具与 cron 调度、REST API curl 速查,含 6.0.42 删除/建柜/导入缺陷绕行。

SeedDMSSeedDMSCLI命令2026/11/02

SeedDMS 6.0.42 常用 CLI 命令与工具详解

目标:系统讲清 SeedDMS 6.0.42 的两代命令行体系——基于 Symfony Console 的 dms:* / cache:* / ext:* 命令族与 utils/ 下传统 seeddms-* 脚本工具,全部命令与回显取自 seeddms-server(Ubuntu 24.04.5 LTS + PHP 8.3.6 + MariaDB 10.11.14,SeedDMS 6.0.42 quickstart 布局 /var/www/seeddms60x)实测,并沉淀 6.0.42 命令行工具链的多则真实缺陷记录;文末附 REST API 的 curl 实测速查。

一、环境信息

  • 操作系统:Ubuntu 24.04.5 LTS;主机名 seeddms-server,站点 http://seeddms-server/
  • 应用:SeedDMS 6.0.42(SourceForge quickstart 分发包,发布于 2026-10-23),部署根 /var/www/seeddms60x
  • 目录布局:seeddms(软链 → seeddms-6.0.42,内含 utils/、inc/)、vendor/(composer 依赖)、conf/settings.xml、data/(内容库/索引/缓存)、www/(文档根)
  • 数据库:MariaDB 10.11.14,库/账号 seeddms/seeddms(密码 q1w2e3r4,演示值)
  • 管理账号:admin / q1w2e3r4
  • 全文引擎:sqlitefts(data/content.db)
  • 本文实测基线数据:根柜 DMS(id=1) 下 Archive(id=2)、Invoices(id=3),文档 Contract Demo 2026 (signed)(id=1)、Probe Doc CLI(id=2)

二、前置条件

  1. 已按 《Ubuntu 24.04 安装 SeedDMS 6.0.42 指南》 完成部署,conf/settings.xml 已由安装向导生成;
  2. 命令行操作建议切到应用根目录执行,console 统一入口为:
cd /var/www/seeddms60x
php seeddms/utils/console <命令>
  1. 传统 seeddms-* 工具涉及文件写入内容库,官方 utils/README.md 明确警告应与 Web 服务运行用户同权执行(原文:"If you run seeddms-adddoc make sure to run it with the permissions of the user running your web server"),且这些脚本不做任何认证、全部以管理员身份运行("None of the scripts do any authentication. They all run with a SeedDMS admin account!"),务必只允许 root/运维人员在服务器本机执行;
  2. 建议先设置 baseUrl(避免 CLI 场景的 HTTP_HOST 警告噪音,见 《SeedDMS 6.0.42 配置参数详解》 3.3 节)。

三、命令体系总览

SeedDMS 6.0.42 的命令行由两代工具并存:

体系入口命令形态配置来源
Symfony Console(新)php seeddms/utils/consoledms:*、cache:*、ext:* 三组 16 个子命令恒读默认 conf/settings.xml
传统工具(旧)utils/seeddms-* 包装脚本seeddms-indexer、seeddms-adddoc 等 10 余个--config / SEEDDMS_CONFIG_FILE 可切换
REST API(补充)http://seeddms-server/restapi/index.php/...curl 会话/API key 调用同应用配置

console 全量命令清单(实测 php seeddms/utils/console 无参回显节选):

Available commands:
  completion       Dump the shell completion script
  help             Display help for a command
  list             List commands
 cache
  cache:clear      Clear cache
  cache:list       List caches
 dms
  dms:adddocument  Create a new document
  dms:addfolder    Create a new folder
  dms:adduser      Create a new user
  dms:delete       Delete a folder or document
  dms:initdb       Initialize database
  dms:setconfig    Set configuration variable
  dms:stats        Print statistics
 ext
  ext:check        Check extensions
  ext:configure    Configure extension
  ext:download     Download extension from repository
  ext:list         List extensions
  ext:package      Package extension as a zip file
  ext:reload       Reload extensions
  ext:repository   Get list of extensions from repository
  ext:update       Check for extension updates

💡 技术拓展:PHP 应用的 CLI 化两条路线——

路线代表特点
Symfony Console 命令族dms:*/cache:*/ext:*统一入口、结构化选项、--help 自描述
独立 getopt 脚本utils/*.php + seeddms-* 包装历史悠久、参数风格各异、依赖环境变量定位安装路径

SeedDMS 两代并存且行为不完全等价(如配置定位方式),本篇逐条实测标注差异。

四、Symfony Console 命令族详解

4.1 dms:stats:统计速查

最常用的健康检查命令,输出文档/柜/用户计数与人均占用(实测回显):

$ cd /var/www/seeddms60x && php seeddms/utils/console dms:stats
+-----------------------+------------+
| Name                  | Count/Size |
+-----------------------+------------+
| docs                  | 2          |
| folders               | 3          |
| users                 | 2          |
| groups                | 0          |
| categories            | 0          |
+-----------------------+------------+
| Documents per user                 |
+-----------------------+------------+
| Administrator (admin) | 2          |
+-----------------------+------------+
| Folders per user                   |
+-----------------------+------------+
| Administrator (admin) | 3          |
+-----------------------+------------+
| Disk space per user                |
+-----------------------+------------+
| Administrator (admin) | 173 Bytes  |
+-----------------------+------------+

4.2 dms:setconfig:脚本化改配置

原子化修改 settings.xml 单项,支持 --name/--value 成对多次传入(实测回显):

$ php seeddms/utils/console dms:setconfig --name=baseUrl --value="http://seeddms-server/"
Changing 'baseUrl' from '' to 'http://seeddms-server/'.
$ php seeddms/utils/console dms:setconfig --name=baseUrl --value="http://seeddms-server/"
Keeping 'baseUrl' at 'http://seeddms-server/'.
$ grep -o 'baseUrl="[^"]*"' conf/settings.xml | head -1
baseUrl="http://seeddms-server/"

第二次传入相同值时回显 Keeping ... at ...,幂等可重入,适合放进配置管理脚本。

4.3 dms:addfolder:命令行建柜

选项:-u 属主、-F 父柜 id、--name、-c 注释、-s 排序号(实测回显):

$ php seeddms/utils/console dms:addfolder --user=admin --parent=1 --name="CLI Cabinet Two" --comment="Created via dms:addfolder" --sequence=2
PHP Warning:  Undefined variable $extmgr in /var/www/seeddms60x/seeddms-6.0.42/utils/Commands/AddfolderCommand.php on line 111
New folder with id=5 created.

建柜成功(New folder with id=5 created.),$extmgr 警告为 6.0.42 该命令的已知噪音,不影响结果。验证落库:

$ ./seeddms/utils/seeddms-dbcheck 2>/dev/null | grep -A5 '^tblFolders'
tblFolders                         4       76c910d3a786df895ddcb1cbb1d14579
---------------------------------------------------------------------------------
Archive|Contract archive cabinet|admin
CLI Cabinet Two|Created via dms:addfolder|admin
DMS|DMS root|admin
Invoices|CLI created folder|admin

4.4 dms:adddocument:命令行上传文档

末位参数为本地文件名,-F 目标柜、-k 关键词可多次(实测回显):

$ printf 'SeedDMS CLI lifecycle probe.\nToken: QUZUO-D1SUPP-20261102\n' > /tmp/d1supp.txt
$ php seeddms/utils/console dms:adddocument --user=admin --folder=2 --name="D1 Supp Probe" -c "probe" -k d1supp /tmp/d1supp.txt
PHP Warning:  Undefined variable $categories in /var/www/seeddms60x/seeddms-6.0.42/utils/Commands/AdddocumentCommand.php on line 225
New document with id=4 created.

同样伴随一条无害警告($categories)。内容文件按 contentOffsetDir 规则落盘 data/1048576/<docid>/<version>.<ext>。

4.5 dms:adduser:命令行建用户

--login/--fullname/--password/--email/--role(role 为角色 id:1=Admin、2=Guest、3=User):

$ php seeddms/utils/console dms:adduser --login=d1probe --fullname="D1 Probe User" --password=q1w2e3r4 --email=d1probe@seeddms.local --role=3
$ php seeddms/utils/console dms:stats | grep -E 'users|Name'
| Name                  | Count/Size |
| users                 | 4          |

命令成功时静默无输出(rc=0),以 dms:stats 的 users 计数(3→4)确认生效。

4.6 dms:delete:6.0.42 完全不可用(重大缺陷实录)

--folder / --document / --empty 三种删除分支全部命中同一缺陷——utils/Commands/DeleteCommand.php 调用 Controller::factory(...) 但文件头未 use 导入该类,实测必现 Fatal error:

$ php seeddms/utils/console dms:delete --user=admin --folder=5
Using configuration from '/var/www/seeddms60x/seeddms-6.0.42/utils/../../conf/settings.xml'.
Running as user admin.
PHP Fatal error:  Uncaught Error: Class "Seeddms\Console\Commands\Controller" not found in /var/www/seeddms60x/seeddms-6.0.42/utils/Commands/DeleteCommand.php:90
Stack trace:
#0 /var/www/seeddms60x/vendor/symfony/console/Command/Command.php(341): Seeddms\Console\Commands\DeleteCommand->execute()
#1 /var/www/seeddms60x/vendor/symfony/console/Application.php(1102): Symfony\Component\Console\Command\Command->run()
#2 /var/www/seeddms60x/vendor/symfony/console/Application.php(357): Symfony\Component\Console\Application->doRunCommand()
#3 /var/www/seeddms60x/vendor/symfony/console/Application.php(196): Symfony\Component\Console\Application->doRun()
#4 /var/www/seeddms60x/seeddms-6.0.42/utils/console(91): Symfony\Component\Console\Application->run()
#5 {main}
  thrown in /var/www/seeddms60x/seeddms-6.0.42/utils/Commands/DeleteCommand.php on line 90
rc=255

删除文档(:112 行)与清空柜(:88 行)同样报错,行号不同分支。参数校验部分仍工作,不存在的 id 有正常报错回显:

$ php seeddms/utils/console dms:delete --user=admin --folder=999
Using configuration from '/var/www/seeddms60x/seeddms-6.0.42/utils/../../conf/settings.xml'.
Running as user admin.
Could not find specified folder.
rc=1

绕行方案:改用传统 seeddms-delete 脚本(见 5.5 节实测),或在 Web 界面删除。

4.7 dms:initdb:初始化数据库

用于全新环境建库建表(-u/-p 传 MySQL root 凭据)。对已初始化的库重复执行是幂等的(实测回显,故意用错误 root 口令验证其前置检查):

$ php seeddms/utils/console dms:initdb -u root -p wrongpass
Database 'seeddms' already exists.
Database tables already exist.
rc=0

先检查库与表存在性再决定是否建,因此误跑不会破坏现有数据;但也不会升级/修复既有表结构。

4.8 cache:list 与 cache:clear:预览缓存管理

cache:list 按缓存类型统计(实测回显,清缓存前):

$ php seeddms/utils/console cache:list
+------------+---------------------------+-----------+-------+
| Cache      | Name                      | Size      | Count |
+------------+---------------------------+-----------+-------+
| previewpng | Preview images            | 0 Bytes   | 0     |
| previewpdf | Preview as PDF            | 0 Bytes   | 0     |
| previewtxt | Preview text              | 173 Bytes | 2     |
| js         | Temporary javascript code | 0 Bytes   | 0     |
+------------+---------------------------+-----------+-------+

cache:clear 默认带交互确认(实测回显,应答 n 取消):

$ echo n | php seeddms/utils/console cache:clear
Using configuration from '/var/www/seeddms60x/seeddms-6.0.42/utils/../../conf/settings.xml'.
Do you really want to clear the cache? rc=0

脚本化场景用 --force 跳过确认,--cache 可只清指定类型(实测回显):

$ php seeddms/utils/console cache:clear --force
Using configuration from '/var/www/seeddms60x/seeddms-6.0.42/utils/../../conf/settings.xml'.
rc=0
$ php seeddms/utils/console cache:list
+------------+---------------------------+---------+-------+
| Cache      | Name                      | Size    | Count |
+------------+---------------------------+---------+-------+
| previewpng | Preview images            | 0 Bytes | 0     |
| previewpdf | Preview as PDF            | 0 Bytes | 0     |
| previewtxt | Preview text              | 0 Bytes | 0     |
| js         | Temporary javascript code | 0 Bytes | 0     |
+------------+---------------------------+---------+-------+
$ php seeddms/utils/console cache:clear --cache=previewtxt --force
Using configuration from '/var/www/seeddms60x/seeddms-6.0.42/utils/../../conf/settings.xml'.
rc=0

预览图显示异常、转换器更换后缓存陈旧,都是 cache:clear --force 的典型用场。

4.9 ext:* 扩展命令族

ext:list 列出 ext/ 目录内扩展及启用状态(实测回显):

$ php seeddms/utils/console ext:list
- example                                                 1.0.1    2018-03-21
  Example Extension
  Author: Uwe Steinmann (MMK GmbH)
- pdfviewer                                               1.0.1    2025-12-04
  Javascript PDF Viewer
  Author: Uwe Steinmann (MMK GmbH)

2 extensions, 0 enabled, 2 disabled, 0 has errors

ext:check 校验扩展完整性(实测回显为扩展名清单):

$ php seeddms/utils/console ext:check
example
pdfviewer
rc=0

ext:reload 重载扩展注册(成功静默,实测 rc=0)。其余:ext:repository 列官方扩展仓库、ext:download/ext:upload/ext:package 做扩展分发、ext:configure 写扩展参数到 settings.xml、ext:update 检查更新——均建立在 site/extensionmgr 的下载开关之上(见 《SeedDMS 6.0.42 配置参数详解》 5.11 节)。

五、传统 seeddms-* 工具详解

5.1 包装脚本与 SEEDDMS_HOME 定位机制

utils/ 下每个传统工具都有 seeddms-* bash 包装器,核心逻辑是自动探测安装根(实测 seeddms-indexer 包装脚本原文):

#!/usr/bin/env bash
if [ -z "${SEEDDMS_HOME}" ]; then
        parentdir=$(dirname `realpath "$0"`)
        pparentdir=$(dirname "$parentdir")
        export SEEDDMS_HOME=$(dirname "$pparentdir")
fi
exec php -f "${SEEDDMS_HOME}/seeddms/utils/indexer.php" -- "${@}"

quickstart 布局下自动探测得到 SEEDDMS_HOME=/var/www/seeddms60x。⚠️ 注意:各脚本对 SEEDDMS_HOME 的路径推导约定并不一致(有的拼 $SEEDDMS_HOME/inc,有的拼 $SEEDDMS_HOME/seeddms/inc,有的要 $SEEDDMS_HOME/vendor),个别工具需手工指定才能跑通,实测结论见各节与「八、常见问题」。

配置定位:传统工具识别 --config <file> 与 SEEDDMS_CONFIG_FILE 环境变量(console 命令族两者都不识别,恒读默认配置,见 《SeedDMS 6.0.42 配置参数详解》 3.4 节实测)。

5.2 seeddms-indexer:全文索引重建/更新

增量模式(实测回显):

$ /var/www/seeddms60x/seeddms/utils/seeddms-indexer
D 1:DMS  (Folder unchanged)
  D 2:Archive  (Folder unchanged)
    D 3:Invoices  (Folder unchanged)
    1:Contract Demo 2026 (signed)  (Document unchanged)
    2:Probe Doc CLI  (Document unchanged)
  D 5:CLI Cabinet Two  (Folder added)

Total Time: 0 sec.
Documents
  added: 0
  updated: 0
  unchanged: 2
  error: 0
Folders
  added: 1
  updated: 0
  unchanged: 3
  error: 0
rc=0

-c 全量重建(实测回显节选,重建时所有条目重新入索引):

$ ./seeddms/utils/seeddms-indexer -c
    4:D1 Supp Probe  (Document added)
  D 5:CLI Cabinet Two  (Folder added)

Total Time: 0 sec.
Documents
  added: 3
  ...
Folders
  added: 4
  ...
rc=0

选项:-F <folder id> 只索引子树、--no-log 不写日志、--config 换配置。挂 cron 定时增量更新是官方推荐用法(README:"you can as well run seeddms-indexer in a cron job")。

5.3 seeddms-dbcheck:数据库一致性摘要

按表输出行数与内容哈希,用于迁移前后比对(官方定位:"Its primary use is for comparing databases after it has been moved to a new server",实测回显节选):

$ ./seeddms/utils/seeddms-dbcheck | head -8
tblDocuments                     2       5d53d20a07d1c323e3768dc82bb47a3f
---------------------------------------------------------------------------------
Contract Demo 2026 (signed)|Metadata updated via web edit form|demo, contract, signed|admin
Probe Doc CLI|Created via seeddms-console|cli probe|admin

tblDocumentContent               2       937e40f9afe339b8562f38628cdde487
---------------------------------------------------------------------------------
contract-demo.txt|1|v1 initial

指向替代配置验证连接切换(实测回显):

$ ./seeddms/utils/seeddms-dbcheck --config=/tmp/alt-settings.xml
Could not connect to db-server "localhost"

5.4 seeddms-xmldump:元数据 XML 导出

把整库/子树元数据导出为 XML(不含文件内容本体,超大版本可用 --contentdir 外置),是配置审计与迁移比对的核心工具。实测回显(头部节选):

$ ./seeddms/utils/seeddms-xmldump | head -12
<?xml version="1.0" encoding="utf-8"?>
<dms dbversion="6.0.0" date="2026-11-02 01:15:43">
<roles>
 <role id="1">
  <attr name="name">Admin</attr>
  <attr name="role">1</attr>
...

关键选项:--folder <id> 起始柜、--skip-root 不导出根、--sections 选段、--maxsize 文件内联阈值(默认 100000,<0 全量内联)、--softlink 外置目录用软链。备份三件套(xmldump + 数据库逻辑备份 + data/ 快照)见 《SeedDMS 6.0.42 配置参数详解》 生产模板节。

5.5 seeddms-delete:删除柜/文档(console 缺陷的替代通道)

用法(实测 --help):

Usage:
  seeddms-delete [--config <file>] [-h] [-v] -f <folder id> -e <folder id> -d <document id>

  -f <folder id>: id of folder to be deleted
  -e <folder id>: id of folder to be emptied
  -d <document id>: id of document to be deleted
  -u <user>: login name of user
If the user is not given the user with id 1 will be used.
The options -d, -e and -f can be passed multiple times or the option value
can be a comma separated list of ids.

⚠️ 该脚本按 $SEEDDMS_HOME/inc 推导包含路径,包装器自动探测的外层根下无 inc/,直接跑 seeddms-delete 会命中一串 include 警告后 Fatal(实测记录见「八、常见问题」Q2)。可行配方:显式把 SEEDDMS_HOME 指向版本目录(inc/ 所在层)并给 SEEDDMS_CONFIG_FILE(实测回显):

$ cd /var/www/seeddms60x
$ export SEEDDMS_HOME=/var/www/seeddms60x/seeddms-6.0.42
$ export SEEDDMS_CONFIG_FILE=/var/www/seeddms60x/conf/settings.xml
$ php -f seeddms/utils/delete.php -- -d 4
Document with id 4 removed.
$ php -f seeddms/utils/delete.php -- -f 5
Folder with id 5 removed.

删除后 dms:stats 计数从 docs 3/folders 4 回到 2/3,验证生效。这是 4.6 节 console dms:delete 缺陷下唯一可用的命令行删除通道。

5.6 seeddms-adddoc:批量上传单文档

与 console dms:adddocument 等价的传统入口,-F 目标柜、-f 文件、-n 名称、-k 关键词、-D 给既有文档追加新版本(实测回显,成功静默):

$ printf 'SeedDMS adddoc wrapper probe.\nToken: QUZUO-ADDDOC-20261102\n' > /tmp/adddoc-probe.txt
$ php -f seeddms/utils/adddoc.php -- -F 2 -n "Adddoc Probe" -c "via seeddms-adddoc" -k adddoc -u admin -f /tmp/adddoc-probe.txt
$ echo rc=$?
rc=0
$ mariadb -u seeddms -pq1w2e3r4 seeddms -N -e "SELECT MAX(id) FROM tblDocuments"
5

清理实验数据(5.5 配方):

$ php -f seeddms/utils/delete.php -- -d 5 -u admin
Document with id 5 removed.

官方 README 提醒:以 Web 服务用户权限运行,否则 root 创建的文档在 Web 界面可能删不掉。

5.7 seeddms-createfolder:命令行建柜(6.0.42 有类重复声明缺陷)

-F 父柜、-n 名称、-s 排序、-c 注释。实测在显式 SEEDDMS_HOME 版本目录配方下命中类重复声明缺陷(回显实录):

$ php -f seeddms/utils/createfolder.php -- -F 2 -n "CLI Import Box" -c "Created via seeddms-createfolder" -s 3 -u admin
PHP Fatal error:  Cannot declare class SeedDMS_NotificationService, because the name is already in use in /var/www/seeddms60x/seeddms-6.0.42/inc/inc.ClassNotificationService.php on line 23
rc=255

建柜需求请直接使用 console dms:addfolder(4.3 节实测可用)或 Web 界面。

5.8 seeddms-expireddocs / seeddms-relodge:到期提醒

两脚本共用同一套参数(实测 --help 要点):-d <days> 向后检查天数(默认 14)、-D <days> 起始偏移(负数回看历史)、-t 测试模式不发信、-w 同时通知观察者、-o 列出已过期文档、-b <base> 邮件内链接基址。-t 实测回显(节选,$logger 警告为 6.0.42 传统脚本的共性噪音,不影响执行):

$ php -f seeddms/utils/expireddocs.php -- -t
PHP Warning:  Undefined variable $logger in .../inc/inc.ConversionInit.php on line 39
...
Running in test mode will not send any mail.
Checking for documents expiring between 2026-11-02 00:00:00 and 2026-11-15 23:59:59
No notification for user admin needed
No notification for user cli_scheduler needed
No notification for user guest needed
rc=0

未设置 SEEDDMS_CONFIG_FILE 时该脚本直接拒绝运行(实测原文):

You do not seem to have a valid configuration. Set SEEDDMS_CONFIG_FILE to the path of the configuration file.

5.9 seeddms-open-tasks:待办汇总(6.0.42 依赖缺失,不可用)

设计用途是汇总各用户待审阅/批准任务并发信。实测在 quickstart 布局下因 PEAR Mail 包缺失直接 Fatal(回显实录):

$ php -f seeddms/utils/open-tasks.php -- -t
PHP Warning:  include(Mail.php): Failed to open stream: No such file or directory in .../utils/open-tasks.php on line 7
PHP Warning:  include(Mail/mime.php): Failed to open stream: No such file or directory in .../utils/open-tasks.php on line 8
PHP Fatal error:  Uncaught Error: Class "Settings" not found in .../utils/open-tasks.php:64
rc=255

脚本 require_once 的是 PEAR 的 Mail.php/Mail/mime.php,quickstart 分发包未预装该通道(vendor/pear 下仅有部分包),Fatal 前的 include 失败连带 Settings 类未加载。待办汇总请走 Web 首页面板或 REST API。

5.10 seeddms-schedulercli:内置任务调度器

--mode run|dryrun|check|list 四档(实测 --help)。用包装器默认跑(SEEDDMS_HOME 自动探测为外层根,该脚本需要 $SEEDDMS_HOME/vendor,包装器惯例正合适):

$ ./seeddms/utils/seeddms-schedulercli --mode list
rc=0
$ ./seeddms/utils/seeddms-schedulercli --mode check
rc=0

成功静默无输出。它依赖一个名为 cli_scheduler 的既有用户,缺失时写入应用日志并退出(实测日志原文):

Nov 02 01:03:29  [error] -- (-) schedulercli.php Execution of tasks failed because of missing user 'cli_scheduler'. Will exit now.

建好该用户后(dms:adduser --login=cli_scheduler ...,4.5 节配方)两档模式即恢复正常(实测 rc=0)。

5.11 seeddms-importfs:目录树批量导入(6.0.42 半残)

把本地目录递归导入到指定柜(-F 柜 id、-d 目录、--basefolder 先建同名柜、--exclude 排除名、--filemtime/--foldermtime 保留时间戳、-e 文件名编码,默认 iso-8859-1)。实测导入 /tmp/import-demo(含 one.txt 与 sub/two.txt):

$ ./seeddms/utils/seeddms-importfs -F 2 -d /tmp/import-demo --basefolder --user=admin
/var/www/seeddms60x/data/1048576
PHP Warning:  Undefined variable $themes in .../utils/importfs.php on line 262
PHP Fatal error:  Uncaught Error: Call to a member function black() on null in .../utils/importfs.php:262
rc=255

基柜 import-demo(id=6) 已创建,但递归导入在彩色输出阶段 Fatal(AlecRabbit\ConsoleColour 主题对象未初始化即调用),子目录与文档未入库。清理残留:

$ php -f seeddms/utils/delete.php -- -f 6 -u admin
Folder with id 6 removed.

6.0.42 的批量导入请暂用脚本循环 seeddms-adddoc(5.6 节)或 REST API 上传端点替代。

5.12 seeddms-importmail:邮件归档导入

从 IMAP 邮箱批量导入邮件/附件(实测 --help 要点):--imap-urn "{host:993/imap/ssl/novalidate-cert}INBOX"、--imap-user/--imap-password -(stdin 读密)、-m all|new|unseen|today|since:<date>|on:<date> 选择集、--eml 整封 rfc822 存档(否则只抽附件)、--subfolder 每邮件建子柜、--attribute "subject:Mail: Subject" 把头字段写入属性、--delete 导入后删信、--type 按 MIME 主类型过滤附件。官方示例(help 原文):

seeddms-importmail --config=... --imap-urn "{mail.mydomain.com:993/imap/ssl/novalidate-cert}INBOX" \
  --imap-user admin --imap-password - --mode="since:-2 days" --user=admin -F 8376 \
  --subfolder --attribute="toaddress:Mail: To" --attribute="subject:Mail: Subject" --type=\!PGP-SIGNATURE

需 PHP imap 扩展与可达 IMAP 服务器,本环境无邮件服务器未做端到端实测,参数语义以 --help 原文为准。

六、cron 调度配置

官方 README 推荐把索引与调度挂到 cron(以 root 编辑 crontab -e,实测环境部署根为 /var/www/seeddms60x):

# 每 15 分钟增量更新全文索引
*/15 * * * * cd /var/www/seeddms60x && ./seeddms/utils/seeddms-indexer --no-log
# 每日 02:00 跑内置任务调度(需存在 cli_scheduler 用户)
0 2 * * * cd /var/www/seeddms60x && ./seeddms/utils/seeddms-schedulercli --mode run
# 每日 07:00 到期提醒(测试模式改 -t 去掉即真实发信)
0 7 * * * cd /var/www/seeddms60x && SEEDDMS_CONFIG_FILE=/var/www/seeddms60x/conf/settings.xml php -f seeddms/utils/expireddocs.php -- -d 14

要点:seeddms-indexer/seeddms-schedulercli 走包装器自动定位即可;expireddocs.php 直跑必须给 SEEDDMS_CONFIG_FILE(5.8 节实测),或统一用 --config 传入。

七、REST API 命令行实测速查

REST 入口基路径为 /restapi/index.php(www/restapi/swagger.yaml 提供 OpenAPI 描述)。免认证端点(实测回显):

$ curl -s http://localhost/restapi/index.php/echo/hello-seeddms
{"success":true,"message":"This is the result of the echo call.","data":"hello-seeddms"}
$ curl -s http://localhost/restapi/index.php/version
{"success":true,"message":"This is SeedDMS, 6.0.42","data":{"major":6,"minor":0,"subminor":42,"version":"6.0.42"}}

会话式认证:POST /login 的参数名是 user/pass(实测用 login/password 会被拒),成功后下发 mydms_session cookie(实测回显):

$ curl -s -X POST -d "login=admin&password=q1w2e3r4" http://localhost/restapi/index.php/login
{"success":false,"message":"No user or password given","data":""}
$ curl -s -c /tmp/cj -X POST -d "user=admin&pass=q1w2e3r4" http://localhost/restapi/index.php/login
{"success":true,"message":"","data":{"type":"user","id":1,"name":"Administrator","comment":"","login":"admin","email":"info@seeddms.org","language":"en_GB","quota":0,"homefolder":null,"theme":"bootstrap4","role":{"type":"role","id":1,"name":"Admin","role":1},"hidden":false,"disabled":false,"isguest":false,"isadmin":true}}

带 cookie 的读端点(实测回显节选):

$ curl -s -b /tmp/cj http://localhost/restapi/index.php/folder/1
{"success":true,"message":"","data":{"type":"folder","id":1,"name":"DMS","comment":"DMS root","date":"2026-11-02 00:48:00","owner":1}}
$ curl -s -b /tmp/cj http://localhost/restapi/index.php/folder/2/children | head -c 300
{"success":true,"message":"","data":[{"type":"folder","id":3,"name":"Invoices","comment":"CLI created folder","date":"2026-11-02 01:02:24","owner":1},{"type":"document","id":1,"date":"2026-11-02 00:57:44","name":"Contract Demo 2026 (signed)",...
$ curl -s -b /tmp/cj "http://localhost/restapi/index.php/search?query=Contract" | head -c 300
{"success":true,"message":"","data":[{"type":"folder","id":2,"name":"Archive","comment":"Contract archive cabinet",...

登出后旧 cookie 立即失效(实测回显):

$ curl -s -b /tmp/cj http://localhost/restapi/index.php/logout
{"success":true,"message":"","data":""}
$ curl -s -b /tmp/cj http://localhost/restapi/index.php/users
{"success":false,"message":"Session has gone","data":""}

未登录访问受保护端点的统一响应为 {"success":false,"message":"Missing session cookie","data":""}。另两点实测:REST search 的查询参数名是 query(text= 会被忽略返回空);全文 token 检索(如 query=quzuoprobe2026)经 REST 未命中而 Web 检索命中,REST 检索语义以名称/元数据匹配为主,端点族(folder/document/user/group/keyword 的 CRUD 与 uploadDocument)完整清单见 www/restapi/swagger.yaml。免会话的 API key 三件套配置见 《SeedDMS 6.0.42 配置参数详解》 5.9 节。

八、常见问题

Q1:dms:delete 报 Class "Seeddms\Console\Commands\Controller" not found? 6.0.42 的真实缺陷:utils/Commands/DeleteCommand.php 三个删除分支(:88/:90/:112)都调用 Controller::factory() 却没有导入该类,任何 dms:delete 用法必 Fatal(4.6 节实测)。绕行:传统 delete.php 配方(5.5 节)或 Web 界面删除;关注上游修复后再启用。

Q2:直接跑 ./seeddms/utils/seeddms-delete -d <id> 报一串 include 警告后 Fatal? 包装器把 SEEDDMS_HOME 定为外层根 /var/www/seeddms60x,而 delete.php 按 $SEEDDMS_HOME/inc 找包含文件(外层根无 inc/),实测报 Failed opening '/var/www/seeddms60x/inc/inc.Settings.php' 等并死于 Call to a member function getUser() on null。解法:显式 export SEEDDMS_HOME=<版本目录> SEEDDMS_CONFIG_FILE=<settings.xml> 后 php -f seeddms/utils/delete.php -- ...(5.5 节实测)。

Q3:seeddms-createfolder 报 Cannot declare class SeedDMS_NotificationService? 6.0.42 传统脚本的类重复声明缺陷(5.7 节实测),无简单绕行参数;建柜用 console dms:addfolder(4.3 节)。

Q4:seeddms-importfs 建了基柜就崩,报 Call to a member function black() on null? $themes(ConsoleColour 主题)未初始化即使用的上游缺陷(5.11 节实测);残留柜用 delete.php -f 清理。批量导入暂用 seeddms-adddoc 循环或 REST POST /folder/{id}/document。

Q5:seeddms-open-tasks 报 Failed opening 'Mail.php'? 脚本硬依赖 PEAR Mail 通道,quickstart 分发包未含(5.9 节实测 Fatal)。安装 PEAR Mail 包并保证 include_path 可达后方可用,否则改走 Web/REST。

Q6:seeddms-schedulercli 静默退出但日志报 missing user? 调度器要求存在 cli_scheduler 用户(5.10 节日志原文)。dms:adduser --login=cli_scheduler 建好即恢复(实测 rc=0)。

Q7:expireddocs 满屏 Undefined variable $logger 警告? 6.0.42 传统脚本共性噪音,不影响功能(5.8 节实测最终照常输出检查结果并 rc=0);嫌噪音可在 cron 行尾 2>/dev/null,但排障期建议保留。

Q8:REST login 一直报 No user or password given? 参数名是 user/pass,不是 login/password(第七节实测对照)。

九、参考链接