我以为我会像大多数人一样,开始拥有一台服务器时就会搭建一个属于自己的博客站点。但当我自己尝试部署了一次 GitHub 上的开源项目时,我发现除了搭建博客之外,用云服务器来搭建一些自用的服务也是一个不错的选择。

可能这些自部署的(self-hosted)开源服务或项目不一定比付费产品好用,拥有的特性也没那么丰富,但这些年得益于像 Docker 这样的容器化技术普及,短短几行代码就能快速完成项目或服务部署、进而开始使用也早已不是什么高成本的事。自部署让我们享有绝对的数据掌控权的同时还能节省不少订阅费用,让闲置的云服务器得以充分利用。

本文所介绍的可自部署项目或服务主要使用 Dockerdocker-compose 来完成快速部署,所以如果你打算尝试,除了拥有购买一台云服务器外,可能还需要额外学习一下 Docker 的基本用法。

另外现在有的 NAS 设备也支持 Docker,因此如果没有服务器但有 NAS 设备,也可以尝试部署在你的 NAS 上——前提是你有一个独立的公网 IP 或知道如何通过内网穿透来实现远程访问。

消息推送服务

除了系统自带的消息通知渠道之外,我们也可以自己拥有一个消息推送服务。基于自部署的消息推送服务,我们可以配合其他自动化工具来监控通知或是短信,实现消息转发等功能。

可选服务包括:

上述不同的消息推送服务其后端均使用 Go 语言进行编写,因此在部署上并没有太多难度,按部就班地照着官方文档给出的操作步骤部署在你的服务器之后就可以开始使用;并且它们均提供了相应的 API,在部署之后可自行根据需要使用 API 来将消息推送至相应的设备。

因为我个人使用的是 Gotify,所以这里我就以 Gotify 为例直接运行 Docker 命令即可完成部署:

docker run -d \
  -e TZ="Asia/Shanghai" \
  -e GOTIFY_SERVER_PORT=8004 \
  -p 8004:8004 \
  -v /var/gotify/data:/app/data \
  gotify/server

Gotify 本身提供了 Web 界面,部署完成后我们需要到 Web 界面中创建推送消息或通知的 App,获取到 App 所对应的 Token,最后在移动端上进行连接配置即可。

在 Web 界面上我们仅能接收并看到来自于其他端(比如移动端)推送的消息。

如果我们需要向移动端推送消息通知,那么我们就需要通过 API 来完成消息推送,就像官方所给出的示例一样:

curl "https://gotify.myserver.com/message?token=<apptoken>" \ 
    -F "title=来自服务器的一则消息" \ 
    -F "message=Hello,Mobile!" \ 
    -F "priority=10"

之后就能在移动端上收到来自于服务器的通知:

因此使用 Gotify 这类消息推送服务最好的方式就是与自动化操作相结合,从而达到消息通知的目的。

在线阅读服务

相信会有不少人跟我一样喜欢在大屏幕设备上进行阅读或浏览内容,既然我们拥有了云服务器,那也说明我们拥有了可对外公开且被访问的公网 IP。因此我们在服务器上也可以搭建起自己专属的在线电子图书馆,在不同设备上只需要借助浏览器就能进行随时随地开始阅读。

Calibre-Web

Calibre-Web 是基于知名的电子书籍管理软件 Calibre 元数据进行实现的 Web 版本,相较于 Calibre 桌面端而言界面变动较大,但基本上支持主流的电子书格式,也提供了对应的阅读器直接在线阅读。

图源 Calibre-Web 项目仓库

需要注意的是,Calibre-Web 官方并未提供对应的 Docker 部署文件,所以我们需要基于 LinuxServer.io 这一组织所提供的 Docker 文件来进行配置和部署:

docker run -d \
  --name=calibre-web \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -p 8083:8083 \
  -v /path/to/data:/config \
  -v /path/to/calibre/library:/books \
  --restart unless-stopped \
  lscr.io/linuxserver/calibre-web:latest

因为 Calibre-Web 是基于 Python 编写,所以在使用的过程中会出现内存资源占用较大的情况(目测下来有 500 MB 左右的内存占用)。如果你服务器资源配置吃紧请谨慎选择,又或者是在使用过程中到管理面板中手动重启(你没听错,就是这么朴实无华)。

Kavita

Kavita 和 Calibre-Web 类似,是一款功能丰富且运行迅速、支持跨平台的阅读服务器。

图源 Kavita 官方

部署 Kavita 同样很简单:

docker run -d \
  --name kavita \
  -p 5000:5000 \
  -v /your/manga/directory:/manga \
  -v /kavita/data/directory:/kavita/config \
  --restart unless-stopped \
  kizaing/kavita:latest

Kavita 相比于 Calibre-Web 来说对于漫画系列的电子内容支持度会更好一些,而对于电子书格式的支持目前仅有 EPUB 和 PDF 格式,所以实际上的阅读体验反而是 Calibre-Web 会更好;但服务器资源占用会比 Calibre-Web 更低。

笔记、记录类服务

除了搭建个人博客之外,打算利用服务器来构建个人知识管理系统或存储想法记录等需求的用户可能也不在少数。

自部署可以让数据掌握在自己手中,无须担心平台跑路或是数据安全问题。

Memos

Memos 是一款开源、可自部署的 Flomo 仿制项目,它大致还原了 Flomo 基本功能,并且也提供多用户注册;当然如果你像我一样只是自用,那么完全可以将其用作一个无话不说的「树洞」来使用。

图源 Memos 官方

Memos 默认只支持 Web 端,并提供了中文语言支持、以及亮色和暗色两种主题自动切换等功能,当然也少不了像 Flomo 一样提供了 API 支持,以便接入其他自动化工具实现内容的快速记录。

部署 Memos 的 Docker 命令很简单,这里是官方给出的一个例子:

docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos/:/var/opt/memos \
  neosmemo/memos:latest

部署成功之后只需要自行注册一个账户就可以开始使用。

如果你想在手机上使用 Memos,那么在搭建好 Memos 之后可以使用 Memos 官方推荐的第三方的 Moe Memos 填写服务器地址和用户认证信息,登录之后即可正常使用。

图源 Moe Memos 官方

思源笔记

正如官方所说的那样,思源笔记是一款「本地优先的个人知识管理系统」,支持完全离线使用和端到端加密同步,同时也提供了数据导出功能。并且思源笔记也拥有新世代笔记软件们所具有的功能,如融合块、大纲和双向链接等。

图源思源笔记官方站点截图

思源笔记完全开源,并且提供了全平台支持,除了云端功能需要付费之外你完全可以免费使用。但既然我们是在服务器上部署,当然就还是选择 Docker 版本。部署的过程十分简单,这里给出操作步骤:

首先,我们需要在服务器上创建一个用于存放数据的文件夹路径,并为其添加对应权限。比如我个人就是放在了 /data/self-hosted/data/siyuan/workspace/ 中,那么就需要通过 Linux 命令建立对应的文件夹,并且为该文件夹添加对应用户权限:

mkdir -p /data/self-hosted/data/siyuan/workspace/
chown -R 1000:1000 /data/self-hosted/data/siyuan/workspace/

之后我们只需要通过容器部署即可,对应的 Docker 命令 和 docker-compose.yml 参考如下:

Docker 命令:

docker run -d -it \
    --name siyuan \
    -v /self-hosted/data/siyuan/workspace/:/siyuan/workspace \
    -u 1000:1000
    -p 6806:6806 \
    --restart=always \
    b3log/siyuan:latest

docker-compose.yml

version: '3'

services:
  siyuan:
    image: b3log/siyuan:latest
    container_name: siyuan
    environment:
      - TZ=Asia/Shanghai
    user: '1000:1000'
    restart: always
    ports:
      - 6806:6806
    volumes:
      - /data/self-hosted/data/siyuan/workspace/:/siyuan/workspace

部署成功之后我们只需要访问 <服务器IP>:6806 就能进入到 Web 端的思源笔记界面:

需要注意的是,默认情况下我们所在服务器上所部署的思源笔记是不具备数据同步功能的。思源笔记提供了三种选项,一种是订阅思源笔记官方的云端同步付费,另外两种则是自行配置兼容 Amazon S3 协议的云存储服务和 WebDAV。我们可以点击左上角的工作间区域,然后找到「设置 - 云端」中进行配置。

如果你不打算选择思源官方的付费订阅又或是第三方的云存储服务,而是想继续折腾并自己部署的服务来同步数据,那么也有对应的方案可以选择:

  • 使用 Minio 来作为兼容 Amazon S3 协议的云存储服务;
  • 使用 SFTPGo 来提供 WebDav 服务。

Joplin Server

如果你正在寻求一款能替代印象笔记的应用,或许可以试试 Joplin。

图源 Joplin 官方站点

Joplin 是一款开源的笔记应用,它和思源笔记一样提供了全平台支持,并且具备和印象笔记类似的网页剪藏功能、拥有丰富的插件社区、支持端到端加密(E2EE)等功能。不过,Joplin 和思源笔记一样,默认都是不提供云端数据的同步服务(即需要付费才可使用)。

但是!Joplin 可以允许你自己在服务器上架设、部署自己数据同步服务,即 Joplin Server

借助 docker-compose,我们可以在短短几秒之内就可以快速搭建起 Joplin 数据同步服务。注意,默认情况下 Joplin 的数据都是存储在数据库中;但是,如果在使用过程中存储类似于附件、图片等体积较大的文件,可能需要设置额外的对象存储服务。所以这里我仅给出能跑起 Joplin Server 最基本的 docker-compose.yml 文件示例:

version: '3'

services:
    postgres:
        image: postgres:latest
        container_name: postgres
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        ports:
            - "5432:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=joplin

    joplin:
        image: joplin/server:latest
        container_name: joplin
        depends_on:
            - postgres
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=${APP_BASE_URL}            # your server ip, like: http://xxx.xxx.xxx:22300
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=joplin
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=5432
            - POSTGRES_HOST=postgres

搭建成功之后需要根据 Joplin 官方的说明文档登录对应的管理员账户并修改默认密码;之后我们只需要在 Joplin 应用端的设置界面中找到「同步」选项,选择使用「Joplin Server」,并填写对应部署了 Joplin Server 的服务器地址以及管理员账户密码即可完成同步设置:

Anki-Sync-Server

Anki 是一款辅助学习与记忆的卡片工具,对在校的学习党来说并不陌生。并且 Anki 也免费提供了数据同步服务,我们只需要在官网上自己注册账号之后便能开始使用。

可对于大多数 Anki 使用者来说最为苦恼的就是 Anki 官方所提供的数据同步服务延迟较大,所以在国内使用时,不同设备之间同步卡片或学习进度时总要干等一段时间。

好在 Anki 社区中有第三方开发者开发了适配 Anki API 的同步服务项目 anki-sync-server,该项目虽然使用的是 Python 编写,但也提供了一键容器化部署的脚本。不久后又有人使用 Rust 语言来重写了 anki-sync-server,即 anki-sync-server-rs,相比于前一版而言不仅部署更为便捷、响应性能有所提升,甚至还有效降低了服务器资源的占用。

如果你打算自己部署 Anki 同步服务,那么我建议你优先选择 anki-sync-server-rs。具体的 Docker 命令如下:

docker run -d -it \
    --name=ankisyncd \
    -e ANKISYNCD_USERNAME=<your-username> \
    -e ANKISYNCD_PASSWORD=<your-password> \
    -v /path/to/ankisyncd:/app
    ankicommunity/anki-sync-server-rs:latest

上述命令中我参考了官方的 Dockerfile 内容并在文档的 Docker 命令基础上加入了 -v 参数以便将数据内容挂载在服务器上,以方便数据持久化、避免数据丢失,也利于后续备份,在运行时除了用户名和密码之外,可以指定任意你喜欢的路径。

部署完成之后,不论是桌面端还是移动端使用 Anki,均要进行设置后才能进行同步;但在设置同步之前,请确保对已有的 Anki 数据进行备份。之后的具体步骤官方也给出了详细的操作说明,我们只需要按部就班即可完成操作,这里就不再多加赘述。

在线音乐服务

图源 Navidrome Demo 示例

Navidrome 是一款由 Go 语言编写且基于 Web 的音乐收藏服务器与流媒体,你可以将自己喜欢的音乐放到 Navidrome 上然后在网页或其他移动端设备中收听音乐,从而避免因平台下架导致无法收听歌曲的情况。

部署 Navidrome 没有太大的难度,因为官方提供了比较详细的部署说明,你可以选择 Docker 命令或 docker-compose 来快速完成部署:

docker run -d \
   --name navidrome \
   --restart=unless-stopped \
   --user $(id -u):$(id -g) \
   -v /path/to/your/music:/music \
   -v /path/to/your/data:/data \
   -p 4533:4533 \ 
   -e ND_LOGLEVEL=info \
   -e ND_DEFAULTLANGUAGE=zh-Hans \
   deluan/navidrome:latest

部署成功后并且手动添加了音乐之后,就可以根据 Navidrome 官方列出的 应用列表 来找到适合你设备系统的客户端,并连接上你的 Navidrome 服务器进行收听。

自动化操作服务

拥有了服务器怎么能少得了自动化操作相关的服务?

只要你足够 Geek,全天候 24 小时不停歇的服务器简直就是自动化利器;而关于自动化方面的开源服务或项目又可以说是多不胜数。这里我仅列举几个让我留有印象的项目。

n8n

n8n 类似于 iOS 的快捷指令,是一个开源、具备可扩展性、可自部署的工作流自动化工具,它不仅整合了国外 220 多种常用的应用服务,同时也拥有丰富的第三方模板社区以便人们分享自己的工作流。

但不同于移动端设备,n8n 是运行在服务器之上,在有效利用服务器资源的同时也可以让其他端设备享受到自动化的便捷。

图源 n8n 官网示例视频

n8n 本身有不同的付费计划,但对于个人使用而言,只需要选择自部署的社区版即可满足日常需求。当然我们在部署时同样是使用 Docker 来完成快速上线:

docker run -d \
  --name n8n \
  -p 5678:5678 \
  -v /path/to/n8n:/home/node/.n8n \
  n8nio/n8n

n8n 的部署过程十分简单,默认情况下使用 SQLite 数据库进行存储相关数据;你也可以根据自己的需要选择 MySQL 或是 PostgreSQL,具体可参考 n8n 官方的说明文档

部署完成之后我们只需要访问到对应接口的服务器地址并注册一个账户之后便可以开始自定义自己的工作流。

qinglong

如果不喜欢像 n8n 那样使用拖拽来完成自动化操作,并且你本身又有一点 JavaScript 或 Python 基础的话,那么可以考虑试试 qinglong(即青龙)。

青龙是一款由国人开发且开源的定时任务管理面板,用户编写完成脚本之后可以在上面设置运行时间,从而实现自动化运行。

图源青龙面板项目仓库

部署青龙面板我们只需要按照官方给出的 Docker 示例运行即可:

docker run -dit \
  -v $PWD/ql/data:/ql/data \
  -p 5700:5700 \
  --name qinglong \
  --hostname qinglong \
  --restart unless-stopped \
  whyour/qinglong:latest

部署完成之后即可通过访问 <服务器IP>:5700 登录 Web 界面,注册之后即可开始编写或上传脚本代码,并设置运行时间。

Dagu

除了青龙之外,你也可以选择 Dagu——一款基于 DAG(directed acyclic graph,即有向无环图)理念而设计的任务调度与运行的开源工具,它除了可以定时运行任务之外,还可以将多个任务编排在一起,从而构成有依赖的任务工作流。

图源 Dagu 项目仓库

Dagu 本身提供了 Web 界面,并且通过 YAML 文件进行配置,Docker 部署也十分简单:

docker run -d \
  -p 8080:8080 \
  -v $HOME/.dagu/dags:/home/dagu/.dagu/dags \
  -v $HOME/.dagu/data:/home/dagu/.dagu/data \
  -v $HOME/.dagu/logs:/home/dagu/.dagu/logs \
  yohamta/dagu:latest

之后我们只需要到服务器上对应的文件夹路径中放入相应的 YAML 配置文件(具体参考 Dagu 官方给出的例子),之后我们就同样访问 <服务器IP>:8080 地址进入到 Dagu 提供的 Web 界面中进行操作即可。

结尾

受益于容器技术的发展,我们可以通过 Docker 这样的工具来在服务器上快速地自部署开源项目或服务,从而让服务器物尽其用不至于「吃灰」。

不过尽管通过容器部署能减少我们部署时的繁琐步骤,但你依旧可能需要学习一些额外的运维技术,包括如何设置 HTTPS、自动备份数据等等;同时,如果你不想总是通过「服务器 IP 地址 + 端口」的方式来访问服务或者 API,那么除了要购买域名之外,还需要考虑备案等问题(购买非内陆地区服务器则可以省略掉备案这一步)。

当然了,自部署的服务或项目远不止本文所介绍的那么点,如果你对于自部署感兴趣,那么可以到 awesome-selfhosted 项目中去寻找符合你需要的服务或项目。

封面图源 Unsplash。

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀