用 DocuSeal 整理在线填写与签署流程:从 PDF 模板到交付归档

以设备借用确认为例,用 DocuSeal 建立 PDF 填写与签署流程,覆盖部署、模板、邀请邮件、异常处理、归档和恢复。

·11 min工作流

一份文件在邮件里来回传几次,很容易出现版本混乱。有人填了旧模板,有人漏了日期,有人把签名图片贴到了错误位置,最后保存下来的是“最终版3-修改后.pdf”。对于设备借用、项目交付确认、内部申请等重复流程,问题往往出在文件怎样流转,而不是缺少一个画签名的工具。

DocuSeal 可以将 PDF 做成在线表单,分配填写者,发出邀请,再保存完成后的文件。适合先挑一个边界明确的小流程试用:字段少、参与者明确、归档位置已确定,完成后有人负责验收。不要一开始就把所有文件搬进去,也不要因为页面能够画签名就跳过业务本身需要的审核。

先拿设备借用确认表做一条完整流程

假设一个小团队借用相机、笔记本或测试设备,表格需要设备编号、借用人、借用日期、预计归还日期、附件清单和确认签名。开始之前先整理 PDF:字段名字清晰,留够填写区域,设备编号可以核对,说明内容不依赖旁边口头解释。

签署流程里有两种不同角色需要区分。文档填写者负责填入和确认相应内容;系统管理者负责模板、发送和归档。不要把文档有多个填写者,与团队后台提供细分管理权限混为一谈。

DocuSeal 项目说明分别列出基础能力和 Pro 功能。多名填写者、SMTP 邮件与文件存储在项目介绍中;后台用户角色、自动提醒、某些嵌入和身份验证功能则列在 Pro 部分。正式选型时按要使用的部署版本核对,不能看到云端演示就默认自托管基础版本全部具备。

如果试用流程只涉及一名借用人,可以先完成单人签署。需要发放人确认或多人顺序处理时,再在所用版本中验证角色分配、发送次序和完成判定。业务必须满足的步骤应提前列出来,避免上线后才发现缺少授权功能。

数据库和文件要一起规划

DocuSeal 的 Docker 默认方案可以使用 SQLite,官方 Compose 提供 PostgreSQL 组合。小范围试用可以选择简单方案;多人长期使用时,应根据备份、运维和既有基础设施选定数据库。数据库存业务记录,附件与完成文件还需要持久化存储,备份不能只顾其中一边。

下面提供 PostgreSQL 试运行配置,参考官方 Compose,去掉了内置反向代理,便于接入已有服务。数据库数据挂载沿用 PostgreSQL 18 的示例路径;如果换大版本,要按对应版本核对挂载与升级步骤,不能只替换镜像数字。

services:
  app:
    image: docuseal/docuseal:latest
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./docuseal:/data/docuseal
    environment:
      DATABASE_URL: postgresql://docuseal:${DB_PASSWORD:?set DB_PASSWORD}@postgres:5432/docuseal
      SECRET_KEY_BASE: ${SECRET_KEY_BASE:?set SECRET_KEY_BASE}
    restart: unless-stopped

  postgres:
    image: postgres:18
    environment:
      POSTGRES_USER: docuseal
      POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD}
      POSTGRES_DB: docuseal
    volumes:
      - ./pg_data:/var/lib/postgresql/18/docker
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U docuseal -d docuseal"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

在受限 .env 文件中保存 DB_PASSWORD 和 SECRET_KEY_BASE。可以分别用 openssl rand -hex 32 和 openssl rand -hex 64 生成。示例数据库密码采用十六进制随机值,避免直接嵌入连接 URL 时遇到特殊字符转义问题。不要继续使用官方演示中的简单密码。

latest 用来完成首次试用,长期使用要固定核实过的标签或摘要,并记录数据库版本。更新应用镜像前备份,不能依赖标签名称一直指向相同内容。

chmod 600 .env
docker compose config --quiet
docker compose up -d
docker compose logs --tail=100 app
ssh -L 13000:127.0.0.1:3000 user@your-server

浏览器打开 http://127.0.0.1:13000,完成管理员设置和模板试验。数据库未映射公网端口,应用也暂时只允许本机访问。这个阶段用虚构设备和自己控制的邮箱,不上传真实业务文件。

域名、HTTPS 和邀请链接一起验收

对外邀请填写者时,需要一个他们能够访问的 HTTPS 域名。接入现有 Caddy 或 Nginx,应用继续监听本机3000端口。DNS、证书与反向代理确认后,在应用环境中设置公开域名与 SSL 强制选项:

HOST: sign.example.com
FORCE_SSL: "true"

域名不带路径,其他值按环境变量文档配置。示例中的域名要替换为自己的地址,再重新创建应用容器使环境生效。

反向代理需要传递正确的主机名与协议。出现表单提交 422、Origin 不匹配等问题时,检查 Host、X-Forwarded-Proto 等设置。官方提供了 Nginx 代理说明。不要关闭请求校验来掩盖协议传递错误。

验收不能只打开管理首页。发出一份测试邀请,在另一台设备打开邮件里的链接,完成填写,再下载文件。手机使用移动网络验证一次,有助于发现域名只在内网能访问,或者邮件里仍指向回环地址的问题。

签署链接可能允许持有者进入对应文档,不适合作为公开展示地址。后台限制和外部填写入口应分别考虑,不能给整个域名加上只有管理员知道的额外密码后,继续期待受邀者正常填写。

模板里的每个字段都要有归属

上传设备借用 PDF 后,先放置少量必要字段。借用人姓名、日期、确认项与签名应属于明确的填写者;设备编号和附件列表如果由管理者提前确定,就不要交给借用人随意修改。模板要表达流程里真实的分工。

必填只用于完成流程确实需要的信息。一个不适用的字段被强制要求填写,会促使人输入随意内容绕过检查。可选项则应在文案里解释适用条件,例如“有附件时填写附件清单”,而不是靠管理员事后猜测空白代表什么。

PDF 中中文字体、字段尺寸和页面边界也要实际查看。在线输入看起来正常,生成文件仍可能发生长文本溢出或字号过小。测试时填入长一点的姓名、较长的设备描述和跨月日期,完成后下载 PDF 检查,而不是只看在线预览。

模板更新最好有内部版本号。旧请求使用的模板与新请求的字段可能不同,修改一份模板后,应确认未完成请求如何受影响。对已经完成的记录,应保留当时文件与版本关联,不要用最新空模板覆盖过去的归档。

邮件发出去以后,还要知道对方能不能用

SMTP 配置包含服务器、端口、用户名、密码、发件地址和相应认证方式。优先使用已经验证过的邮件服务,保持 TLS 与证书验证。邮件失败时检查服务商返回信息、发件域名与账户授权,不能只因为后台保存设置成功就认为邮件可用。

先向自己控制的两个邮箱发送邀请。查看发件人、标题、页面链接和垃圾邮件情况,随后从邮件里的链接进入。邀请邮件的说明应告诉对方文件用途、需要完成的动作和联系谁处理问题;不要只给一个陌生 URL。

发件域名的 SPF、DKIM 等配置由所用邮件服务指导。使用已有发信账号时,确认日发送量与邀请规模匹配。大量重发既可能占用额度,也容易让填写者不知道哪封邮件对应有效请求。

自动提醒等功能要按版本核实。即使没有自动提醒,也可以在内部记录里跟进未完成请求,但不要把“邮件发送成功”直接作为对方已经收到、打开或同意的证据。

完成状态、下载文件与内部登记要对得上

一次流程至少应能找到模板版本、请求标识、参与者、完成结果和归档文件。内部登记可以用设备编号关联,避免只按姓名存文件:同一个人可能多次借用,不同人也可能重名。

业务系统接入时,先定义自己要保存的状态,再对照 API 与 Webhook 文档映射。这里不应凭页面上一个按钮,推断 API 已经返回了完整签署结果。把收到事件、核对平台状态、下载完成文件、归档成功分成可追踪步骤,失败时才知道从哪里继续。

Webhook 接收端需要按事件标识或适当组合键去重,避免重复请求创建多份记录。遇到乱序事件,核对当前状态后再更新;不要让较早的通知覆盖较新的结果。外部请求应按文档验证来源,接口令牌保存到受限配置,日志只记录排障所需信息。

文件下载失败时,不必立即重新发送签署邀请。先检查链接、访问权限和存储,再重试归档动作。签署流程已经完成但内部归档失败,是两件不同的事,混在一起会导致参与者重复填写。

业务负责人需要能处理三个例外

第一种是填写者收不到邀请。先核对地址和邮件发送记录,再让对方检查垃圾邮件与过滤规则。确认地址错了,应按系统实际支持的方式修正或重新建立请求,记录旧请求如何处理,避免两份有效邀请指向同一笔业务而无人区分。

第二种是发出后发现模板有错。不要指望修改模板能自动纠正所有已发请求,更不能在已经完成的文件里覆盖文字。先检查所用版本对未完成请求的处理方式,再决定取消、重建或采用业务认可的更正流程。内部记录要关联原请求与更正请求,方便以后查明经过。

第三种是参与者离开或不再处理。流程不能无限期等待,也不能为了关闭任务就代替对方完成确认。业务负责人应有明确的结束规则:撤回、转交、重新发送或记录未完成原因,具体动作根据权限和业务要求选择。

这三种例外最好在演示阶段走一遍。除了确认系统有相应功能,还要让负责发送的人知道如何找到记录、如何联系参与者以及何时交给管理者处理。自动化只能处理已经约定好的情况,没定义过的例外仍需要人判断。

备份要能恢复一份已经完成的文件

这个 Compose 方案需要同时保护 PostgreSQL 数据、docuseal 文件目录、环境秘密与部署版本。应用密钥不能每次迁移都随意重新生成;将它与数据库一起纳入受控备份记录。

小规模实例可以在维护窗口暂停应用,保持数据库运行,生成逻辑备份后归档文件目录:

umask 077
docker compose stop app
docker compose exec -T postgres pg_dump -U docuseal -d docuseal \
  > docuseal-database.sql
tar -czf docuseal-files.tar.gz docuseal
docker compose start app

这个示例需要维护者检查每一步是否成功;数据库备份失败时应先处理,不能把空文件当完成结果。不要对正在运行的 PostgreSQL 目录简单压缩,然后称其为可靠数据库备份。正式备份保存到独立存储,并保护访问权限。

恢复演练应使用隔离域名和关闭出站邮件的配置,避免测试实例向真实参与者发送邀请。恢复后找一份已完成文件,核对参与者与记录,下载并打开;再确认一份未完成请求仍能按预期查看。只有数据库表能查询,不足以证明附件和完成文件可用。

使用对象存储后,也要确认桶内容、访问凭据与备份策略一起覆盖。更换存储后端不是只修改一个环境变量,历史附件是否可访问同样需要验证。

上线前让一个不熟悉系统的人走一遍

找一位未参与部署的人,用手机完成演示流程。观察他是否知道填写哪个字段、是否理解确认项、能否获得自己的完成文件,以及填错时如何求助。这类问题常常来自模板文案与业务安排,不会出现在容器启动日志里。

首个正式流程保持范围小,记录处理负责人和归档位置。涉及身份核验或特殊签署要求时,按实际业务要求选择能力,不把普通画签名流程包装成经过核实的通用保证。

当模板、邀请、完成状态和归档能够连在一起,重复文件处理才会少一些来回确认。后续再增加自动化,应该解决已经观察到的具体阻塞:谁经常漏填,哪个归档步骤容易失败,哪些提醒确实需要自动发送。这样维护的是一条可运行的流程,而不只是一个能够打开的签署页面。