使用 Docker 构建 Pleroma 实例

前言

最近 Elon Musk 购买了 Twitter 并将其私有化,加上 Musk 近期在 Twitter 上所做的所有改变(比如使用8美元购买认证标签等),在小范围形成了一个社交网络移民潮。因为想到基本每个商业软件都有对应的开源产品,所以我开始寻找 Twitter 替代品,最后我找到了 Fediverse。Fediverse 是一个由不同的开源社交网络组成的联合,其基于 ActivityPub 协议。而 ActivityPub 包括 Mastodon(Pawoo 等)、Misskey(misskey.io 等)、Pleroma 等等。在这些开源产品中,Pleroma 实机上部署环境步骤复杂繁琐。但它是对服务器性能要求最低的微博客工具,它的配置要求多低呢?博主在甲骨文的免费服务器(低 io 低读写)上成功跑起来了一个实例。现在 docker 的出现大大简化了部署的方式,只需要简单三步即可轻松搭建实例。本文将介绍如何使用 docker 构建 Pleroma 实例。

预先准备

使用 docker 构建 Pleroma 实例需要一些预先准备,这里不再赘述,你需要到相应官方网站下载并安装好 docker 和 docker-compose。本文默认您的系统里已具有 docker 和 docker-compose。

获取 docker-compose.yml 模板

该文件被公开在官方的 git 托管仓库中,直接克隆该仓库。

git clone https://git.pleroma.social/pleroma/pleroma-docker-compose.git
cd pleroma-docker-compose # 接下来所有操作(除 nginx 配置)如果没有加以说明都在这个目录下进行。

修改配置文件

docker 模板中的配置文件是 docker-compose.yml,直接使用官方配置即可,若要修改可参照下列提示进行修改,不过要注意后面提到的内容也要连带修改。

version: '3.1'

services:
  pleroma:
    image: git.pleroma.social:5050/pleroma/pleroma:latest
    container_name: "pleroma"
    hostname: "pleroma"
    labels:
      - "org.label-schema.group=pleroma"
    restart: always # 可用选项 always, unless-stopped, no 建议设置成 on-failure:3,遇到故障自动重启。除非你对你的服务器性能有自信那就 always 吧。
    env_file: ./environments/pleroma/pleroma.env
    depends_on:
      - pleroma-db
    ports:
      - "127.0.0.1:4000:4000" # 本地端口:容器端口(更改该设置后需要同时更改 pleroma.env 中的 PORT 设置)
    volumes:
      - ./volumes/pleroma/config.exs:/var/lib/pleroma/config.exs
      - ./volumes/pleroma/uploads:/var/lib/pleroma/uploads

  pleroma-db:
    image: postgres:12.1-alpine
    container_name: "pleroma-db"
    hostname: "pleroma-db"
    labels:
      - "com.centurylinklabs.watchtower.enable=False"
      - "org.label-schema.group=pleroma"
    restart: always # 同步上述设置
    env_file: ./environments/pleroma-db/postgres.env
    ports:
      - "127.0.0.1:5432:5432" # 本地端口:容器端口 不建议更改
    volumes:
      - ./volumes/pleroma-db/pgdata:/var/lib/postgresql/data
      - ./volumes/pleroma-db/pginit:/docker-entrypoint-initdb.d

接着去修改即将要被映射到容器中的配置文件。

使用你喜欢的文本编辑器打开 ./enviroments/pleroma/pleroma.env,修改其中的配置:

DB_USER=pleroma # 数据库用户名
DB_PASS=pleroma # 数据库密码(建议换一个,更换之后 ./enviroments/pleroma-db/postgres.env里的设置也要更改)
DB_HOST=pleroma-db # 数据库地址
DB_NAME=pleroma # 数据库名
INSTANCE_NAME=Pleroma # 实例名
ADMIN_EMAIL=admin@ops.pleroma.social # 管理员邮箱
NOTIFY_EMAIL=pleroma+admin@ops.pleroma.social # 通知邮箱
DOMAIN=s.pwq.app # 实例域名
PORT=4000 # 实例运行端口

然后打开 ./enviroments/pleroma-db/postgres.env,配置数据库。

POSTGRES_PASSWORD=pleroma
POSTGRES_USER=pleroma

三个文件只要动了其中一个剩下两个也要做出相应修改。但也可以不做修改使用默认配置直接运行,但请切记关闭 pgsql 的开放端口防止数据泄露。

接下来这个设置是最重要的。进入 ./volumes/pleroma/config.exs,修改其中的配置:

该文件默认只有第一行,为了进入服务器后能够使用图形界面配置个性化内容,我们需要在下面添加一行:

import Config
config :pleroma, configurable_from_database: true

随后运行 docker-compose up -d,启动容器。

等待一段时间后,输入 docker logs --tail=10 pleroma,查看输出是否有报错,若一切正常则可以进入下一步。

配置 Nginx

在 Fediverse,一个没有 ssl 的实例是不受欢迎的,你需要去为你的实例域名申请一个 ssl 证书。

如果你使用服务器面板,这个过程能大大地简化,这里推荐一个开源版本的离线服务器面板 mdserver,能实现宝塔面板的基本功能且为服务器运维提供便利。

接下来主要讲解如何在没有服务器面板的情况下手动配置 nginx (反向代理和 ssl)。

安装/编译 Nginx

sudo apt install nginx -y #若你的 linux 不是 debian 的发行版,自行寻找对应包管理器的使用方法(选择编译安装还是直接使用现成软件包)

配置 SSL

在这一步之前,请记得到您域名 DNS 的管理控制台(如 Cloudflare),在 DNS 设置中添加一个 A RecordHost 填写 @(最好搭建在根域名,如果没有子域名需求),IP 指向你服务器的 IP 地址。

接着在服务器上安装 certbot (若非 debian 及其发行版请参照 certbot 官方安装教程安装):

sudo apt install snapd # 非 Ubuntu 可能需要这一步来安装 snap 软件包管理器
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --nginx -d 你的域名

打开nginx配置文件,将 ssl_certificatessl_certificate_key 前面的注释符号“#”删除。然后将 example.com 更改为你刚才申请的域名。保存后 nginx -t 检查配置文件是否有误,无误则使用 nginx -s reload 重载配置(或者使用 systemctl restart nginx 重启 nginx)。

配置反向代理并安装证书

同样选择你喜欢的文本编辑器,在 pleroma-docker-compose 里创建一个文件 proxy.conf 并保存,文件内容如下。

#PROXY-START/

location ^~ /
{
    # 4000 是你的实例容器运行端口,如果你修改过,记得改成你的端口。
    proxy_pass http://127.0.0.1:4000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    # proxy_hide_header Upgrade;
}

然后打开nginx的配置文件 nginx.conf,在 server 里添加一行 include /你刚才创建文件的路径/proxy.conf ,保存后再次检查并重载配置。

随后即可使用域名直接访问你的实例。

创建管理员账户

如果能打开 Pleroma 的用户前端,恭喜你,已经完成了这个教程里最复杂的步骤!但先别急,到这一步你还没有取得对该实例的所有权。所以我们需要创建一个管理员账户用来管理实例。 回到终端界面,输入以下指令创建管理员账户:

docker exec -it pleroma ./opt/pleroma/bin/pleroma_ctl user new admin kasumi@bangdream.moe --admin

adminkasumi@bangdream.moe 可以替换成自己即将用来登录的用户名和邮箱

按下回车后会向你确认用户信息,按 y 并等待服务器跑一会,代表正在向数据库写入新用户数据。最后会输出一个链接,将连接复制到浏览器更改你的账户密码,提交后即可使用你的管理员账户直接登陆实例了。

配置文件权限

登陆后建议先尝试一下上传文件是否正常,如果无法上传则为权限问题。运行以下指令将上传文件所使用的映射文件夹权限改为 777

sudo chmod 777 ./volumes/pleroma/uploads -R

不需要重启容器,再试试上传文件是否正常。

恭喜!

如果你一路无报错地来到了这里,说明你的实例的安装就已经圆满完成。接下来可以根据自己的需求进行一些配置,比如修改实例的名称、logo、简介、邮件服务、是否允许注册等等。由于先前已在安装时选择使用数据库配置,故此时使用 Pleroma 的后台前端界面直接进行配置即可。