【2023年4月】無料OCIサーバーでのマストドン構築手順

トレンド
この記事は約27分で読めます。

初心者でも手軽にマストドンが作れるように、わかりやすさを意識して記事にしています。
一見、手順が多くて難しく思えるかも知れませんが、OCIサーバー構築を除けば
ほぼコピペで簡単にマストドンが構築できます(記事中のコピペ操作検証済み)
所要時間は約1時間半です。

事前準備

1.マストドンを動かすサーバーの用意。
  無料枠でサーバー確保できる、OCIがお勧めです。この記事もOCIサーバーが前提です。

2.マストドンサイトで使う独自ドメインの用意。
  最安1円から新規取得できる、XServerがお勧めです。

 何かと足らなくなる独自ドメイン。
通常、独自ドメインは1つ付きますが
こちらは独自ドメイン2つまで無料です。

3.用意した独自ドメインのDNS登録(IPアドレスとの紐づけ)
  無料でDNS登録が可能な、CloudFlareがお勧めです。

4.メール配信環境の用意。
  無料枠があり手続きが簡単な、SendGridがお勧めです。

事前作業

OCIでマストドンを動かすサーバーを構築します。

1) 構築するサーバー構成
  ・OS:Ubuntu 20.04
  ・シェイプ:VM.Standard.E2.1.Micro(CPU=1、メモリ=1GB)
  ・ディスク容量:50GB
  以下の記事が参考になります(但しシェイプが異なります)

2) 構築したサーバーのセキュリティルール変更
  ・ポート80(HTTP)、443(HTTPS)を開放

  以下の記事が参考になります(2.サーバー(OCI)でのポート開放)

3) 構築したサーバーのIPアドレスと独自ドメインのDNS登録。

DNS登録状況はnslookupコマンドで確認できます。

C:\Users\MyPC>nslookup
既定のサーバー:  aterm.me
Address:  192.168.10.1
> mastodon-xx.xyz
サーバー:  aterm.me
Address:  192.168.10.1
権限のない回答:
名前:    mastodon-xx.xyz
Address:  xxx.69.xxx.211

ここまでが、構築準備になります。

これ以降は、構築手順になります。

それではどうぞ。

mastodon構築手順

注1)手順に入る前に、mastodon公式ガイドに目を通すことをお勧めします。
注2)以降の手順では、基本は1行毎にコピペですが複数行跨り(行の最後が”/”)もあります。

以降は構築したサーバーに接続したコンソール上で作業します。

サーバー接続イメージ

1. システムの最新化

所要時間・・・約5分

sudo apt-get update; sudo apt-get upgrade -y; sudo dist-upgrade -y; sudo apt-get autoremove -y;

2. swapファイル作成(2GB)

sudo dd if=/dev/zero of=/swap bs=256M count=8
sudo chmod 0600 /swap
sudo mkswap /swap
sudo swapon /swap
sudo vim /etc/fstab
# 以下をfstabの一番下に追加
/swap swap swap defaults 0 0

3. 必要ソフトのインストール

所要時間・・・約10分

# Nodejsのリポジトリ登録
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
# Yarnのリポジトリ登録
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install nodejs -y
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
# 諸々必要なソフトのインストール
sudo apt-get update
sudo apt-get install git vim curl wget build-essential -y
sudo apt-get install ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \
  g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \
  bison build-essential libssl-dev libyaml-dev libreadline6-dev postgresql \
  zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
  nginx certbot  yarn libidn11-dev libicu-dev libjemalloc-dev \
  postgresql redis-server -y;
# 画像処理ソフトのインストール
sudo apt-get install imagemagick

4. ポートの開放

# rules.v4に以下2行のルールを追加
sudo vim /etc/iptables/rules.v4
# 場所は"-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT"付近
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
sudo systemctl restart netfilter-persistent

5. mastodonユーザー作成

# mastodonユーザー作成
sudo adduser --disabled-login mastodon
Adding user `mastodon' ...
Adding new group `mastodon' (1002) ...
Adding new user `mastodon' (1002) with group `mastodon' ...
Creating home directory `/home/mastodon' ...
Copying files from `/etc/skel' ...
Changing the user information for mastodon
# 以下の入力はリターン押下
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

6. rubyのインストール

所要時間・・・約20分

sudo 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 3.0.4
rbenv global 3.0.4
# bundlerのインストール
gem install bundler --no-document
# exitでmastodonユーザーを抜ける
exit

7. postgreSQLのユーザー作成

sudo -u postgres psql
# postgres=# プロンプト表示に変わります。
CREATE USER mastodon CREATEDB;
# postgreSQLプロンプトを終了
\q

8. mastodonのインストール

所要時間・・・約30分

sudo su - mastodon
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
# mastodonセットアップの実行
RAILS_ENV=production bundle exec rake mastodon:setup
# exitでmastodonユーザーを抜ける
exit
Your instance is identified by its domain name. Changing it afterward will break things.
# サイトで使用する独自ドメイン名を入力("your-domain"箇所を書き換えます)
Domain name: your-domain

Single user mode disables registrations and redirects the landing page to your public profile.
# お一人様サーバーとして作る場合は"y"を入力
Do you want to enable single user mode? yes
# Dockerを使用しないので"n"を入力
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
# メール配信サービス(SendGrid)の場合は以下を入力
SMTP server: smtp.sendgrid.net
SMTP port: 587
# メール配信サービス(SendGrid)の場合は以下を入力
SMTP username: apikey
# メール配信サービス(SendGrid)から取得のAPI KEYを入力(入力値は非表示)
SMTP password:
SMTP authentication: plain
SMTP OpenSSL verify mode: none
Enable STARTTLS: auto
E-mail address to send e-mails "from": Mastodon <notifications@mastodon-sw.xyz>
Send a test e-mail with this configuration right now? Yes
# テストメールの宛先を入力(以下は記入例)
Send test e-mail to: abc@123456.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
Running `RAILS_ENV=production rails db:setup` ...

Created database 'mastodon_production'
Done!

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

Running `RAILS_ENV=production rails assets:precompile` ...

yarn install v1.22.19
[1/6] Validating package.json...
[2/6] Resolving packages...
[3/6] Fetching packages...
[4/6] Linking dependencies...
warning Workspaces can only be enabled in private projects.
[5/6] Building fresh packages...
[6/6] Cleaning modules...
Done in 60.29s.
I, [2023-xx-xxT08:11:28.021239 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/doorkeeper/admin/application-a644908e7bab54fb749be0f59fb64a7480bbf9c4c2b79d4a65791cb7ab4d8730.css
I, [2023-xx-xxT08:11:28.021740 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/doorkeeper/admin/application-a644908e7bab54fb749be0f59fb64a7480bbf9c4c2b79d4a65791cb7ab4d8730.css.gz
I, [2023-xx-xxT08:11:28.085015 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/doorkeeper/application-c93dac2ad9d65e3393e0e2c958481e86ef7a5e5b0f6ce406842a7b99b25a4850.css
I, [2023-xx-xxT08:11:28.085303 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/doorkeeper/application-c93dac2ad9d65e3393e0e2c958481e86ef7a5e5b0f6ce406842a7b99b25a4850.css.gz
I, [2023-xx-xxT08:11:28.093284 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/pghero/favicon-db10337a56c45eb43c22ff5019546b520fa22c7281d4d385f235cbca67ed26bb.png
I, [2023-xx-xxT08:11:29.490363 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/pghero/application-a60bf0a452ed064fef3594cf52a4c998712da7c76150f890f4eaa644f59671e4.js
I, [2023-xx-xxT08:11:29.495624 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/pghero/application-a60bf0a452ed064fef3594cf52a4c998712da7c76150f890f4eaa644f59671e4.js.gz
I, [2023-xx-xxT08:11:29.514550 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/pghero/application-c31338f656687c1d733bb0f48d40acd076e24060f3dcff83b34870e4ccc2789d.css
I, [2023-xx-xxT08:11:29.515040 #45856]  INFO -- : Writing /home/mastodon/live/public/assets/pghero/application-c31338f656687c1d733bb0f48d40acd076e24060f3dcff83b34870e4ccc2789d.css.gz
Compiling...
Compiled all packs in /home/mastodon/live/public/packs
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Done!

All done! You can now power on the Mastodon server ?
# mastodon管理者アカウントの作成
Do you want to create an admin user straight away? Yes
Username: admin
# アカウントに必要なメールアドレスを入力(以下は記入例)
E-mail: abc@123456.com
# ログイン時に必要になるパスワード(要メモ)
You can login with the password: 246664d88798d75675a73d7586855173
You can change your password once you login.
<--- JS stacktrace --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
 1: 0xb08f10 node::Abort() [node]
 2: 0xa1b70e  [node]
 3: 0xce19d0 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xce1d77 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xe993e5  [node]
 6: 0xea90ad v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 7: 0xeabdae v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
 8: 0xe6d2ea v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node]
 9: 0x11e60d6 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node]
10: 0x15d9d59  [node]
That failed! Maybe you need swap space?

上記エラー(メモリ不足)になった場合は以下を実行後にやり直します。

# 構築のサーバースペックがメモリ1GBなので、ヒープ領域(メモリ)を最大1GB確保
export NODE_OPTIONS="--max-old-space-size=1024"

9. nginxの設定

# mastodonが用意した雛形ファイルを所定の場所にコピー
sudo cp /home/mastodon/live/dist/nginx.conf /etc/nginx/conf.d/mastodon.conf
# mastodon.confファイルの編集
sudo vim /etc/nginx/conf.d/mastodon.conf
# 編集1) example.com 記述箇所を<サイトで使用する独自ドメイン>に全て置換。
:%s/example.com/your-domain/g
# 編集2) 以下2か所のコメント(左端の#)を外す。
ssl_certificate     /etc/letsencrypt/live/your-domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain/privkey.pem;
#
sudo systemctl stop nginx
# your-domainを<サイトで使用する独自ドメイン>に置換して実行。
sudo certbot certonly --standalone --rsa-key-size 4096 -d your-domain
sudo systemctl start nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
# メールアドレス(証明書更新案内用途)を入力
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): abc@123456.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at

404 Page not found - Let's Encrypt
Let's Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Res...
You must agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # "A"を入力 (A)gree/(C)ancel: A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # "Y"を入力 (Y)es/(N)o: Y Obtaining a new certificate Performing the following challenges: http-01 challenge for mastodon-xx.xyz Waiting for verification... Challenge failed for domain mastodon-xx.xyz http-01 challenge for mastodon-xx.xyz Cleaning up challenges Some challenges have failed. IMPORTANT NOTES: - The following errors were reported by the server: Domain: mastodon-xx.xyz Type: connection Detail: xxx.230.xxx.146: Fetching http://mastodon-xx.xyz/.well-known/acme-challenge/4ligDigELRgpJkg5lVgEs_621i39dYTIoOu7jpBGw70: Error getting validation data To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address. Additionally, please check that your computer has a publicly routable IP address and that no firewalls are preventing the server from communicating with the client. If you're using the webroot plugin, you should also verify that you are serving files from the webroot path you provided. - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.

上記のエラーとなる場合は、一旦サーバーを再起動後にやり直してみて下さい。

sudo reboot now

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mastodon-xx.xyz
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mastodon-xx.xyz/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/mastodon-xx.xyz/privkey.pem
   Your cert will expire on 2023-xx-xx. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

10. mastodonのサービス登録

# mastodonが用意したファイルを所定の場所にコピー
sudo cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
# デーモン(サービス)の自動起動設定
sudo systemctl enable mastodon-{web,sidekiq,streaming}
# デーモン(サービス)の起動
sudo systemctl start mastodon-{web,sidekiq,streaming}

11. cron設定(メディアの削除)

sudo su - mastodon
# cron内容を編集(以下の2行を追加)
crontab -e
# 毎日3時にチェックして、3日より前のリモートメディアを削除
00 3 * * * cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shims/bundle exec bin/tootctl media remove --days=3
# 毎日5時にチェックして、10日より前のpreview cardを削除
00 5 * * * cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shims/bundle exec bin/tootctl preview_cards remove --days=10
# exitでmastodonユーザーを抜ける
exit

12. cron設定(SSL証明書の更新)

# cron内容を編集(以下の1行を追加)
sudo crontab -e
# 毎週チェックして、SSL証明書を更新
@weekly certbot renew

13. 接続確認

ブラウザからURL入力 (入力例 https://mastodon-xx.xyz/)

結果、以下の画面が表示された時は、ログを参考に調査が必要ですが、経験的に「10.mastodonのサービス登録」後の数分間は繋がりにくいので時間をおいて試してみて下さい。

以下の画面が表示されれば成功です。
「8.mastodonのインストール」で取得のパスワードでログインします。

14. 動作確認

構築直後は他から情報が流れてこない寂しい状態になっていますが、リレー登録を行なうことで情報が流れてきます。

試しに「管理」>「リレーを追加」から、以下のリレーURLを追加してみます。
https://hashtag-relay.dtp-mstdn.jp/inbox

リレー登録後、ステータスが「有効」になり連合タイムラインに情報が流れ出しました。

スマホで開くとこんな感じです。

以上です。


15. 最後に

参考にさせて頂いたサイトを記載します。
・https://ir1s.com/free_mastodon/