Pleroma是什么软件可以自行搜索,此处不再赘述。Pleroma最大的优势在于轻量、占用少,支持ActivityPub协议和开源,或许是接入联邦宇宙(Fediverse)成本最低的方式,只需要一个1核1G的任意普通VPS即可将Pleroma流畅运行起来。由于Pleroma在Debian/Ubuntu上使用Docker不好配置数据库,对于我等Linux新手而言只能按照官方文档操作采用OTP安装,OTP安装方式利于维护和软件更新,体积也比Docker安装小。本文采用使用的VPS配置为AMD64 1C1G 40GBSSD。

Soapbox,本文主要指Soapbox FE,是Pleroma的一个前端,提供了比Pleroma FE设计语言更现代的界面。Caddy是一个使用Go语言编写的Web服务器,不仅体积小巧,而且相比于Nginx容易配置,易用性高,非常适合新手,缺点是性能表现、负载均衡不如Nginx,不适合大流量网站。

Pleroma官方给出的安装文档比较详细,中文安装教程网上已有,如“在 Debian 10 / Ubuntu 20.04 上安装 Pleroma”,本文不再重复介绍相同的流程,只记录我踩的一些坑。

安装Caddy

建议通过Caddy官方网站下载已经编译好的二进制包,比较省力。进入到Caddy下载页面不要急着点Download,先根据域名所在的DNS服务器安装对应的Caddy插件,例如我是使用Cloudflare的DNS,在Fliters packages and modules中搜索Cloudflare,选中 caddy-dns/cloudflare 插件后再下载。将下载好的二进制包上传到VPS的/usr/local/bin即可在SSH终端中使用。

Caddy安装完成后先不管它,直接安装Pleroma。

安装Pleroma

  1. 检测一下环境,设置环境变量
arch="$(uname -m)";if [ "$arch" = "x86_64" ];then arch="amd64";elif [ "$arch" = "armv7l" ];then arch="arm";elif [ "$arch" = "aarch64" ];then arch="arm64";else echo "Unsupported arch: $arch">&2;fi;if getconf GNU_LIBC_VERSION>/dev/null;then libc_postfix="";elif [ "$(ldd 2>&1|head -c 9)" = "musl libc" ];then libc_postfix="-musl";elif [ "$(find /lib/libc.musl*|wc -l)" ];then libc_postfix="-musl";else echo "Unsupported libc">&2;fi;echo "$arch$libc_postfix"

如果终端输出了服务器架构(例如我的终端输出了amd64),大概率是可以使用OTP安装的,则输入命令以设置Flavour环境变量:

export FLAVOUR="amd64"

amd64替换为对应服务器终端。若终端提示不支持的架构Unsupported arch...,只能自行编译源代码安装了。

然后开放22、80和443端口,如果需要在本地调试的话开放一下4000端口也没问题,确保后三个端口没有服务占用。

  1. 安装依赖
apt install curl unzip libncurses5 postgresql postgresql-contrib libmagic-dev

安装可选依赖,Suica的教程建议全部安装,那就全部安装。

apt install imagemagick ffmpeg libimage-exiftool-perl

官方文档中安装了Nginx和Certbot,我既然已决定使用Caddy,就不需要安装这些依赖了。

  1. 配置PostgresSQL

官方文档建议小实例不必安装RUM索引,除非对搜索结果要求较高,那就少一事是一事,不安装。

对于我等新手,配置PostgresSQL绝非易事。为了优化性能,可以使用 pgTune 生成推荐配置,并根据推荐配置调整 /etc/postgresql/12/main/postgresql.conf 中的相应数值:

nano /etc/postgresql/12/main/postgresql.conf

注意调整路径中的版本号12为实际安装的PostgresSQL版本,可输入find / | grep postgresql.conf查找postgresql.conf所在路径,下同。

接下来按照文档指引一路粘贴即可完成Pleroma的安装。

不过需要注意的是static 文件夹最好选择/var/lib/pleroma/static,避免后续Soapbox FE安装不成功。Pleroma的config配置文件在/etc/pleroma/config.exs

配置Caddy

Pleroma的代码仓库给出了Caddy配置的示例文件,将example.tld替换为Pleroma站点域名,域名应当与Pleroma的config.exs文件中一致。

按照官方给出的配置文件,我们确实可以通过HTTPS访问站点,但如果决定使用CDN,还是需要配置一下HTTPS。我的站点直接使用了Cloudflare CDN,SSL证书直接由Cloudflare签发,因此只需要在配置中“提醒”一下Caddy,为了使Caddy联系上Cloudflare,需要添加账号的API令牌。

前往Cloudflare网站创建账号的API令牌,只需要给予令牌配置对应域名DNS的权限即可。如果不需要任何CDN,则删去tls段即可。

example.tld {
	log {
		output file /var/log/caddy/pleroma.log
	}
	encode gzip
	reverse_proxy 127.0.0.1:4000
	tls {
		dns cloudflare $CLOUDFLARE_API_TOKEN
	}
}

配置完成后测试Caddy,

cd /etc/caddy
caddy start
# 若提示成功,则将Caddy设置为系统进程,
caddy stop
systemctl start caddy

访问example.tld,大功告成了……一半。

Pleroma后续配置

在安装时已经对Pleroma的config.exs文件进行配置,此处介绍与此文件无关的其他方面配置。

设置系统服务

Pleroma安装文件已经准备好了配置,只需以root用户身份,将 pleroma.service 复制到/etc/systemd/system文件夹中,然后启用即可。

cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service
systemctl start pleroma
systemctl enable pleroma

安装Soapbox FE

Soapbox FE为Pleroma实例提供了更为美观的前端界面,使Pleroma看着更像推特。根据Soapbox官方文档,在已有Pleroma实例中安装Soapbox前端非常简单,只需要

# 下载到 /tmp
cd /tmp && curl -L https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/v3.0.0-beta.1/download?job=build-production -o soapbox-fe.zip
# 解压到 /opt/pleroma/instance
busybox unzip soapbox-fe.zip -o -d /var/lib/pleroma

由于我使用了OTP安装方式,应当解压到/var/lib/pleroma,这点非常重要,因为在Soapbox的代码仓库中并未强调这点。解压完成后,强制刷新Pleroma站点,应该就能看到新的界面。如要更新Soapbox FE,只需更改版本号后重新拉取解压。

访问example.tld/about查看站点的关于页面,如需修改关于页面,可在var/lib/pleroma/static/instance下的about.example文件夹,重命名为about

cd var/lib/pleroma/static/instance
mv about.example about

编辑其中的index.html页面,其余文件可按需保留。

如需修改站点的网站图标(显示于浏览器标签栏),则替换var/lib/pleroma/static/favicon.png即可,注意Pleroma仅支持png格式的图标。

其余的Pleroma配置例如标签页标题、关闭注册等可在Admin FE的图形界面配置,Admin FE的URL为https://example.tld/pleroma/admin/

配置中文搜索

PostgresSQL默认的搜索对东亚文字适配不佳,还需要额外安装Postgres CJK Parser实现中文搜索。接下来按照suica的教程进行配置。

  1. 安装依赖:
apt-get install -y postgresql-server-dev-all gcc icu-devtools libicu-dev

下载Postgres CJK Parser拓展包:

git clone https://github.com/huangjimmy/pg_cjk_parser.git
  1. 解压到一个文件夹,这里选择/home
cd /home/
make clean && make install
  1. 在PostgresSQL中创建启用拓展:
# 连接pleroma数据库,数据库名称见Pleroma的config.exs中
\c pleroma;
# 创建拓展 pg_cjk_parser
CREATE EXTENSION pg_cjk_parser;
  1. 配置搜索并设置为默认:
CREATE TEXT SEARCH PARSER public.pg_cjk_parser (
    START = prsd2_cjk_start,
    GETTOKEN = prsd2_cjk_nexttoken,
    END = prsd2_cjk_end,
    LEXTYPES = prsd2_cjk_lextype,
    HEADLINE = prsd2_cjk_headline);

CREATE TEXT SEARCH CONFIGURATION public.config_2_gram_cjk (
    PARSER = pg_cjk_parser
);

SET default_text_search_config = 'public.config_2_gram_cjk';
  1. 设置映射:
ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR asciihword
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR cjk
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR email
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR asciiword
    WITH english_stem;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR entity
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR file
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR float
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR host
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR hword
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR hword_asciipart
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR hword_numpart
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR hword_part
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR int
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR numhword
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR numword
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR protocol
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR sfloat
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR tag
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR uint
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR url
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR url_path
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR version
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.config_2_gram_cjk
    ADD MAPPING FOR word
    WITH simple;
  1. 测试效果:
SELECT to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω'), to_tsquery('のび太'), 
to_tsquery('野比大雄'),
to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω') @@ to_tsquery('のび太'),
to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω') @@ to_tsquery('野比大雄');
  1. 修改postgresql.conf
nano /etc/postgresql/12/main/postgresql.conf

在该文件中查找 shared_preload_libraries,修改为

shared_preload_libraries = 'pg_cjk_parser.so'
  1. 更新 Pleroma 的搜索配置和索引:
su pleroma -s $SHELL -lc "./bin/pleroma_ctl database set_text_search_config public.config_2_gram_cjk

如命令无效可尝试sudo -Hu pleroma -s $SHELL -lc "./bin/pleroma_ctl database set_text_search_config public.config_2_gram_cjk",等待较长一段时间后,出现Done表示成功。

重启PostgreSQL和Pleroma服务,新的搜索就正式启用了。

邮件配置

(待完善,其实对一个人的实例除了方便导出以外没什么用,我没什么动力去管它。)

备份数据和卸载Pleroma记录

数据备份

要卸载Pleroma,请务必记得备份自己的数据,虽然Pleroma配置麻烦,但自己的东西还是保留下来比较好。

Pleroma 需要备份的地方有三个,此处假定备份路径为/home/backup

/etc/pleroma:存储启动时的配置文件。如果你开启了数据库存储配置,也可以不用备份;
/var/lib/pleroma:存储用户创建的静态文件(自定义表情、头像、上传的文件、前端、……),如果不是经常上传文件,可以按月备份;
PostgreSQL 中的 pleroma 数据库,可以通过 pg_dump 命令备份,不过需要注意为postgres用户配置备份目录的写入权限:

cp /etc/pleroma /home/backup
cp /var/lib/pleroma /home/backup
sudo -Hu postgres pg_dump -d pleroma --format=custom -f /var/lib/postgresql/pleroma.pgdump

数据恢复方法参见官方文档和宝宝的活动板房-1. 社交网络:Pleroma这篇文章。

删除Pleroma

如果认为自己玩不转Postgresql,可以删除Pleroma换其他软件,不过目前支持ActivityPub协议的软件暂时无法实现已发布内容的跨实例数据迁移(当然手动导出然后逐条输入数据库也不是不可),所以迁移还是要谨慎进行。

如果决定要放弃Pleroma,首先要停止Pleroma服务,随后删除Pleroma的系统服务,再彻底删除Pleroma文件夹和数据库。此处假定数据库名为pleroma

su pleroma -s $SHELL -lc "./bin/pleroma stop"

systemctl stop pleroma
systemctl disable pleroma

rm -rf /opt/pleroma
rm -rf /etc/pleroma
sudo -Hu postgres psql -c 'DROP DATABASE pleroma;';
sudo -Hu postgres psql -c 'DROP USER pleroma;'
userdel pleroma

Pleroma相关依赖(特别是Pstgresql,数据库比较大)可按需删除。Caddyfile也要注意移除或调整相关内容。反正我是彻底不想再碰Postgresql数据库管理了,拜拜,不和Pleroma玩了。

参考资料

  1. Pleroma官方文档, Pleroma Documentation
  2. suicablue, 在 Debian 10 / Ubuntu 20.04 上安装 Pleroma, Suica
  3. 我的pleroma搭建笔记, 执痴
  4. kana, 尽量细致的Pleroma搭建教程(仮), 今騒戯画
  5. hikerpig, Caddy 2 和 Cloudflare 配合, hikerpig.cn
  6. Soapbox官方文档, Soapbox
  7. 藍+85CD, Pleroma (Soapbox BE+FE) 安装笔记, ./kwaa.dev
  8. suicablue, 让 Pleroma 支持中文搜索(pg_cjk_parser 拓展, Suica
  9. 本宝宝, 宝宝的活动板房-1. 社交网络:Pleroma, 秘密花园