本文介绍如何在 Debian10 搭建 Mastodon 长毛象。

20210103-639.jpg

Mastodon 是什么

GitHub 开源地址:https://github.com/tootsuite/mastodon

官方文档:https://docs.joinmastodon.org/

Mastodon 维基百科(英文):https://en.wikipedia.org/wiki/Mastodon_(software)

感谢教程:https://pullopen.github.io/%E5%9F%BA%E7%A1%80%E6%90%AD%E5%BB%BA/2020/10/19/Mastodon-on-Docker.html

简单说,Mastodon 是一个分布式社交网络服务,能够提供类似 Twitter 的社交体验,同时拥有一个独特的功能。

其中最特别的,每个人都能够运行属于自己的实例(只要有足够的动手能力),不同实例之间是相通的,更详细的介绍,可以看这篇文章:

https://www.douban.com/group/topic/113168501/

准备工作

  1. 一个独立域名
  2. 一台至少2G的VPS,系统我选择 Debian 10
  3. 一个SMTP服务(可选,如果不开放注册则不需要)

购买域名看这篇文章:

购买服务器看这篇文章:

至于SMTP,我后续有空再介绍吧。

配置系统

密钥登录

为安全起见,Mastodon 推荐使用 SSH 密钥登录 VPS 服务器,并关闭密码登录,因此,我们首先配置密钥登录。

这里我以 Xsehll 为例。

  1. 在本地电脑上,生成私钥和公钥。如下图,Xshell 工具 - 用户密钥管理者:

20210103-631.jpg

  1. 点击 生成

    20210103-632.jpg

  2. 之后复制生成后的公钥。
  3. 然后到 VPS 上,运行如下命令:

    mkdir -p ~/.ssh
    nano ~/.ssh/authorized_keys

    将刚刚复制的公钥内容,粘贴到 .ssh/authorized_keys 中,保存退出。

    顺便修改 SSH Port:

    echo "Port 2333" >> /etc/ssh/sshd_config

    2333 修改为你自己想要的端口

    然后重启 sshd:

    /etc/init.d/ssh restart

    然后退出登录,在 Xshell 中修改端口,然后右键会话修改:

    20210103-633.jpg

    确保能够正常连接后,关闭密码登录:

    nano /etc/ssh/sshd_config

    键盘快捷键 Ctrl W 查找 PasswordAuthentication

    将其前面的 # 删掉(取消注释),在后面将 yes 改成 no

    保存退出,再次重启 sshd

配置iptables

为确保重启后,iptables 规则生效,安装 iptables-persistent:

apt install -y iptables-persistent

编辑规则文件,这里以 /etc/iptables/rules.v4 为例:

nano /etc/iptables/rules.v4

在文件内添加以下规则:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections 
#  The -dport number should be the same port number you set in sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

注意放行你自己设置的 SSH 端口

保存规则:

iptables-restore < /etc/iptables/rules.v4

输入以下命令即可查看设置的 iptables 规则:

iptables-restore < /etc/iptables/rules.v4

安装常用命令

以下一键运行:

apt update && apt install wget python git curl nano git -y

安装Docker和Docker-compose

此处使用官方提供的一键脚本安装 docker 和 docker-compose:

bash <(curl -L https://get.docker.com/)
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

拉取Mastodon镜像

首先创建存放目录:

mkdir -p /home/mastodon/mastodon
cd /home/mastodon/mastodon

拉取镜像:

docker pull tootsuite/mastodon:latest     #如果需要指定版本,请将latest改成v3.2.1等版本号

获取官方 docker-compose.yml

wget https://raw.githubusercontent.com/tootsuite/mastodon/master/docker-compose.yml

修改 docker-compose.yml

nano docker-compose.yml

修改 postgres 版本号:

20210103-634.jpg

如上图,修改红色框部分为以下内容:

image: postgres:12.5-alpine

接着依次找到 webstreamingsidekiq 分类,在每一类的 image: tootsuite/mastodon 后添加:latest 或者你刚才拉取的版本号

变成image: tootsuite/mastodon:latestimage: tootsuite/mastodon:v3.2.1等等。

修改无误后,Ctrl X 保存退出。

配置PostgreSQL

运行如下命令,注意管理员密码最好不带特殊符号,否则可能出错:

docker run --name postgres12 -v /home/mastodon/mastodon/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=数据库管理员密码 --rm -d postgres:12.5-alpine

完成后,查看 /home/mastodon/mastodon/postgres 会看到 postgres 相关的多个文件。

之后运行:

docker exec -it postgres12 psql -U postgres

创建数据库用户及密码:

CREATE USER mastodon WITH PASSWORD '数据库密码(最好和数据库管理员密码不一样)' CREATEDB;

创建成功后,输入 \q 退出数据库。

最后,停止数据库:

docker stop postgres12

配置Mastodon

首先在 /home/mastodon/mastodon 目录下,创建配置文件:

touch .env.production

然后运行:

docker-compose run --rm web bundle exec rake mastodon:setup

然后按照提示进行输入:

  • Domain name: 此处输入你的域名
  • Do you want to enable single user mode? 是否开启单人单机模式
  • Are you using Docker to run Mastodon? 是否使用docker运行mastodon,输入 Y
  • 然后是数据库连接信息:

20210103-635.jpg

其中 Name of PostgreSQL user: 填写 mastodon

Password of PostgreSQL user 填写我们刚刚设置的数据库密码

  • Redis 部分直接三个回车
  • Do you want to store uploaded files on the cloud?媒体文件上传到云储存,没钱,先填N
  • Do you want to send e-mails from localhost? 填N
  • 然后是设置 SMTP邮件发送,这个这篇文章就不展开了。
  • This configuration will be written to .env.production Save configuration? 填Y

完成之后,会出现 .env.production 配置,务必复制下来,保存在本地电脑,等下会再次用到

完成之后,会出现 .env.production 配置,务必复制下来,保存在本地电脑,等下会再次用到

完成之后,会出现 .env.production 配置,务必复制下来,保存在本地电脑,等下会再次用到

  • Prepare the database now? 建立数据库 填Y
  • Compile the assets now? 填Y
  • Do you want to create an admin user straight away? 创建管理员账号,填Y

成功之后,马上重新编写 .env.production

nano .env.production

将刚刚复制下来配置粘贴到文件中

然后启动 Mastodon:

docker-compose up -d

设置文件权限:

chown 991:991 -R public
chown -R 70:70 postgres

停止 Mastodon:

docker-compose down

重新运行:

docker-compose up -d

配置Nginx

为方便管理使用,我选择 LNMP 一键脚本安装 Nginx

运行以下命令一键安装 Nginx:

apt install screen -y
screen -S lnmp
wget http://soft.vpser.net/lnmp/lnmp1.7.tar.gz -cO lnmp1.7.tar.gz && tar zxf lnmp1.7.tar.gz && cd lnmp1.7 && ./install.sh nginx

新增站点:

lnmp vhost add

第一步输入域名,其他全部 n 回车即可

注意选择添加 SSL 证书:

Add SSL Certificate (y/n) y
1: Use your own SSL Certificate and Key
2: Use Let's Encrypt to create SSL Certificate and Key
Enter 1 or 2: 2

编写站点配置文件,我的示例域名:zarath.me

首先将刚刚通过 lnmp vhost add 生成的配置文件复制出来,保存到电脑上:

cat /usr/local/nginx/conf/vhost/zarath.me.conf

主要用到的是其中的证书部分:

20210103-636.jpg

然后,本地电脑浏览器打开 nginx模板,将其中的 example.com 替换成自己域名

将20和43行的/home/mastodon/live/public改成/home/mastodon/mastodon/public

将 ssl 证书部分改为我们刚刚复制出来的内容

然后复制修改后的配置文件

清空原配置文件:

echo > zarath.me.conf

编辑配置文件:

nano zarath.me.conf

将我们修改的配置文件粘贴进去,保存退出

然后重启 nginx:

lnmp nginx restart

稍等一下,然后浏览器打开你的域名,属于你自己的 Mastodon 站点已经搭建成功!

开启全文搜索(可选)

接下来使用 elasticsearch 配置全文搜索(可选,不是必须的,不过建议设置)

执行:

cd /home/mastodon/mastodon
nano docker-compose.yml

编辑docker-compose.yml,去掉 es 部分前所有的 # 号,并且去掉 web 部分中 es 前面的 # 号

20210103-637.jpg

20210103-638.jpg

然后再 nano .env.production 编辑 .env.production 文件,加上以下内容:

ES_ENABLED=true
ES_HOST=es
ES_PORT=9200

重启容器:

docker-compose down
docker-compose up -d

此时会拉取 elasticsearch 镜像,完成后,输入 ls 会看到文件夹内多出一个 elasticsearch 文件夹

设置权限:

chown 1000:1000 -R elasticsearch

再次重启容易:

docker-compose down
docker-compose up -d

然后生成索引:

docker-compose run --rm web bin/tootctl search deploy

设置完毕!

可能遇到的坑

如果你搭建完毕后,打开站点, Ctrl F5 强制刷新后,出现如下问题:

  • 页面空白
  • 页面排版错误

而 F12 也似乎没有发现问题,只有空白页处能看到提示:使用 Mastodon 网页版应用需要启用 JavaScript。你也可以选择适用于你的平台的 Mastodon 应用

造成以上问题的原因,可能是由于你使用 CloudFlare 做 CDN,然后在将域名托管到 CF 时,默认选择了 Auto Minify

解决办法:

20210103-640.jpg

向下滑动,取消勾选如下三项:

20210103-641.jpg

然后再到 Caching 清除缓存:

20210103-642.jpg

之后再刷新应该就没有问题了。

后记

之所以搭建 Mastodon,源于10年前许下的承诺,要搭建一个网站作为生日礼物,送给我的另一半。

后续将会继续编写 Mastodon 相关教程。

Last modification:January 5, 2021
如果觉得我的文章对你有用,请随意赞赏