Mastodon 是个比较流行的分布式社交网络程序,我原来有介绍过一些东西,大家可以先看一下:Mastodon(长毛象) – 分布式社交网络服务
距离我介绍它到现在,已经过去了有两年了,两年里 Mastodon 壮大得很快,开发者也一直在积极更新,再加上由于近些年微博、G+和 Twitter 的几次事件,使得 Mastodon 更加为人熟知了,有些人便萌生了想自己搭建一个实例的想法(比如我),因此便诞生了此文。
一、准备工作
先交代一下自己这边的系统环境,全新的 Debian 10 64位系统。另外,本教程是完全根据官方给的教程来操作的,当然设计到个人的一些习惯问题,没有照搬着官方的说法来做,对这方面有异议的你也可以按照官方的教程自己来搭建:https://docs.joinmastodon.org/administration/installation/
再有就是,在开始教程你要做好两点觉悟,一是 Mastodon 非常依赖 HTTPS,所以你后面需要给网站加好 HTTPS 和 SSL 有关证书,二是如果 Mastodon 部分功能设计到邮件的发送,需要 SMTP 服务,需要前期先找一家服务商准备好,这里就略过不说这部分的内容了。
另外,为了服务器安全的考虑,我个人和官方也都推荐你设置下 Iptables 防火墙,教程的话可以简单参考下我写的博文:[CentOS/Debian]关于 Iptables&Ip6tables 防火墙的配置及保存应用
Iptables 的规则设置我这里就不另外说了,可以参考下官方教程里的规则,我这里也贴出来一下:
# 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
二、正式安装
请注意,以下所有操作如没有具体说明,都是在 root 用户下进行的,如果你的系统用的不是这个用户,请先保证自己能开启并使用该用户,后面不会再对此额外说明。
1.Web Server 安装
这里我选择的是 Nginx,主要是由于我想要自定义一些功能,用包管理器安装的 Nginx 不好自行编译,有些东西就不好用了,再加上全部自己编译技术方面感觉我也不好做到最好,所以这里选择的是 LNMP 一键安装脚本且选择的是只安装 Nginx 模式。如果你想选择包管理器里的 Nginx,或者别的什么操作都可以,总之先自己把 Nginx 安装好就行了。
先用 Screen 创建个 LNMP 进程:
screen -S lnmp
没有 Screen 的自己安装一下吧,Debian 的命令如下:
apt-get install screen
创建好进程之后,输入如下命令开始只安装 Nginx 模式:
wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh nginx
2.一些必要准备
下面这些东西都是安装 Mastodon 过程中都会用上的,要注意先弄好。
curl
安装命令如下:
apt-get install -y curl
嘛,其实如果你按照前面我做的安装了 Nginx,这个就不需要安装了,已经有了。
Node.js
安装命令如下:
curl -sL https://deb.nodesource.com/setup_12.x | bash -
Yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
3.一些包的安装
这些安装的包都是官网文档里所说的需要的,大家直接照着安装就是了。不过在安装之前保险起见还是先更新一下源:
apt-get update
然后安装下面的这些包:
apt-get install -y \ imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git \ g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \ bison build-essential libssl-dev libyaml-dev libreadline-dev \ zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev \ redis-server redis-tools postgresql postgresql-contrib \ yarn libidn11-dev libicu-dev libjemalloc-dev
这里简单说明下,官方教程里的此部分安装的包和我写的不太一样,我把官方文档里写的我有改动的地方列出来给大家简单解释下吧:
git:官方给的教程里是安装 git-core,这是出于历史原因,不过新一点的系统已经不存在这个问题了,像 Debian 就直接提醒我装 git 就可以了(来自系统提示)
libreadline-dev:原教程中是让安装 libreadline6-dev 这个,我用的是 Debian 10,可以直接安装 libreadline-dev(来自系统提示)
libgdbm6:原教程中是安装 libgdbm5,我用的 Debian 10 找不到这个包,后来经查找得知已经有了更新的 libgdbm6 且向下兼容,所以就装了 libgdbm6
nginx:前面所述自己安装好了,如果你喜欢用包管理器里的,可以自己加上安装
certbot python-certbot-nginx:这两个主要是用来给你自动生成和续签 Let’s Encrypt 证书的,我不是很需要所以我没有安装,我是自己配置的
4.安装 Ruby
首先用如下命令给系统添加一个专属的用户 mastodon:
adduser --disabled-login mastodon
输入之后直接执行就可以了,中间可能会有一些问题让你来填写该用户的个人信息,没必要填写直接回车就可以跳过了。
PS:这个用户专用于 Mastodon 程序,不需要密码即可切换使用,如果你想自定义一个用户名的话也不是不可以,只是需要注意后面所有涉及到这个用户的操作都要相应的改动下。
然后切换到这个用户:
su - mastodon
然后一条命令一条命令输入安装 rbenv 和 rbenv-build:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv cd ~/.rbenv && src/configure && make -C src echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc exec bash git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
搞定之后再安装 Ruby:
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.6 rbenv global 2.6.6
PS:目前的 Mastodon 要求得 Ruby 2.6.6 版本,以后在下面安装 Mastodon 时碰到提示版本不对的问题,在这里修改下版本号装上要求的版本即可。
接着安装 bundler:
gem install bundler --no-document
上面的都搞定之后,用命令再切换回 root 用户:
exit
PS:用 su – 也可以,开发者的习惯问题。
5.PostgreSQL 数据库配置
这里作者有说一个服务帮你完成数据库的性能配置什么的,我这里就直接跳过开始正常的教程了。如果你想自己优化下数据库配置信息的话,可以看看:https://pgtune.leopard.in.ua/#/
创建一个数据库用户
教程这里写的是最简单的数据库用户创建,这个用户能被系统内的程序直接使用,不需要密码也没办法被外部访问使用。
首先先用 su 命令切换到 PostgreSQL 默认的用户,然后执行 psql 命令:
su - postgres psql
完成之后,输入如下命令创建 mastodon 数据库用户和对应名称的数据库:
CREATE USER mastodon CREATEDB;
搞定之后输入下面的命令退出:
\q
6.Mastodon 程序安装和简单设置
这里就开始正式的程序安装了,真不容易~
首先还是要切换到 mastodon 专属用户,注意要在 root 用户下切换哦,如果没切换到 root 用户先用“su -”这个命令切换到 root 用户,然后再输入下面的命令:
su - mastodon
Clone 程序源码并检查版本号
这个没什么好说的,照着做就可以啦,最后看一下版本提示里写的是不是最新版:
git clone https://github.com/tootsuite/mastodon.git live && cd live git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
依赖项安装
输入下面的代码安装一些必要的依赖项:
bundle config deployment 'true' bundle config without 'development test' bundle install -j$(getconf _NPROCESSORS_ONLN) yarn install --pure-lockfile
如果在安装的过程中提示 Ruby 版本不对什么的,按照提示去修改下安装 Ruby 那一步里的版本号,对于已经安装的用户,输入下面的命令来安装符合要求的版本(注意先切换到 mastodon 用户):
cd ~/.rbenv RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install x.x.x(版本号) rbenv global x.x.x(版本号)
生成 Mastodon 配置文件
输入下面的命令会进入配置向导,按照要求输入有关信息:
RAILS_ENV=production bundle exec rake mastodon:setup
这里其实有很多东西需要交代的,不过时间太久了我没有及时截图,只能凭记忆跟大家来说明了。
首先是域名的设置,这个大家照着写实际用于 Mastodon 的域名就可以了,其次是数据库的地址,用户名和密码的设置什么的,由于我们前面创建的是本地的数据库,且是能在 Mastodon 用户下直接访问的,所以按照它括号里提示的那个默认的写就是了,或者直接回车也可以。另外还有就是 SMTP 的配置,这个最开始已经和大家说过了,需要额外申请设置的,按照自己 SMTP 服务商给的信息填写就行。由于邮件发送这个设计到重设密码和用户注册/邀请,请务必认真对待填写。还有一个我记得是询问是否为单用户模式还是什么的,根据自己的需求来设置,单用户就是只有你一个人用。另外还会提示你是否创建一个全局管理员,这个个人觉得非常有必要,请务必设置好,可以用来当自己的 Mastodon 账号来使用。
设置 Nginx
首先还是先切换到 root 用户,命令不想写了……
由于我最开始是安装的 LNMP 里的 Nginx,所以官方文档里的命令就不太适用了,如果你和我一样操作的话,只需要自己在 /usr/local/nginx/conf/vhost/ 这个目录新建一个 conf 配置文件,并把 /home/mastodon/live/dist/nginx.conf 这个文件里的内容全部复制粘贴到你自己新建的配置文件里就可以了。
做完上面的事情之后,记得将配置文件里的 example.com 全部改成你自己 Mastodon 程序使用的实际域名,然后将配置文件中有关 SSL 证书的路径换成你自己证书的路径,这点非常重要!因为我前面也说了我没有用自动生成的证书,所以这里是需要自己改一下配置的。
然后输入下面的命令重启下 Nginx:
lnmp nginx restart
PS:如果你是按照官方的教程来操作的(也就是用了包管理器里的 Nginx),直接照着官方的命令输入执行就可以了。
设置服务
使用 root 用户执行下面的命令,将 Mastodon 的有关服务拷贝到系统里:
cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
做完之后去 /etc/systemd/system/ 目录下看有没有多了几个 mastodon 开头的文件,一个一个检查下里面配置填写的用户名和路径有没有问题,如果你前面有自己设置别的用户来运行 Mastodon 的话。
然后启动并激活这些服务:
systemctl daemon-reload systemctl start mastodon-web mastodon-sidekiq mastodon-streaming systemctl enable mastodon-web mastodon-sidekiq mastodon-streaming
做完这些之后,你的 Mastodon 应该跑起来了,可以输入网址看看效果了。
结束
本文实际上写的有些仓促,大部分内容都是照着官方文档里的来写的,只是根据我自己的需要简单的修改了一下。本来的话我是打算将简单配置教程和怎么更新 Mastodon 程序和必要组件也写出来的,无奈懒癌发作没坚持写完,只能作罢留待后面再来添加了。
另外最后特别说明一点,由于 Mastodon 有个机制是会将外部 Mastodon 实例的多媒体资源缓存到你的实例里,长期运行下来会导致你服务器的磁盘爆炸,所以个人推荐最好设置个定时任务定时清理下这些缓存的多媒体文件,清除他们并不会影响到你服务器的正常运行。这部分的教程我应该会再补充说明的,暂时先就这样吧!
作者大大,我建立的长毛象实例无法在公共时间轴上看到任何其它实例用户的活动,是为什么呀?需要另外配置什么嘛?求教
跨站时间轴里面显示的其实是所有和你的实例有过互动的东西,比如本实例用户关注的其它实例用户发的嘟文,双方用户互动(公开的回复,转嘟)过的嘟文之类的,不是说显示的就是整个 Mastodon 网络的实时动态。如果你的实例不活跃或者和其它实例没什么交流的话,自然就不会显示什么东西了。要解决这个问题,你可以在 Mastodon 的后台设置里添加中继节点,添加了同一个中继节点的实例可以通过中继转发自己的实例公开嘟文或者接受其它实例的公开嘟文,这样子跨站时间轴就会丰富很多了。