Pleroma安装、使用Soapbox前端和Caddy进行反代的笔记
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
- 检测一下环境,设置环境变量
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端口也没问题,确保后三个端口没有服务占用。
- 安装依赖
apt install curl unzip libncurses5 postgresql postgresql-contrib libmagic-dev
安装可选依赖,Suica的教程建议全部安装,那就全部安装。
apt install imagemagick ffmpeg libimage-exiftool-perl
官方文档中安装了Nginx和Certbot,我既然已决定使用Caddy,就不需要安装这些依赖了。
- 配置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的教程进行配置。
- 安装依赖:
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
- 解压到一个文件夹,这里选择
/home
cd /home/
make clean && make install
- 在PostgresSQL中创建启用拓展:
# 连接pleroma数据库,数据库名称见Pleroma的config.exs中
\c pleroma;
# 创建拓展 pg_cjk_parser
CREATE EXTENSION pg_cjk_parser;
- 配置搜索并设置为默认:
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';
- 设置映射:
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;
- 测试效果:
SELECT to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω'), to_tsquery('のび太'),
to_tsquery('野比大雄'),
to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω') @@ to_tsquery('のび太'),
to_tsvector('Doraemnon Nobita「ドラえもん のび太の牧場物語」多拉A梦 野比大雄χΨψΩω') @@ to_tsquery('野比大雄');
- 修改
postgresql.conf
:
nano /etc/postgresql/12/main/postgresql.conf
在该文件中查找 shared_preload_libraries
,修改为
shared_preload_libraries = 'pg_cjk_parser.so'
- 更新 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玩了。
参考资料
- Pleroma官方文档, Pleroma Documentation
- suicablue, 在 Debian 10 / Ubuntu 20.04 上安装 Pleroma, Suica
- 我的pleroma搭建笔记, 执痴
- kana, 尽量细致的Pleroma搭建教程(仮), 今騒戯画
- hikerpig, Caddy 2 和 Cloudflare 配合, hikerpig.cn
- Soapbox官方文档, Soapbox
- 藍+85CD, Pleroma (Soapbox BE+FE) 安装笔记, ./kwaa.dev
- suicablue, 让 Pleroma 支持中文搜索(pg_cjk_parser 拓展, Suica
- 本宝宝, 宝宝的活动板房-1. 社交网络:Pleroma, 秘密花园