今天来写一下如何在CentOs7下搭建安装Mastodon实例。毕竟之前自己安装的时候也踩过不少坑...

前言

Mastodon(长毛象)是一款“去中心化”类Twitter应用。

什么,你说你没听说过?

著名插画网站 Pixiv(P站)运营的 pawoo就是一个Mastodon实例。

还是没听说过?
是在下输了.jpg
好吧,或许下面的这个视频可以帮助你理解什么是Mastodon~

简介

404 not found.png
Mastodon是一个基于ActivityPub的免费开源社交网络服务器。关注朋友,发现新朋友。发布您想要的任何内容:链接,图片,文字,视频。其所有服务器都可以作为联合网络进行互操作,即一台服务器上的用户可以与另一台服务器上的用户无缝通信。这包括也实现ActivityPub的非Mastodon软件!

安装

安装要求:

一台内存大于或等于2GB的VPS
Root权限
一个解析好的顶级域名或子域名

更新系统并安装必要的软件包

yum -y update

安装开发工具包:

yum -y groupinstall "Development Tools"

安装项目所需依赖:

yum -y install wget curl git openssl-devel readline-devel libicu-devel libidn-devel postgresql-devel protobuf-devel libxml2-devel libxslt-devel ncurses-devel sqlite-devel gdbm-devel zlib-devel libffi-devel libyaml-devel

安装宝塔面板(可选)

Centos安装命令

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh

安装完成后登录面板并安装LNMP环境。

安装Node.js和Yarn

从NodeSource存储库安装 Node.js v8 LTS,这取决于启用的EPEL存储库。

安装EPEL源:

yum -y install epel-release

安装NodeJS 8.x:

curl -sL https://rpm.nodesource.com/setup_8.x | bash -
yum -y install nodejs

安装Yarn包管理器:

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum -y install yarn

安装PostgreSQL数据库

更新源:

地址:https://yum.postgresql.org/repopackages.php
Repo RPMs

选择 Centos7-x86 64 后右键复制链接。

安装:

yum install 刚才复制的链接地址 -y
yum install postgresql10-contrib postgresql10-server -y

初始化PostgreSQL数据库数据:

/usr/pgsql-10/bin/postgresql-10-setup initdb

更改PostgreSQL的配置文件:

vi /var/lib/pgsql/10/data/pg_hba.conf

找到以下行并将peer更改为trust并将其更改为md5。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

更新后,配置应如下所示。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

启动PostgreSQL以及设置开机启动:

systemctl enable postgresql-10
systemctl start postgresql-10

systemctl status postgresql-10查看运行状态,显示active则运行正常。

登录PostgreSQL用户:

su - postgres

创建一个数据库用户:

createuser mastodon

PostgreSQL提供了psql shell来对数据库运行查询,通过运行切换到PostgreSQL shell:

psql

为Mastodon数据库的新创建的用户设置密码,并提供添加新数据库的权限:

ALTER USER mastodon WITH ENCRYPTED password 'DBPassword' CREATEDB;

用强密码替换DBPassword,从psql shell退出:

\q

返回root用户:

exit

安装Redis并设置开机启动

yum -y install redis
systemctl start redis
systemctl enable redis

systemctl status redis查看运行状态,显示active则运行正常。

安装imagemagick和FFMPEG

yum -y install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.0.8-23.x86_64.rpm
yum -y install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.8-23.x86_64.rpm

imagemagickge版本更新频率很快,若显示 Error: Nothing to do命令。
请到网站查看并更换成最新版本。

yum -y install 更换的ImageMagick-libs链接
yum -y install 更换的ImageMagick链接

安装FFMPEG(可选):

sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
sudo yum install ffmpeg ffmpeg-devel -y

安装Ruby

为Mastodon创建一个新用户并切换到新创建的用户:

sudo adduser mastodon
sudo passwd mastodon
sudo su - mastodon

使用 Ruby Version ManagerRVM安装最新版本的Ruby,它将用于安装和管理多个版本的Ruby。

访问rvm.io并导入所需GPG密钥:

gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

安装RVM:

curl -sSL https://get.rvm.io | bash -s stable
source /home/mastodon/.rvm/scripts/rvm

获取Ruby的可用版本列表:

rvm list known

现在从列表中安装最新版本的Ruby:

rvm install 2.5.3

完成之后设置使用的版本:

rvm use 2.5.3

尽量安装最新版本的Ruby来使用Mastodon。

切换回Mastodon用户并从Github拉取最新项目文件:

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)

安装bundler(Ruby应用程序的依赖项管理器)和ruby依赖:

gem install bundler
bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test

安装Node.js依赖:

yarn install --pure-lockfile

配置Mastodon

以下命令使用 mastodon用户运行,切换到Mastodon安装目录并运行以下命令以启动安装程序:

cd ~/live
RAILS_ENV=production bundle exec rake mastodon:setup

在这个向导中,你应该按照如下配置来填写:

Q:Domain name:
A:填写你的域名地址,不要带www

Q:Do you want to enable single user mode? 
A:N

Q:Are you using Docker to run Mastodon? 
A:n

Q:PostgreSQL host: /var/run/postgresql
A:回车

Q:PostgreSQL port: 5432
A:回车

Q:Name of PostgreSQL database: mastodon_production
A:回车

Q:Name of PostgreSQL user: mastodon
A:回车

Q:Password of PostgreSQL user:
A:你之前设置的PostgreSQL数据库密码

Q:Redis host: localhost
A:回车

Q:Redis port: 6379
A:回车

Q:Redis password:
A:回车

Q:Do you want to send e-mails from localhost?
A:y(可以选no,选用smtp邮件服务器)

Q:Send a test e-mail with this configuration right now?
A:n

Q:Save configuration?
A:y

Q:Prepare the database now?
A:y

Q:Compile the assets now?
A:y

Q:Do you want to create an admin user straight away?
A:y

创建Mastodon系统服务

以root用户或sudo用户运行,从Mastodon目录复制systemd服务模板

su root
cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/

然后编辑文件以确保用户名和路径正确:

/etc/systemd/system/mastodon-web.service
/etc/systemd/system/mastodon-sidekiq.service
/etc/systemd/system/mastodon-streaming.service

最后,启动并启用新的systemd服务:

systemctl start mastodon-web mastodon-sidekiq mastodon-streaming
systemctl enable mastodon-*

检查它们是否正常运行:

systemctl status mastodon-web.service
systemctl status mastodon-sidekiq.service
systemctl mastodon-streaming.service

Nginx配置修改

Mastodon默认需要SSL证书

宝塔面板可以在面板申请
非面板用户可在文章末的补充处使用certbot申请

宝塔面板

上面安装了宝塔面板的小伙伴们请看这,登录宝塔面板,然后点击软件管理中的Nginx管理,先停止Nginx服务,然后点击配置修改
宝塔伪静态设置.png
把user的 www修改成 mastodon,如上图所示。
然后添加站点,修改站点设置中的配置文件。
宝塔伪静态修改.png

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

server {
  listen 80;
  listen [::]:80;
  server_name 你的域名;
  root /home/mastodon/live/public;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name 你的域名;

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

  ssl_certificate     /etc/letsencrypt/live/你的域名/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    try_files $uri @proxy;
  }

  location @proxy {
    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 X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    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 X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

非宝塔面板

从Mastodon目录复制 nginx的配置模板:

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

然后编辑 /etc/nginx/sites-available/mastodon来将 example.com替换为你自己的域名,并进行你可能需要的任何其他调整。

重新加载nginx以使更改生效:

systemctl reload nginx

补充

本地发信

如果之前Mastodon配置时选择了本地发信,直接装个 sendmail应该就可以成功发信了:

yum -y install sendmail

运行并设置开机启动:

systemctl start sendmail
systemctl enable sendmail

自动签发Let’s Encrypt证书:

安装了宝塔面板的小伙伴们可以跳过。

安装Certbot:

yum -y install certbot

给你的域名签发证书(example.com替换成你的域名):

certbot certonly --standalone -d example.com

证书如果签发成功,那么证书的存储路径应该是:

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

配置Certbot自动续约证书:

crontab -e

写入:

0 0 * * * /usr/bin/certbot renew --quiet

配置好了后,certbot会在每天的0点检查证书是否过期,如果过期就自动续约证书。

修改完成后,打开你的域名。不出意外的话,属于你的Mastodon实例就已经搭建完成了~
404 not found用户页面.png
最后,本教程具有一定的时效性,若安装时出现错误,请自行谷歌解决问题(毕竟我自己也是这样做的)

当然,个人还是建议依据官方安装文档来安装,这样肯定不会出错。

如果觉得我的文章对你有用,请随意赞赏