Hướng dẫn cài đặt Mastodon trên CentOS 7

Chào các bạn,

Bài viết hôm nay sẽ hướng dẫn các bạn cài đặt Mastodon trên CentOS 7.

Giới thiệu

Mastodon là một ứng dụng mạng xã hội mã nguồn mở, cho phép bạn cài đặt lên server các nhân nào và tự tạo cho mình một nơi để sống ảo. Các chức năng và giao diện của Mastodon khá giống với Twitter, đến cả nút đăng status cũng bắt chước âm thanh Tweet – Toot!.

Cài đặt các thành phần cần thiết

NodeJS & Yarn

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
yum -y install nodejs
wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
yum -y install yarn

Redis

yum -y install redis
systemctl start redis
systemctl enable redis

Các Library cần thiết

yum -y install ImageMagick git libxml2-devel libxslt-devel gcc bzip2 openssl-devel zlib-devel gdbm-devel ncurses-devel autoconf automake bison gcc-c++ libffi-devel libtool patch readline-devel sqlite-devel glibc-headers glibc-devel libyaml-devel libicu-devel libidn-devel

Development Tools

yum -y groupinstall 'Development Tools'

Cài đặt và cấu hình PostgreSQL

rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum -y install postgresql96-server postgresql96-contrib postgresql96-devel

Khởi tạo database cho PostgreSQL

/usr/pgsql-9.6/bin/postgresql96-setup initdb

Sau khi cài đặt thành công, các bạn mở file /var/lib/pgsql/data/pg_hba.conf và đổi các giá trị từ ident qua md5 như sau

# 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

Restart PostgreSQL

systemctl restart postgresql

Đổi password cho User Postgres

passwd postgres

Đăng nhập vào user Postgres để tạo User mới cho Mastodon

su - postgres
createuser mastodon
psql

Đặt password cho User mới

ALTER USER mastodon WITH ENCRYPTED password 'Password' CREATEDB;
\q
exit

Sau đó các bạn cài đặt thêm 1 số thư viện cho Postgres

yum -y install libpqxx-devel protobuf-devel

Cài đặt Ruby

adduser mastodon -d /opt/mastodon
su - mastodon

Add  GPG key của RVM

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

Tiến hành cài đặt RVM

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

Sau khi cài đặt RVM thành công, các bạn cài tiếp phiên bản Ruby 2.5.2

rvm install 2.5.2
rvm use 2.5.2

Tiếp theo cài đặt Bunbler và cài đặt các library cần thiết cho ứng dụng Mastodon

gem install bundler

Cài đặt và cấu hình dịch vụ Mastodon

Download mã nguồn Mastodon từ Github

cd ~
git clone https://github.com/tootsuite/mastodon.git app
cd app
bundle install --deployment --without development test

Cài đặt các dependencies cho NodeJS

yarn install --pure-lockfile

Sau đó tiến hành cấu hình ứng dụng Mastodon bằng lệnh sau:

RAILS_ENV=production bundle exec rake mastodon:setup

Lệnh trên sẽ hướng dẫn bạn cấu hình Mastodon step by step, ví dụ cấu hình như sau:

Your instance is identified by its domain name. Changing it afterward will break things.
Domain name: mastodon.domain.com

Single user mode disables registrations and redirects the landing page to your public profile.
Do you want to enable single user mode? No

Are you using Docker to run Mastodon? No

PostgreSQL host: /var/run/postgresql
PostgreSQL port: 5432
Name of PostgreSQL database: mastodon_production
Name of PostgreSQL user: mastodon
Password of PostgreSQL user:
Database configuration works! 

Redis host: localhost
Redis port: 6379
Redis password:
Redis configuration works! 

Do you want to store uploaded files on the cloud? No

Do you want to send e-mails from localhost? No
SMTP server: smtp.domain.com
SMTP port: 587
SMTP username: admin@mastodon.com
SMTP password:
SMTP authentication: plain
SMTP OpenSSL verify mode: none
E-mail address to send e-mails "from": Mastodon <notifications@mastodon.domain.com>
Send a test e-mail with this configuration right now? Yes
Send test e-mail to: admin@domain.com

This configuration will be written to .env.production
Save configuration?: Yes

Now that configuration is saved, the database schema must be loaded.
If the database already exists, this will erase its contents.
Prepare the database now? Yes

The final step is compiling CSS/JS assets.
This may take a while and consume a lot of RAM.
Compile the assets now? Yes

All done! You can now power on the Mastodon server 

Do you want to create an admin user straight away? Yes
Username: admin
E-mail: admin@domain.com
You can login with the password: 80b4aA233adaeS86d095Scbf79302f81
You can change your password once you login.

Sau khi hoàn thành việc cấu hình và compile Mastodon, các bạn logout ra khỏi User Mastodon, trở về root và cấu hình tiếp cho Nginx và tạo file startup cho Systemd

Cài đặt Nginx và Certbot

yum -y install nginx certbot

Nếu bạn có dùng Firewalld, thêm các rules sau để Allow HTTP/HTTPS

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Cấp phát SSL Let’s Encrypt sử dụng Certbot

certbot certonly --standalone -d mastodon.domain.com

Sau khi Certbot cấp phát, chúng ta tạo thêm Cronjob để tự động renew Certificate

crontab -e

Thêm vào danh sách Cronjob cấu hình sau

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

Tạo file cấu hình Nginx /etc/nginx/conf.d/mastodon.conf và thêm vào nội dung config như sau:

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

server {
listen 80;
listen [::]:80;
server_name mastodon.domain.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_namemastodon.domain.com;

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/mastodon.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mastodon.domain.com/privkey.pem;

keepalive_timeout 70;
sendfile on;
client_max_body_size 0;

root /opt/mastodon/app/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 @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;
}

Thay đổi nội dung domain của bạn và đường dẫn tới các file SSL Let’s Encrypt cấp phát trước đó.

Start và Enable Nginx

systemctl start nginx
systemctl enable nginx

Các bạn allow thêm port 4000 cho service API của Mastodon

firewall-cmd --permanent --zone=public --add-port=4000/tcp
firewall-cmd --reload

Và thêm permission cho folder chạy Nginx

chmod +x /opt/mastodon

Tạo file khởi động cho Systemd, tạo file mới /etc/systemd/system/mastodon-web.service và thêm vào nội dung sau:

[Unit]
Description=Mastodon Web Service
After=network.target

[Service]
Type=simple
User=mastodon
Group=mastodon
WorkingDirectory=/opt/mastodon/app
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/bin/bash -lc 'bundle exec puma -C config/puma.rb'
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

Tiếp theo tạo file /etc/systemd/system/mastodon-queue.service và thêm vào nội dung sau:

[Unit]
Description=Mastodon Queue Service
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/opt/mastodon/app
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=/bin/bash -lc 'bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push'
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

Cuối cùng tạo file startup cho API service /etc/systemd/system/mastodon-api.service

[Unit]
Description=Mastodon Streaming
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/opt/mastodon/app
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/bin/npm run start
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

Enable các file config vừa tạo

systemctl enable mastodon-web mastodon-queue mastodon-api

Khởi động các dịch vụ

systemctl start mastodon-web mastodon-queue mastodon-api

Kiểm tra status của các dịch vụ

systemctl status mastodon-web mastodon-queue mastodon-api

Sau đó các bạn truy cập vào đường dẫn domain của bạn để kiểm tra dịch vụ đã hoạt động

Như vậy là các bạn đã cài đặt Mastodon thành công, tiến hành đăng nhập và bắt đầu Toot! thôi nào 😀

 

Rate This Article

Leave A Comment?