编注:本文入选「自力更生」征文活动。本次征文选题灵活,只要围绕「自托管」展开即可,软件推荐、经验分享、技术科普、观点评论均可投稿,6 月 23 日前发布投稿文章即可。入围作品均可获得稿酬、Zeabur 订阅、少数派 PRIME 会员等奖励。了解详情
作为喜欢阅读互联网长文的「上世代互联网遗老」,我一直保持着一个和现在互联网快消时代格格不入的爱好:偏爱长内容,这包括了我喜欢观看哪些具有丰富知识内容的长视频,收听播客节目以及阅读长篇的文章。尤其是长篇文章,往往是在我在碎片化的时间浏览公众号或者 RSS 订阅时,然后就会把这篇长文发到我的稍后读应用或者推送到我的 Kindle 邮箱中,等晚上做到书桌前仔细深度阅读。
因此我一直都非常留意各家的稍后读/书签服务,从最早的 instapaper、Pocket 到后来使用 Kindle 的邮箱推送等都有尝试,只不过在国内这个互联网环境中难免会遇到网络访问稳定性的问题——毕竟这几种稍后读服务都来自国外开发商,经常会遇到发送微信公众号文章后重排版出错的情况,就更别提数据保留的安全性问题了。
既然我已经在家中部署了 NAS,秉承「将数据保留在自己手上」的宗旨,我决定将稍后读/书签服务也进行自部署。而考虑到我实际的使用情况,我自部署的稍后读/书签服务需要满足以下几点:
- 支持自部署,且部署方式容易。
- 可以在手机端/桌面端进行进行阅读。
- 可以在不同的平台将文章/网页发送到稍后读服务中。
- 解析处理网页内容的速度要很快。
而满足以上要求的就剩下了这款名为 Readeck 稍后读/书签服务。
Readeck:功能全面且支持自部署的稍后读/书签服务
安装 Readeck 服务端
和其他自部署的服务一样,作为一款自部署优先服务,Readeck 官方直接就提供了 Docker 的部署方式,当然考虑到我自己家中的 NAS 是群晖的 DS218+,官方 Docker 套件本身功能比较弱,因此我还额外使用 Portainer 这个可视化的容器部署工具来进行部署,这样做的另一个好处就是,即便你的 NAS 不是群晖,只要支持容器,也可以采用类似的办法做部署。
我这里依旧以群晖为参照,首先打开群晖的 File Station 中的 docker 目录,在目录下创建一个新文件夹并将其命名为 readeck(全部是小写字母)。

然后在新创建的这个readeck
文件夹里面,在分别创建data
以及db
两个文件夹。这两个文件夹后面用来存储服务中所产生的数据。

接下来我们就打开 Portainer 来进行服务容器的部署,这里打开并登录 Portainer,然后从左侧边栏中点击 Stacks,然后点击页面右上角的 Add Stack
来添加。

在新创建的 Stack 的 Name 里面填写readeck
,然后在 Build method
这里选择 Web editor
,接着在下面内容直接复制到编辑器中:
version: "3.9"
services:
readeck:
container_name: Readeck
image: codeberg.org/readeck/readeck:latest
mem_limit: 8g
cpu_shares: 1024
security_opt:
- no-new-privileges:true
restart: on-failure:5
ports:
- 4522:8000
volumes:
- /volume1/docker/readeck/data:/readeck:rw
environment:
READECK_USE_X_FORWARDED: true
READECK_DATABASE_SOURCE: postgres://readeck:readeckpass@readeck-db:5432/readeck
readeck-db:
image: postgres:16
container_name: Readeck-DB
hostname: readeck-db
mem_limit: 1g
cpu_shares: 768
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "readeck", "-U", "readeck"]
timeout: 45s
interval: 10s
retries: 10
volumes:
- /volume1/docker/readeck/db:/var/lib/postgresql/data:rw
environment:
POSTGRES_DB: readeck
POSTGRES_USER: readeck
POSTGRES_PASSWORD: readeckpass
restart: on-failure:5
按照上面填写完成后,这里点击下方的「Deploy the stack」来部署容器,然后等待出现容器列表就表示部署成功了。

P.S:有关 docker 文件存储路径也需要留意,如果你的 NAS 有多个卷,最好能够核对自己创建文件夹的绝对路径,从而避免出错。
配置 Readeck
当容器正式启动后,这时打开浏览器并访问:http://你的 NAS 地址:4522 ,如果可以访问到Readeck 的登录页面就表示完全部署成功了,如果你和我一样,是部署到本地的 NAS 中的,那么如果想要从外网访问还需要通过 ddns 或者内网穿透的方式将服务暴露到公网中,这里我就不过多赘述了。

在注册页面中首先输入你未来需要登录 Readeck 的账号和密码,最后点击 Finish installation 来完成最后的注册。登录后你就可以看到 readeck 的列表页面,这就表示你已经成功完成了全部的安装工作。而既然是一款稍后读应用,那么自然少不了就是测试一下他的阅读模式的处理能力,这里我直接在 Readeck 上点击上方添加地址处贴上少数派的某篇文章的链接,然后点击「Save Link」来保存链接。

这个保存并处理的过程非常快,稍等片刻 Readeck 就会完成处理并添加好作者以及标题,甚至还会自动生成稍后读文章卡片的封面图,而点击进去后可以看出会将一些无用的元素都进行清理,保留成适合手机进行阅读的「阅读模式」的效果。同时你还可以对阅读的效果进行设置,比如选择字体、字号以及对行高进行设置。

同时你还可以对不同的文章打上特定的标签,方便的进行进一步的分类归档操作,而在晚间阅读时如果你觉得背景比较刺眼,也可以点击侧栏中的更换主题来切换成暗色模式。

Readeck 进阶用法:用更简单的方式发送文章
Readeck 服务部署完毕并且进行了基础设置,那么接下来我们发送需要稍后读的文章/网页了,毕竟如果每一次添加稍后读的文章链接都需要打开 readeck 并点击「Save Link」显然非常繁琐,事实上 Readeck 提供了和很多商业服务类似的方式,可以让我们非常方便的将看到的文章发送到 Readeck 中。
使用浏览器的扩展程序发送文章/链接
如果你使用的是桌面浏览器来浏览网页内容,那么最为简单的办法就是通过浏览器的扩展程序,Readeck 提供了 Chrome/Firefox 两个主流浏览器的扩展程序,这里只需要在相应的扩展程度市场中下载安装,然后点击扩展程序后输入你的账户名、密码以及服务的具体地址,然后点击 Login 就可以完成登录绑定操作。

登录完成后,当你需要将正在浏览的网页发送到 Readeck 时,就只需要点击扩展程序栏中的 Readeck 图标,然后等待其完成保存即可。如果不放心你还可以登录 Readeck 中,看看你点击发送的这篇文章是否已经被收藏进来了。

在 iOS 上使用快捷指令来收藏文章
我习惯在手机端浏览器网页,会将合适的内容也会将其发送到稍后读中,这同样在 Readeck 中也可以这样操作,只不过由于 Readeck 并没有提供手机客户端,因此这里需要自己通过第三方工具来实现,至于 iOS 上则是通过快捷指令来进行操作。

不过在使用快捷指令操作之前,我们首选需要为这些操作来创建新的 API 密钥,这里先登录你的 Readeck 服务,然后点击 Profile - API Token,然后点击「Create a new API token」来创建一个新的 API Token,这里只需要将生成的「Your API token」下面的字符串保留下来备用即可。

接下来,使用 iOS 上的浏览器打开这个地址,然后点击「Download Shortcut」保存到你的快捷指令集中,接下来点击「Send Page To Readeck」这个快捷指令卡片的编辑按钮,在第一个注释下方的文本框中填写 Readeck 的公网访问地址,在第二个注释下方的文本框中,把刚才保存的 API Token 复制进去,然后点击右上角的完成来保存。

那么如何发文章到 Readeck 呢?当你使用 Safari 浏览器访问网址时,点击下方的分享按钮并在分享菜单中选择 Send Page To Readeck,然后等待快捷指令跑完即可,这时候你再访问 Readeck 就会发现刚才在 Safari 浏览的网页已经被发送到 Readeck 中了。

在 Android 上使用 HTTP Request Shortcuts 来收藏文章
相比于 iOS 上有系统级别的快捷指令,Android 上一直以来都没有系统级别的「脚本工具」,因此要想实现类似的操作将网页添加到 Readeck 就只能依赖第三方工具了,这里我们就需要用到这个 HTTP Request Shortcuts 这款应用来编写一个添加文章的脚本。

首先还是打开 HTTP Request Shortcuts,首先点击右上角的汉堡菜单,点击「变量」来创建三个变量:
- 第一个变量叫做
readeck_shared_url
,变量类型为「输入文本」,需要注意的是这个变量的高级设置里面需要勾选「允许分享」,要从分享获得的数据为「仅文本」。 - 第二个变量叫做
readeck_url
,变量类型是「常量」,这里需要填写值,这个值就是你部署的 Readeck 服务的公网地址。 - 第三个变量叫做
readeck_token
,变量类型是「常量」,这里也需要填写值,这个值就是前面我们从 readeck 的 API Token 中保存下来的 Token 值。

紧接着,点击主页右下角的 +
然后选择「从头创建」来创建一个新的快捷方式,这里名称你可以随便命名,可以像我一样将其命名为「Add To Readeck」,然后在基本设置中,选择方法为Post
,url 这里输入值{readeck_url}/api/bookmarks
。
在请求体/请求参数这里,这里设置返回体类型是参数(x-www-form-urlencoded)
,下方的参数为url
,值是{readeck_shared_url}
。
在认证这里,选择认证方式为「令牌认证」,令牌为{readeck_token}
。全部编辑好之后点击右上角的对勾确认保存,至此发送网页脚本就正式编辑完成了。

那么怎么使用呢?这里只需要使用浏览器打开一篇文章,然后点击分享来展开 Android 系统的原生分享菜单,这里就可以看到刚刚我们创建的这个名为「Add To Readeck」的图标,点击后会提示该脚本已经执行,只要不报错就表示网页已经成功提交到 Readeck 中了,如果不确定可以到 Readeck 的文章列表中查看是否已经发送成功了。
Readeck 进阶用法2:在不同的平台使用不同的姿势阅读
既然文章都已经上传到 Readeck 中了,那么该如何进行阅读呢?和其他商业产品不同的是 Readeck 并没有推出专门的阅读客户端,不过好在 Readeck 提供了很多丰富的阅读方式,体验上还是相当不错的。
Readeck 的准官方客户端:PWA 应用
如果只是用来阅读,那么实际上使用 Web 网页就完全够用,而 Readeck 也已经支持以 PWA 的形式进行安装,那么最为简单的方式就是将其安装成 PWA 应用——使用浏览器访问你部署的 Readeck 服务,桌面端点击地址栏的安装来将其安装成 PWA 应用,至于移动端也是类似。而整体体验下来个人觉得已经足够满足使用需求——尤其是 Readeck 的网页端也针对移动设备进行了优化,阅读沉浸感还是很不错的。

在移动端通过支持 OPDS 的阅读应用来阅读
Readeck 原生支持 OPDS——通过访问路径的形式可以将保存的稍后读文章以电子书的形式发布,这样我们看文章的体验就会和通过电子书类似,那么如果你平时习惯在手机上通过阅读应用来看书,那么就可以将 Readeck 添加成书库在应用中阅读。

这里,iOS 上可以使用这个名为 cantook 的应用来实现,打开这款应用并点击导航栏中的「书店」同时点击右上角的添加,然后再选择「手动添加书店」,在弹出的新建目录名称和链接对话框中,填写目录名称(这里随便写)以及目录链接(https://你的书库地址/opds)后,然后点击添加,这时候再点击书店中的新保存的这个新书店,根据提示输入你的 readeck 的账户和密码,就可以顺利进入到目录中了,只不过进入阅读后你会发现还是访问的是 Readeck 的网页端而已。至于 Android 上,支持 OPDS 目录的阅读应用也有不少,比如静读天下也支持挂载 OPDS 目录,这里我就不过多的赘述了。
总结
经过一段时间的试用,我正式将自部署的 Readeck 作为我的主要稍后读服务,并且实现了我接触的场景下全平台的发送网址/阅读解决方案,虽然相比商业化的稍后读服务需要自己手动配置多种服务,但由于是自部署的服务,数据安全和网络访问上其实要比商业化的服务要更为可靠,如果你和我一样之前使用的是海外的商业化的稍后读服务,不妨尝试自己部署 Readeck让数据掌握在自己手中。
> 关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀