我一直都想有一个自己的微博系统,因为自己逐渐回复社恐状态,愈发不习惯在公共平台如豆瓣、微博、朋友圈吐槽。而自己也没有当年日更一博的劲头,几句话就发一篇博客的话好像也不妥。但是微博和博客不同,很难复用我所用的静态系统搭建。几个月前,我才孤陋寡闻得知了长毛象这么一个系统,发现其正符合我的需求,便入了坑。

长毛象并不像Hugo这类静态架构,可以直接架在免费的Github pages上,所以第一步是挑选一个合适的云平台。我没有使用东家的产品,而是跟风使用Digital Ocean,开了一个每月5刀左右的Ubuntu instance。Digital Ocean上可以直接从marketplace选image直接搭建,但是版本比较老。Mastodon的文档比较完整,所以我便一路跟着从头开始搭建了。

首先是一些准备工作,比如禁用 /etc/ssh/sshd_config 中的 PasswordAuthentication 并通过 systemctl restart ssh.service 重启,这样只能使用SSH Key登陆;通过 apt update && apt upgrade -y 更新package后安装fail2ban和iptables-persistent并添加相关设置;由于Mastodon是内存大户,还根据Digital Ocean的教程增加了4G的swap。

接下来便是安装Mastodon了。我没有使用docker,而是从源中直接安装。Mastodon基于Ruby on rails (REST API),React.js(前端),Node.js(Streaming API),Redis(队列),PostgreSQL(数据库),自然也要安装这几个。其中Ruby需要通过rbenv来管理,而后者必须安装在单独的Linux用户中,所以可以创建一个mastodon用户(之后也会在这个用户下下载安装Mastodon)。Ruby会装很久,可以使用 --verbose 来确保还在安装而不是卡了。

全部安装完成后,即可运行交互式安装向导来生成配置文件~.env.production~,预编译静态文件,并创建数据库的schema:

1
RAILS_ENV=production bundle exec rake mastodon:setup

这一步在Mastodon文档中略过,不过基本上也可以一路回车。需要注意的是:

  1. 如果打算采用二级域名,但是想让用户名采用一级域名即可搜到,则需要在交互中提供一级域名。我后面会细说。
  2. 需要提前准备好SMTP的配置。比如gmail就需要设置应用专用密码,并使用plain模式来验证。

一般来说,之后跟着文档配置完nginx,SSL证书,以及一系列systemd服务后就可以使用Mastodon了。

但是。

对,由于我是个特别折腾的人,便总会有一些但是。我有个不太常见的需求,那就是我想让我的长毛象和我的博客共用一个一级域名。换句话说,我的博客是blindwith.science,那我想用mastodon.blindwith.science来访问我的长毛象,但是别人可以直接使用ziyunch@blindwith.science来搜我,而不是ziyunch@mastodon.blindwith.science。

我找到这篇文档,算是有一些眉目。长毛象中,有两个概念,一个是webfinger acct: URI,即ziyunch@blindwith.science;另一个则是与Mastodon实例相匹配的URI,即mastodon.blindwith.science。一般情形下,两者一致,万事大吉。但是当不一致时,则需要注意:

  1. 在~.env.production~中做区分。其中LOCAL_DOMAIN(也就是之前在交互时填写的domain)是~acct:~ URI中用到的域名,而WEB_DOMAIN则是与Mastodon实例相匹配的域名。
  2. nginx的配置需针对WEB_DOMAIN,即mastodon.blindwith.science。
  3. 在长毛象进行webfinger query .well-known/host-meta 时做一个跳转。

其中第三步,如果主域名用于的博客有采用nginx作为server或proxy,那可以在主域名的nginx中加一个针对 .well-known/host-meta 的301跳转。

但是。

对,又是一个但是。我的博客基于Hugo并直接架在Github pages上,也并没有设置nginx proxy,所以不能直接照抄答案。折腾了好一段时间后,我在Hugo的static文件夹(会原样复制到作为Github pages档的public文件夹中)中添加了两个文件来解决这个跳转的问题:

第一个是参考这篇讨论添加 .well-known/host-meta 文件。

1
2
3
4
<?xml version="1.0"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
    <Link rel="lrdd" type="application/xrd+xml" template="https://mastodon.blindwith.science/.well-known/webfinger?resource={uri}"/>
</XRD>

第二个则是参考这个问答添加 _config.yml ,这样Github才不会忽略隐藏的host-meta文件。

1
include: [".well-known"]

这样,我的长毛象才终于可用了。

接下来,我打算

  1. 为每篇新博客发一个嘟嘟,并支持博客与嘟嘟的联动。
  2. 定期清理并备份我的长毛象。
  3. 将博客添加到RSS源,并使用RSS2toot将博客自动转发成嘟嘟。