in 偶知道

个人 VPS 上的服务安装(未完稿)

这篇文章要讨论的是,如何在一台轻量级的 VPS 服务器上,基于自己的域名,同时安装如今各种流行,去中心化的网络服务:

  • 个人博客:Wordpress
  • ActivityPub 社交网络:Pleroma 或 Mastodon
  • Matrix 聊天服务器:Synapse 或 Dendrite
  • 个人网盘和在线办公套件:Nextcloud

然而,原本我一直在用 Linode 每月 5 美元,1C1G(1个CPU,1G内存)的服务器,打算安装的服务,也是基于这个级别的配置。然而弄到一半,突然被乔乔推荐了 Contabo 每月 5 欧元(要一次缴一年,不然有额外费用),4C8G 的服务器。虽然实际速度和网速,并不比 Linode 或 Vultr 好多少,但 8G 内存,选择各种服务的余地可就大多了。所以我整理出来的 1C1G 方案,自己并没有在用……原因我后面会说。

之前也犹豫,既然同样价钱都能 4C8G 了,那为啥还要写 1C1G 的方案?很快大家的配置也都会变高级了吧?但想想也未必,还是整理一下吧。


这篇文章讨论如何在轻量级服务器里塞进各种服务。——前提是这台服务器,假定只会有你一个人在用,最多加上你的闺蜜和男朋友。我并不知道几十个用户的 Mastodon 会有怎样的开销,至少在 1C1G 上这样做非常不靠谱。我所面向的,只是两三个好友自用的私人 VPS 而已。

这篇文章不是写给小白用户的。整个系统还是很复杂的。指望有一个教程,或者一个 docker-compose,能够让完全不懂 Linux 的用户,通过逐行复制命令,就能搞定所有的安装,目前还不现实。你至少要有在完全理解的基础上,用 LNMP 搭出 Wordpress 的能力。所以我也没必要把用过的每一条命令,都放在这篇文章里。——对于每一项服务,我会尽量给出相关靠谱攻略的链接,并且讨论一下里面的坑,和我个人所作的选择。

所以,其实这篇文章本质上就一句话:

是的,这些服务都可以装到一台机器上,不冲突。我弄过了,没问题,你们放心慢慢弄吧。


安装环境:一台 1C1G(或更好的) VPS 服务器,一个你自己的域名。

Linux 系统,我用的 Debian 10。主流版本的 Debian 或 Ubuntu 应该都没问题。

Mastodon 的官方安装教程里,要求用 Ubuntu 18.04,但也不必这么教条。用其它系统的话,只是在教程最初安装的软件包里,一些包的名字会不同(譬如 libgdbm5 或 libgdbm6),仔细读一下命令运行后的提示,是否都安装成功,有失败的手动改一下包的名字,就可以了。(btw,那个教程已经过时了,最新的 Mastodon v3.3.0 会要求你安装 Ruby 2.7.2,而不是教程里的 2.6.6)

发送 email 的 SMTP 服务器不是必须的。虽然几乎所有服务都要求你填 SMTP,但对于 2˜3 个人用的私人社区来说,不需要通过邮件来发送验证码,前端用户注册后,后台用管理员账户直接手动批准就可以了。

btw,基于个人域名的 email 服务(而不仅仅是 SMTP 发送邮件服务),我推荐 Yandex,这可能是现在唯一一家,提供免费域名托管邮箱,且开放 POP/IMAP 功能的了。

涉及的服务:

  • 网络服务器:Nginx
  • https 证书:Certbotacme.sh
  • 数据库:PostgreSQL
  • Blog:Wordpress(Php)
  • ActivityPub:Pleroma(基于elixir,1C1G 推荐) 或 Mastodon(Ruby)
  • Matrix:Synapse(Python) 或 Dendrite(GoLang)
  • 网盘:Nextcloud(Php)

关于 Docker,1C1G 的配置下,我觉得所有的服务都没有必要用 Docker。配置更高的情况下,一些服务用 Docker 会轻松一些,以后升级的时候,也会少跳很多坑(我说的就是 Mastodon)。但麻烦的地方在于,每个 docker-compose 项目里,都会部署一个单独的数据库,如何让它们共享一个 PostgreSQL,有很多需要手动配置调试的地方。

我在 4C8G 上,用了 Docker 的有:PostgreSQL、MySQL(这个后面说)、Mastodon、Synapse、Nextcloud


WordPress & 数据库

首先要配的当然是 blog,这才是个人域名的灵魂所在!那些折腾的欲仙欲死把 Mastodon 换成自己域名,却不用 blog 的人,实在是……(告诫自己:不要 mean)

我不排斥静态 blog。Hugo、Hexo…都很好用也很好看;但我实在不习惯每次写完文章,还要跑回自己的电脑才能编译上传,这种把自己限制住的感觉。相比之下,还是 WordPress 随便哪台机器,打开浏览器就能发文,要舒服很多。

WordPress 默认运行的是 MySQL 数据库,而其它服务运行的都是 PostgreSQL。在 1C1G 上同时运行两套数据库,内存立刻就撑爆了,所以把所有服务都放在同一套 PostgreSQL 里,还是需要的。

但是在这么做之前,慎重考虑。实测 Wordpress 在 PostgreSQL 上完全能够正常运行,从零开始搭建一个基于 PostgreSQL 的 Wordpress 也很简单。然而,对于已有的 Wordpress,无论是 MySQL 搬家到 PostgreSQL,还是以后 PostgreSQL 搬回 MySQL,都是很折腾的。如果你不是很确定以后让 blog 永远跑在自己的 PostgreSQL 服务器上,或者是有其他朋友的 blog 放在你的服务器上,以后还可能搬走,那么我不建议你把 Wordpress 换到 PostgreSQL 上面。

我在自己的 4C8G 服务器上,因为还放了几个朋友的 blog,所以并没有做数据库的迁移,而是又装了一套 MySQL,装在 Docker 里面(这个无所谓),日常占用 560M 内存。

注意,本地程序访问数据库,有两种途径:通过本地 socket、或通过 tcp 端口。如果把数据库装在 Docker 容器里面,就只能通过端口访问。在 WordPress (以及其它很多程序)里设置数据库地址时,如果写 localhost,是走 socket 途径,会连接不到;要写成 127.0.0.1,才会通过端口连接。/ 另外每种数据库(MySQL or PostgreSQL,直接安装 or Docker,甚至不同版本号),默认是否能通过端口连接,可能都不一样,需要仔细鉴别。

WordPress 使用 PostgreSQL 的方法:

1. 下载 PG4WP

git clone https://github.com/kevinoid/postgresql-for-wordpress.git

`2. 把 pg4wp 文件夹放入 Wordpress 的 wp-content 文件夹,再把 wp-content/pg4wp 里面的 db.php 文件,复制到上一层的 wp-content 文件夹里。

3. 如果不是默认端口,要在 wp-config.php 里添加 DB_PORT。

WordPress 从 MySQL 迁移到 PostgreSQL 的方法:

1. 最简单的,其实是用 Wordpress 后台界面里自带的导出导入功能(Tools – Export/Import)。但这么搞最大的问题是,重新导入后,每篇文章在数据库里的 id 就不一样了。如果你的文章的链接里,用的是序号而不是标题,那么以往的链接会彻底乱掉。

2. 把数据库里每个表导出 csv,再去新数据库里导入。这么做很麻烦,我没试过。也可能会找到相关脚本进行自动处理。

3. 用工具从 MySQL 迁移到 PostgreSQL,虽然两个数据库有很多不兼容的地方,但 Wordpress 也并没有用到特别复杂的数据结构,所以简单的数据转换还是可以做到的。我用的 pgloader,挺好用。但似乎还不能在 PostgreSQL 12 上工作。

MySQL 的 mysqldump 命令,曾经有个 –compatible=postgresql 的参数,号称可以导出兼容 PostgreSQL 格式的 SQL,——然并卵,导出来的 SQL 并不能直接导入 PostgreSQL,需要用脚本进一步转换。而且这个参数,在 MySQL 8.0 里,已经不能用了。

Mastodon vs Pleroma .

首先,Pleroma 比 Mastodon 轻量非常非常多!在用 Docker 安装,刚刚安装完,只有一个用户,还没发文的初始状态下。Mastodon 占用的内存,是 Pleroma 的 5 倍还多……Mastodon 自身的三个服务,是把一份 Docker Image 连开了三个 Containers,简直令人发指。

Pleroma Dockers,总计 200 M 内存:
database – 40 M
web – 160 M

Mastodon Dockers,总计 1030 M 内存:
database – 60 M
redis – 15 M
web – 590 M
sidekiq – 315 M
streaming – 50 M

Mastoson 在直接安装,不用 Docker 的情况下,会好一点点,也要超过 800M 的内存,等用户开始正式使用后,还不知会增加多少开销。理论上 1G 内存加上 swap,也是够单用户的 Mastodon 勉强过活的,但不知什么时候会崩,更不要说同时装其它服务了。

所以 1C1G 的服务器,完全不建议装 Mastodon。有人号称 Pleroma 的界面不好看,这纯属个人观点差异,而且用 app 的话,二者完全没区别。Pleroma 界面清爽,开销小,据说还支持 xmpp 聊天,它不香么~~ 我 4C8G 的高端机,都忍不住想扔了 Mastodon 来装 Pleroma。

只有一个问题。

在 Pleroma 里,用户名和入口页面,必须是同一个子域名。在
https://pleroma.domain.com/ 下面安装的 Pleroma,用户 id 也只能是
@user@pleroma.domain.com,而不能另设成
@user@domain.com

而 Mastodon 则可以把 WEB_DOMAIN 和 LOCAL_DOMAIN 分开设置。在使用根域名
@user@domain.com 作为用户 id 的同时,把 Mastodon 本身的网页放到
https://mastodon.domain.com/ 之类的子域名上,从而把根域名
https://domain.com/ 还能留作自己的个人首页。

Pleroma 社区从 3 年前就有人提类似的需求,但直到现在貌似没有靠谱的解决方案,还不时有人对这个需求表示鄙视……

  • “Pleroma does not consider webfinger to be a source of truth, so there is no bug here. If you want Mastodon’s broken vanity domains, use Mastodon.” — kaniini

好吧,我承认我想要个美型的根域名 id 是很虚荣啦。我也确实反思过,要是我只有 1C1G 的服务器,我也肯定就去用 Pleroma 的子域名 id 了。基于对 Mastodon 浪费资源的厌恶,我确实很想在 4C8G 上也装 Pleroma 的。但纠结了两天之后,还是去享受 Mastodon 的根域名 id 了……

安装 Pleroma

安装 Pleroma 的官方教程,和 Docker 的教程。1C1G 要不要用 Docker,其实都无所谓,看个人选择。Docker 因为 container 里的更改不能被长期保存,所以想要对界面、表情包之类做魔改的话,很不方便。而且 Pleroma 的 Docker 的版本因为要添加密钥文件,所以需要用户在本地重新编译 Docker Image,也满麻烦的。但系统升级时,相对还是比直接安装方便吧。

安装 Mastodon

安装长毛象的中文攻略,应该已经很多了,连官方都有了中文文档

Docker 安装时,我看了 pullopen 的攻略,总体很顺畅,但细微处也难免有坑。

======
redis 的某些 docker 版本,默认只能本地访问。需要在 docker-compose.yml 里,把本地的配置文件添加到容器内
- ./redis.conf:/etc/redis/redis.conf
然后获取配置文件样本
wget http://download.redis.io/redis-stable/redis.conf
编辑
# bind 127.0.0.1 # 注释掉一行,这里限制 redis 只能本地访问
protected-mode no # 默认 yes,改为 no

======
如果没有设置在云端保存媒体文件,而选择在本地保存的话,好像会访问容器内的 opt/mastodon/system ,产生某些权限冲突?我之前看到报错后没仔细看,就继续设云存储去了。关于云存储,pullopen 也写过 Scaleway 的设置教程。但现在 Scaleway 界面里,显示给你的 Endpoint 地址已经变成了
https://your-bucket-name.s3.nl-ams.scw.cloud 的样子,不用管,在 Mastodon 的 .env.production 里,仍然用原先的
https://s3.nl-ams.scw.cloud (我用的荷兰,选法国的改成 fr-par)。Nginx 里也用这个短的地址,不然系统拼出来的云文件链接会错掉。

Matrix

待续

Nextcloud

Write a Comment

Comment

  +  3  =  10