关于本文

本文于 2022 年 4 月 30 日修改

Pleroma 官方 OTP 方式安装教程: https://docs-develop.pleroma.social/backend/installation/otp_en/

按照这篇文章安装 Pleroma,理论上只需复制代码框里的内容到终端并根据说明进行适量调整即可完成安装并使用建好的实例,文章并不包括对操作原理的解释(因为作为一只技术菜鸟我也说不清楚),也并不包含建站之后的实例管理操作内容。不过虽然顺利的话复制粘贴就完事了,但还是不要图快,每一行都仔细检查下有没有什么奇怪的提示或报错,遇到无法理解的问题可以用搜索引擎搜搜报错看看有没有解决方案,解决前一个报错再继续后面的步骤,尽量不要总是减少全盘重来……不过遇事不决直接重安装服务器也是个解决方法。(反正是全新的机子)

以下内容以 Pleroma 官方 OTP 方式安装教程为基础,结合 如何在 Debian 10 上安装 Pleroma 教程以及以 奈卜拉的 Mastodon 一键安装教程 为基础的 技术小白如何搭建 Mastodon 实例 等多篇 Mastodon 安装教程,在实际操作过程中就可能遇到的细节问题方面对官方教程中的省略或模糊处理内容进行补充,域名、VPS 等前期准备过程已有多篇教程进行过详细说明,这里就简略带过并提供链接供您查看。

本文并非严谨的教程,更多是我个人作为一个技术小白对自己的建站过程进行的整理和概括。如果您发现内容表述有误、随 Pleroma 版本更新需要进行更改的地方、用词不严谨以及必要的补充内容,又或对内容有疑问、在建站过程中遇到了问题,您可以在博客下方评论。

Table of Contents

安装前准备

购买 VPS

我之前写这篇文章时使用的 VPS 所在服务提供商是 Vultr ,随着 Pleroma 对内存的需求增加,经友邻推荐将实例转移到了性价比更高的 Contabo ,不过听说这家有超售现象,友邻建议在购买时备注要 AMD 的机子。性能更好,另外 Contabo 相较 Vultr 对身份审核要更加严格。最初我使用的是 Vultr New York 3.5 美元/月的套餐,后更改为同一服务商 New Jersey 5 美元/月的套餐,最后又转入了 Contabo 最低价格套餐。

尽管 Pleroma 内存需求远低于 Mastodon 和 Misskey,但购入 VPS 请最低保证 1 GB 的内存。这个配置对于用户较少的小型实例是足够的,再小实例就容易变得不稳定。如果预计会在未来接纳更多用户,请根据您需要购买更合适的套餐。

Vultr 的最大优势是可以快速免费更换 IP 地址与在国内较容易支付,可使用快照免费快速备份(之前有 20 个免费快照位置可用,现已缩减至 1 个,添加需要付费),新注册有一定的优惠。

我还尝试使用过 Mastodon 教程中常见的 DigitalOcean ,但出现了账号被冻结必须进行实名认证才可解封的情况,遂放弃,但是这家多年稳定经营的服务商依旧是很多站长的选择。

如果追求更低的价格,还有很多服务商可以选择,但要注意价格过低的服务往往存在各种问题,轻则因超售而导致售卖的产品性能低下、大陆网络无法访问、建站后续与个别实例无法互联,重则在没有通知的情况下直接封锁账号甚至删除全部数据,购买前请一定多去查查他人的评价,实在不放心就选择 Vultr、DigitalOcean 这样口碑较好的服务商。服务器选购以及 Vultr 具体操作可以参考 o3o.ca 站长的教程

建立 Fediverse 实例请不要使用位于国内服务器与国内的服务器提供商。

我撰写本文时使用的操作系统为 Debian 10,之前也曾使用 Ubuntu 20.04,二者差别较小。如需使用其他操作系统,请在 官方教程 中根据自己的系统选择相应教程。

购买域名

初建站时我在 Namecheap 购买域名,之后转移到了 Porkbun 。 域名购买与 DNS 设置步骤大致都是相似的,按照网站指引一步步操作即可 。域名往往第一年的价格低廉,续费价格恢复为正常价格。域名一旦选定并用于建站,后期更改会比较繁琐且容易出现各种问题,请谨慎思考想要的域名。请不要使用国内的域名注册商与位于国内的域名,详情请参考 影子屋的博文

Namecheap 的购买与验证操作请参考 技术小白如何搭建 Mastodon 实例中的前三部分

我使用 Namecheap 早期曾因 IP 问题致使账号被暂时封锁,如果出现这种情况,请按照 Namecheap 的说明进行操作,一般为在指定网站实时拍摄盖住姓名地址的信用卡背面照片。如果想避免这种情况出现,请不要在使用 Namecheap 网站的过程中频繁更换 VPN 节点。

购买域名后,在域名管理器(Advanced DNS Setting - HOST RECORDS)中添加一个 A Record,Host 一般填写 @ ,Value 填写您服务器的 IP 地址,点击确定,DNS Setting 中除自定义设置外的 Namecheap 自动生成内容需要全部删除。

如果使用 Cloudflare 服务,添加 A record 这个步骤可以直接在 Cloudflare 中进行。

(可选)接入 Cloudflare

Cloudflare 可以为实例提供很大程度上的安全防护并提升网站访问速度(不过有时它也会降低网站访问速度,人称降速器),先前 Cloudflare 曾遭到攻击,使用 Cloudflare 服务的实例几乎全军覆没,短暂出现了大陆网络无法访问的情况。不过 Cloudflare 依旧有能力保护网站顶住大部分网络攻击,若预算有限、技术有限且人没有更好的免费 CDN 方案,还是建议接入的。

网络上有许多 Cloudflare 设置教程,也可参考 o3o.ca 站长这篇教程 进行配置,并在 DNS 板块仿照之前的说明添加 A Record 。

接入 Cloudflare 后,域名相关的操作可直接在 Cloudflare 进行而无需在之前的网站登录。

SSH 远程登录

Vultr 网页上的控制台不适合日常管理使用,速度极慢且使用并不稳定,它主要用于在您在本地计算机远程 SSH 登录出现问题时用于修复操作错误。我在建站时根据 麻辣小龙猫的教程 建议选择了 Bitvise SSH Client 这个工具,方便 Windows 用户进行实例远程操作,它提供的 SFTP 窗口对于草履虫在后续的实例管理中非常有用。下载并安装后,在 Host 一栏输入刚刚购买 VPS 的 IP 地址,Port 端口输入 22,点击登录,点击 “New Terminal Console” 即可使用 root 账户进行后续终端操作。

建议先修改 root 帐户密码,防止原默认密码丢失:

passwd <您要修改的密码>

密码是不显示的,输入密码后直接按回车,再次输入确认即可。

正式安装

本文指令未特别提示的情况下全部使用 root 用户进行。

一、前置安装

1、安装依赖

apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot libmagic-dev

如果安装途中出现错误,则执行以下命令后再次尝试安装:

apt-get update

2、安装可选安装包(建议全部安装)

apt install imagemagick ffmpeg libimage-exiftool-perl

3、Postgresql 性能调优(可选)

为了优化性能,您可以使用 pgTune (pgTune 中 Number of Connections 处根据官方文档建议填写 20 ,但您并不需要更改 conf 文件上这一处的默认配置) 生成推荐配置,并根据推荐配置调整 /etc/postgresql/11/main/postgresql.conf 中的相应数值:

nano /etc/postgresql/11/main/postgresql.conf

使用以下命令重启 PostgreSQL:

systemctl restart postgresql

(11 为我系统 Postgresql 的版本,您的版本不同的话会显示为其他序号)

二、安装 Pleroma

1、创建一个 Pleroma 用户

adduser --system --shell /bin/false --home /opt/pleroma pleroma

2、检测并设置环境变量 FLAVOUR

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”(请替换为您自己的输出结果),输入 :

export FLAVOUR="amd64"

3、下载安装 Pleroma 所需的文件到 /tmp 文件夹并解压

su pleroma -s $SHELL -lc "
curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip
unzip /tmp/pleroma.zip -d /tmp/
"

4、移动文件到 /opt/pleroma 并删除临时文件夹

su pleroma -s $SHELL -lc "
mv /tmp/release/* /opt/pleroma
rmdir /tmp/release
rm /tmp/pleroma.zip
"

5、创建 /uploads 文件夹并设置适当的权限

mkdir -p /var/lib/pleroma/uploads
chown -R pleroma /var/lib/pleroma

6、创建 static 文件(用于存放表情等文件)并设置其所有者为用户 pleroma

mkdir -p /var/lib/pleroma/static
chown -R pleroma /var/lib/pleroma

7、创建存放配置文件的文件夹并设置其所有者为用户 pleorma

mkdir -p /etc/pleroma
chown -R pleroma /etc/pleroma

8、生成 config 配置文件

su pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql"

9、若 config 文件生成成功,则出现若干问题需要回答:

What domain will your instance use? (e.g pleroma.soykaf.com) [] 您的网站将使用什么网址?

What is the name of your instance? (e.g. Pleroma/Soykaf) [] 您的网站叫什么名字?

What is your admin email address? [] 网站管理员的邮箱地址是什么?

What email address do you want to use for sending email notifications? [] 您想要用什么邮件地址来发送邮件通知?(这里先输入邮箱,之后若要向用户发送邮件需要额外配置)

Do you want search engines to index your site? (y/n) [n] 您希望搜索引擎收录您的网站吗?(建议不收录)

Do you want to store the configuration in the database (allows controlling it from admin-fe)? (y/n) [n] y 您希望将配置信息存入数据库吗(允许从管理后台进行控制)?(建议存入,否则 admin-fe 将无法使用)

Do you want to strip location (GPS) data from uploaded images? (y/n) [y] n 您希望从上传的图片中消除 GPS 信息吗?(建议消除)

Do you want to anonymize the filenames of uploads? (y/n) [n] y 您希望将上传文件的文件名匿名化吗?(建议匿名化)

Do you want to deduplicate uploaded files? (y/n) [n] y 您希望去除重复的已上传文件吗?(建议去除)

除以上问题外,其余选项均按 enter 选择默认配置即可

如果成功则有如下显示:

All files successfully written! Refer to the installation instructions for your platform for next steps. Please transfer your config to the database after running database migrations. Refer to “Transfering the config to/from the database” section of the docs for more information.

10、创建 postgres 数据库

su postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql"

11、更新数据库 schema

su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate"

12、启动实例以验证一切都按预期工作

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

13、等待大约 60 秒并检测实例运行状况,如果它正确地显示了您的网址、网站名称和电子邮件地址,则说明实例已经安装成功 (update: 经建议,由 20 秒延长为 60 秒)

sleep 60 && curl http://localhost:4000/api/v1/instance

注:如果出现错误 “curl: (7) Failed to connect to localhost port 4000: Connection refused” ,请等待一会儿再此尝试,错误可能是 Pleroma 初次加载时间较慢导致的。

14、最后,暂时先暂停实例的运行

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

三、设置 nginx 并获取 Let’s Encrypt SSL 证书

1、获取一个 Let’s Encrypt 证书(注意修改域名)

certbot certonly --standalone --preferred-challenges http -d <yourinstance.tld>

2、输入您的邮箱地址(用于紧急重建和安全通知)并按照指示选择 A(agree)和 Y(yes)

之前 Let’s Encrypt 曾撤销了一批有问题的证书,撤销前曾通过邮件进行通知,请务必留下一个有效的联系邮件。*

3、显示以下结果证明证书获取成功(否则尝试再次执行第一个指令):

Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/<实例域名>/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/<实例域名>/privkey.pem Your cert will expire on <到期日期>. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew all of your certificates, run “certbot renew”……(省略)

注:如果提示与我上面写的不同,请仔细检查证书有没有成功申请并存放到"/etc/letsencrypt/live/实例域名/",若没有申请成功,后面依旧会卡住。

一般这一步出错有两种可能,第一,您没有添加 A 记录,请到域名注册网站添加或修改 A 记录;二,80 和 443 端口未开放,如果这里出现错误"Problem binding to port 80: Could not bind to IPv4 or IPv6.",请检查防火墙端口开放情况(补充: Debian 需要额外安装 ufw):sudo ufw status verbose,如果只有 22 端口开放,请通过 sudo ufw allow 80/tcpsudo ufw allow 443/tcp 将 80 和 443 端口开放。(*备注)

操作完成后,再次输入指令,直到看到正确的成功提示。

4、复制 Pleroma nginx 配置到 nginx 文件夹

cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.conf
ln -s /etc/nginx/sites-available/pleroma.conf /etc/nginx/sites-enabled/pleroma.conf

1.2.0 及以上版本 nginx 可能没有 sites-available 和 sites-enabled 两个目录,请在 /etc/nginx/nginx.conf 的 http 部分添加这一行:

include /etc/nginx/pleroma.conf

并执行这行命令:

cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/pleroma.conf

5、使用 nano 编辑器打开 Nginx 配置文件

nano /etc/nginx/sites-available/pleroma.conf

6、将文件中所有 example.tld 更改为您的实例的对应名称(操控方向键滑动页面,用 backspace 删除默认名称,并输入新的地址即可)

注(未经验证):location 处只保留后面的$符号,删除前面的$符号):

location / {
  return         301 https://<您的实例名>$request_uri;
}

7、修改完毕后按 ctrl X,选择 Y(yes)保存,然后按 enter 退出

8、确认 nginx 是否配置正确

nginx -t

出现以下内容则配置成功:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

9、启动 nginx(若先前 nginx 已在运行则 reload nginx -s reload

systemctl start nginx

四、设置系统服务

1、将 pleroma.service 复制到适当的文件夹中

cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service

2、启动 pleroma 并设置开机自启动

systemctl start pleroma
systemctl enable pleroma

在地址栏输入您的实例域名,若 pleroma 服务启动成功,则应显示 pleroma 页面;若显示 502 bad gateway,再次执行 systemctl start pleroma ,之后刷新页面

五、设置 Let’s Encrypt 证书的自动更新

这部分内容可以参考通配符域名证书申请与自动更新

1、创建路径

mkdir -p /var/lib/letsencrypt

2、使用 nano 编辑器打开 Nginx 配置文件

nano /etc/nginx/sites-available/pleroma.conf

3、去除 location ~ /.well-known/acme-challenge { root /var/lib/letsencrypt/; } 前的 # 注释符号

内容全部显示为白色后按 ctrl X,选择 Y(yes)保存,然后按 enter 退出

4、确认配置是否正确

nginx -t

5、重启 nginx

systemctl restart nginx

6、确认自动更新任务设置成功(注意修改域名)

certbot renew --cert-name <yourinstance.tld> --webroot -w /var/lib/letsencrypt/ --dry-run --post-hook 'systemctl reload nginx'

显示以下内容则设置成功: Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/yourinstance.tld/fullchain.pem (success) ** DRY RUN: simulating ‘certbot renew’ close to cert expiry ** (The test certificates above have not been saved.)

7、添加自动任务(注意修改域名)

echo '#!/bin/sh
certbot renew --cert-name <yourinstance.tld> --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
' > /etc/cron.daily/renew-pleroma-cert
chmod +x /etc/cron.daily/renew-pleroma-cert

8、确认任务添加成功

run-parts --test /etc/cron.daily

若显示内容中包含 /etc/cron.daily/renew-pleroma-cert 则添加成功

六、创建第一个用户并设置为管理员

<joeuser> 处为管理员 ID,后面为管理员邮箱地址,根据自己情况设置

cd /opt/pleroma/bin
su pleroma -s $SHELL -lc "./bin/pleroma_ctl user new <joeuser> <[email protected]> --admin"

选择 [y] 后终端会出现一个链接,复制链接并粘贴到浏览器打开,为管理员账号设置密码,设置完毕即可进入实例页面。

一些可能对您有帮助的文章