使用 Docker 快速部署单人 Fediverse 实例

2023 年 04 月 23 日
#Docker #Linux #Nginx

前言

从 Twitter 逃离后,自己托管的 Mastodon 实例也并没有给我带来多少安全感。因为常常瞎折腾,我的实例经常宕机 1,从 2 月份到今天我已经清空数据重新部署了 7 ~ 8 次了。Mastodon 对缩略图的裁剪很怪异、Ruby on Rails 运行很缓慢,也尝试过 Mastodon Glitch Edition2 这样的修改版,但是它带来的「新特性」也不是很好使用。

我只是想要一个易于托管、ActivityPub 兼容的单人实例,可以自言自语一些废话罢了。今天看到了 microblog.pub3 ,简单部署了一下,我觉得,这就是目前最好的单人 Fediverse 实例!

My microblog.pub

特性如下:

  • 兼容 ActivityPub 协议,可以和 Pleroma、Mastodon 等用户互联
  • 支持 Markdown、支持代码块高亮 4
  • 支持 RSS、Atom 以及 JSON 格式的 Feed
  • 使用 SQLite,非常易于迁移和备份
  • 性能要求极低,1 vCPU 以及 512 MB 即可轻松运行

部署

microblog.pub 支持 Docker 快速部署 5,下面我们将花费 5 分钟左右部署一个自己的实例,SSH 登录您的服务器

第一步,拉取源代码(将 sink.love 替换为您的域名)

1
git clone https://git.sr.ht/~tsileo/microblog.pub sink.love

第二步,构建 Docker 镜像 6

1
2
cd sink.love && \
sudo make build

稍等片刻,耐心等待 Docker 镜像构建完成

第三步,运行初始化设置

1
sudo make config

接下来会进入交互式初始化配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ sudo make config
...(省略)
Welcome to microblog.pub setup wizard

Generating key...
Your identity will be @{username}@{domain}
domain: sink.love
username: dejavu
admin password: **************************************	<-- 管理员密码
name (e.g. John Doe): Dejavu Moe
summary (short description, in markdown, press [CTRL] + [SPACE] to submit):
Not for success, just for growing.	<-- 输入完成后按 CTRL 和 SPACE 键结束
will the site be served via https? (y/n):	<-- 此处我们启用 HTTPS
Note that you can put your icon/avatar in the static/ directory
icon URL: https://sink.love/static/avatar.png	<-- 设置头像文件
Done

需要注意,macOS 的 CTRL + 空格键默认是切换输入法,要去设置里把这个快捷键暂时关闭一下

Modify Shortcut Keys

第四步,编辑配置文件,允许代理所有主机的资源

1
vim data/profile.toml

将下面内容加到里面

1
trusted_hosts = ["*"]

最后,启动容器

1
sudo docker compose up -d

现在,microblog.pub 部署好了,正运行在 VPS 的 8000 端口上 7

反向代理

接下来使用 Nginx 反代上面的服务,自行准备好 SSL 证书,我使用的是 Cloudflare 的源服务器证书

1
cd /etc/nginx

备份 Nginx 默认配置文件

1
sudo mv nginx.conf nginx.conf.bak

编辑 Nginx 默认配置文件

1
sudo vim nginx.conf

在 http 字段内,添加一条 gzip 类型

1
gzip_types text/plain text/css application/json application/javascript application/activity+json application/octet-stream;

在 conf.d 下添加一个站点配置文件,比如

1
cd conf.d && sudo touch sink.love.conf

编辑这个站点配置文件

1
sudo vim sink.love.conf

下面是一个示例配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
server {
  listen 80;
  listen [::]:80;
  # 替换域名
  server_name sink.love;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  # 替换域名
  server_name sink.love;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;

  # 替换为您的 SSL 证书绝对路径
  ssl_certificate     /etc/nginx/cert/sink.love.pem;
  ssl_certificate_key /etc/nginx/cert/sink.love.key;

  client_max_body_size 4G;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_redirect off;
    proxy_buffering off;
    proxy_pass http://127.0.0.1:8788;
  }

  location /static {
    rewrite ^/static/(.*) /$1 break;
    # 替换为您的 microblog.pub 目录下面的 app/static/ 子目录
    root /home/dejavu/container/sink.love/app/static/;
    expires 1y;
  }
  # Nginx 访问日志
  access_log  /var/log/nginx/sink.love.access.log;
  error_log  /var/log/nginx/sink.love.error.log;
}

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

重载 Nginx 配置

1
sudo nginx -s reload

现在访问您的域名,应该就可以使用啦,如果想使用子域名 8 或二级路径 9,请参考对应的文档说明。

修改配置

为了方便,将实际的文件目录简化一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.
├── app
│   ├── scss
│   │   ├── main.scss
│   │   └── _theme.scss -> ../../data/_theme.scss
│   ├── static	<-- 静态资源
│   ├── templates
│   └── utils
├── data	<-- 数据目录,所以相关的数据都在这,备份迁移要注意这个目录
│   ├── custom_emoji	<-- 自定义 Emoji 表情包
│   ├── incoming.log
│   ├── key.pem
│   ├── local_actor_hash.dat  <--│ 
│   ├── microblogpub.db          │ SQLite
│   ├── microblogpub.db-shm      │ 数据库文件
│   ├── microblogpub.db-wal   <--│ 
│   ├── outgoing.log
│   ├── profile.toml	<--配置文件
│   ├── templates	<-- 模板覆盖路径
│   │   └── app -> ../../app/templates/
│   ├── _theme.scss	<--样式覆盖路径
│   └── uploads	<--静态资源上传路径
└── docker-compose.yml

首先修改我们的配置文件,加入一些可用的配置

1
vim data/profile.toml

前面通过交互式向导生成的配置文件类似下面这样

1
2
3
4
5
6
7
8
domain = "sink.love"
username = "dejavu"
admin_password = "*******************"
name = "Dejavu Moe"
summary = "Not for **success**, just for **growing**."
https = true
icon_url = "https://sink.love/static/avatar.png"
trusted_hosts = ["*"]

修改默认背景图

虽然 microblog.pub 默认不显示个人资料页面的背景图或「顶部图」,但是在 Mastodon 上面是会显示的,我们可以将图片上传到 app/static/ 下面,比如上传了一张 banner.png,添加一行到配置文件

1
image_url = "https://sink.love/static/banner.png"

个人主页元信息

我们可以在主页添加最多 4 条元信息,您可以将其指向您的个人网站、GitHub 主页,添加到配置文件

1
2
3
4
metadata = [
  {key = "Documentation", value = "[https://docs.microblog.pub](https://docs.microblog.pub)"},
  {key = "Source code", value = "[https://sr.ht/~tsileo/microblog.pub/](https://sr.ht/~tsileo/microblog.pub/)"},
]

个人隐私设置

将下面几行添加到配置文件,注意使用 Boolean 值

1
2
3
4
5
6
# 是否手动批准关注请求?默认 false
manually_approves_followers = false
# 是否隐藏关注自己的用户?默认 false
hides_followers = false
# 是否隐藏自己关注的用户?默认 false
hides_following = false

对于一些域名,支持隐私替换,添加下面内容到配置文件即可

1
2
3
4
5
6
7
privacy_replace = [
    {domain = "youtube.com", replace_by  = "yewtu.be"},
    {domain = "youtu.be", replace_by  = "yewtu.be"},
    {domain = "twitter.com", replace_by = "nitter.fdn.fr"},
    {domain = "medium.com", replace_by = "scribe.rip"},
    {domain = "reddit.com", replace_by = "teddit.net"},
]

Emoji 表情

可以 添加 或清空默认 Emoji 表情

1
2
3
4
5
# 添加
emoji = "😍 🥰 😘"

# 或清空
emoji = " "

导入自定义 Emoji 表情包,以导入 Smoji 中的微博表情为例

1
2
3
4
cd data/custom_emoji && \
wget https://github.com/DejavuMoe/Smoji/releases/download/2023.02.20/weibo.tar.gz && \
tar -zxvf weibo.tar.gz && \
rm weibo.tar.gz

修改配置文件后,在重新部署容器之前建议检查一下

1
sudo make check-config

OK 的话就可以重新启动容器使配置生效

1
2
sudo docker compose down && \
sudo docker compose up -d

自定义主题

Custom Theme

可以使用样式覆盖进行自定义 颜色主题

1
vim data/_theme.scss

可用的变量(下面是默认值)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$font-stack: Helvetica, sans-serif;
$background: #ddd;
$light-background: #e6e6e6;
$text-color: #111;
$primary-color: #1d781d;
$secondary-color: #781D78;
$form-background-color: #ccc;
$form-text-color: #333;
$muted-color: #555;
$primary-button-text-color: #fff;
$code-highlight-background: #f0f0f0;

设置自定义主题后需要重新编译 CSS 资源,重启容器生效

1
2
3
sudo docker compose down && \
sudo make compile-scss && \
sudo docker compose up -d

本文结束,更多详细配置说明,请参阅 microblog.pub 的 用户文档


  1. 之前说过一句笑话,希望能保证年度可用性在 9.9% 以上 😂 ↩︎

  2. https://glitch-soc.github.io/docs/ ↩︎

  3. https://github.com/tsileo/microblog.pub ↩︎

  4. 这个特性不建议使用哈,和其他 ActivityPub 实例不太兼容 ↩︎

  5. 确保您的 VPS 已经安装好最新的 Docker 和 Docker Compose ↩︎

  6. AMD64 和 ARM64 测试都可以正常使用,其他架构未知 ↩︎

  7. 建议修改 docker-compose.yml 将 8000:8000 改为 127.0.0.1:8000 ↩︎

  8. https://docs.microblog.pub/installing.html#(advanced)-running-on-a-subdomain ↩︎

  9. https://docs.microblog.pub/installing.html#(advanced)-running-from-subpath ↩︎