PassNAT LogoPassNAT

自建电子签名 DocuSeal:飞牛 NAS Docker 部署,生成签署链接发给对方,配内网穿透在外面也能签

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

DocuSeal 是一个自己部署的电子签名工具:把要签字的文件传上去,在文件上把「签名」「日期」这些框拖到该签的位置,它就会生成一条签署链接。对方打开链接,直接在文件上签好提交,整件事结束 —— 不用打印、不用扫描,对方也不用注册账号。

它跟在线签署服务的区别在于东西放在哪儿:文件、签名记录、生成好的成品,全部落在你自己 NAS 的一个目录里,备份的时候把那个目录拷走就完事。项目在 GitHub 上开源(AGPL-3.0),并且提供了打好的官方镜像,NAS 上拉下来就能跑,不用自己构建。

常见的用法比如:家里设备外借做个登记、跟人确认一份清单、要一个签字确认的回执。需要对方签个字、又不值得为它跑一趟的场合,它都能顶上。

部署安装

装在自己的 NAS 上之后,生成的签署链接只能在家里的网络打开 —— 发给对方,对方是打不开的。这一步是这个工具能不能用起来的关键。家里没有公网 IP 的话,可以用 帕斯内网穿透 把它开放到公网,飞牛的应用中心里就能直接装到插件,不用另外找工具。下面这套流程在飞牛 NAS 上从头到尾走一遍。

第一步:准备编排文件

下面这份编排可以直接用,只有一处需要按自己的情况改:冒号左边的宿主端口。

1services:
2 docuseal:
3 # 官方镜像,不写死版本号,跟着上游最新的走
4 image: docuseal/docuseal:latest
5 container_name: docuseal
6 # NAS 重启之后自动起回来
7 restart: unless-stopped
8 ports:
9 # 冒号左边 3030 是浏览器里输的端口,右边 3000 是容器里的,别改
10 - "3030:3000"
11 volumes:
12 # 数据库和上传的文档都落在这个目录里,跟着项目文件夹走,备份直接拷它
13 - ./data:/data
14

端口:冒号左边的 3030 是待会儿在浏览器里输的宿主端口,右边的 3000 是容器内部的端口,不要动。3030 如果被别的容器占了,换一个没用过的即可。

数据目录:./data 挂到容器里的 /data,数据库和上传的文件都落在这里。它是相对于编排文件所在目录的,所以整个项目文件夹拷走就是一份完整备份。

这份编排用的是内置的 SQLite,不需要额外的数据库容器,也不需要填任何密钥。

注意上游仓库里那份 docker-compose.yml 不要直接照搬:那一份带了 PostgreSQL 和一个 Caddy 反向代理,Caddy 会占用 80 和 443 端口、并且需要一个真实域名来签证书。单容器这种形态就是官方文档里 docker run 那条命令的等价写法,够用而且省事。

还有一个环境变量要特别说一下:不要在编排里加 APP_URL。这个变量的优先级比界面上的设置项高,一旦写进编排,界面里那个地址栏就改不动了,而且界面上不会有任何提示,很难查。地址交给界面上的字段管就好。

第二步:在飞牛上建 Compose 项目

打开飞牛的 Docker 应用,切到 Compose,点右上角的新增项目。项目名称填 docuseal。

路径这一栏点开,在「我的文件」下面挑一个空文件夹选中 —— 这个文件夹以后就是这个项目的家,编排文件和上面说的 data 目录都会放在里面。

来源选「创建 docker-compose.yml」,把上面那份编排整段贴进去。镜像标签跟着官方文档走就行,不建议自己钉一个具体的版本号 —— 钉死之后项目更新了你这边还停在旧版。

下面「创建项目后立即启动」勾上,点创建。镜像两百多兆,拉完就自动跑起来了。

第一次启动它要在内部建数据库表,这个过程要几分钟。这段时间里打开页面会一直跳到初始化向导,甚至一时打不开,都是正常的,等一会儿再刷新。

第三步:用内网穿透开放到公网

容器跑起来之后,先别急着在内网点来点去 —— 下一步直接把它开放到公网,后面的初始化在公网地址上做,能省掉一轮返工。

在飞牛的应用中心里搜 PassNAT,装上,账号登一次。打开插件点创建隧道:名字随便起、不要超过十二个字符;本地 IP 这一栏留空就好,默认就是 127.0.0.1,不用填 NAS 的局域网地址;本地端口填上面那个 3030。

建好之后点开详情,按最左边的电源键把它启动,状态转成运行中。面板上那个「IP:端口」就是在外面要用的公网地址。

第四步:在公网地址上做初始化

用刚拿到的公网地址打开,第一次进来是一页注册向导:名字、邮箱、给自己设一个密码。

这一页有一个 App URL 字段,非常关键 —— 它决定了生成出来的签署链接用什么域名。好消息是它会自动带出你当前访问用的地址,所以在公网地址上做初始化,这一行天然就是对的,不用改。这也是为什么建议先开穿透再做初始化:在内网做的话,这里带出来的是内网地址,生成的链接对方打不开。

万一填错了也不用重发链接。这个地址是每次显示链接的时候现拼的,不是生成时写死的 —— 去设置里把 App URL 改回正确的,之前已经发出去的链接会跟着一起变。

提交之后它会先弹一个订阅开发者邮件的页面,点 Skip 跳过就进主界面了。

怎么用

主界面上把要签的文件拖进来上传,PDF 和图片都可以。上传完直接进编辑器,文件会渲染在中间,右边是一排字段。

从右边把「Signature」拖到文件上该签名的位置,把「Date」拖到该写日期的位置,松手就放好了,框的大小和位置都能再拖。旁边还有「AUTODETECT FIELDS」,能自动把文件里的空白识别成填写框,不过认出来的都是普通文本框,要签名还是得自己拖一个 Signature 上去。

放好之后点 SEND,填上对方的邮箱地址。如果你没给它配发信服务器,这里会提示邮件发不出去 —— 不影响,因为我们要的不是它替我们发邮件,而是它生成的那条链接。点添加之后回到文件页面,那一行会出现「COPY LINK」,复制下来用微信发给对方就行。

对方点开链接,不用注册也不用登录,直接就是这份文件。在签名框里手写签个名,填上日期,点提交,这份文件就签完了。你这边刷新一下就能看到状态从等待变成已完成,签好的成品可以直接下载。

界面目前是英文的,语言列表里还没有中文。不过整个流程要认的就是上传、拖字段、SEND、COPY LINK 这几个按钮,而文件本身是什么语言就显示什么语言,中文文件渲染没有任何问题。

一些使用上的细节

数据都在项目文件夹的 data 目录里,包括上传的原件和签好的成品。想搬到另一台机器,把整个文件夹拷过去、用同样的编排起一个容器就能接着用。

签署链接本身就是凭据,谁拿到谁就能签,所以别往公开的地方贴。文件签完之后那条链接就变成只读的了,对方再打开只能看不能改。

如果暂时不想让外面访问,去 PassNAT 插件里把那条隧道的电源关掉就行,内网照常用,不用动容器。