マストドン建ったけど
マストドン建ったけど、結局スタートアップスクリプトで勝手に入っていただけという状態。コピペしか出来なくてもやっぱり自分で建ててみたい。VPSをもう一個というわけにもいかないのでVMwareでやる。ドメインの問題とかで更にハードルが上がりそうだけど。
結局VPSもリセットして同じ方法で入れ直した。証明書の入れ方が違うくらい。あとメールも飛ばして欲しいのでPostfixは入れた。それから監視用にLogwatchも。
もとネタ
まずは公式。
Installing from source - Mastodon documentation
Ubuntu 18.04と書いてある。素直にUbuntu使えばいいだけの話なんだけど始めてさわったのがTurboLinuxでそのごずっとrpm系だったから他の系はちょっと…
それから参考サイト
Mastodonインスタンス構築(Mastodon) - CentOSで自宅サーバー構築
比較的更新時期が新しいのでここを参考に。
後はVPSに入れたときのログがあるので。
作業開始
まずはdnf upgradeでもろもろ最新に。それから残念ながらSELinuxは無効に。
あとfirewalldでhttpとhttpsを通す。これは前回も使った
ネコでもわかる!さくらのVPS講座 ~第三回「Apacheをインストールしよう」 | さくらのナレッジを参考に。
次にdnfにリポジトリを追加。これはVPSのログを参考に
dnf config-manager --add-repo https://negativo17.org/repos/epel-multimedia.repo
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
このnegativo17がくせ者でレスポンスがえらく悪いときがある。最初スタートアップスクリプトが失敗したのもそのせいかもしれない。dnfは30秒でタイムアウトなるがスクリプトは先へ進んでしまい途中でパッケージが見つからずエラーになる。
次に各種パッケージのインストール。ここでUbuntuとREH系の違いが出る。
まずNode.js。公式だとcurl -sLだがdnfで入れる。
dnf install nodejs
次はYarn。これはVPSのログに従ってnpm。
npm install -g yarn
ここからはapt対dnf。
imagemagick→--enablerepo=PowerTools ImageMagick
ffmpeg→--enablerepo=PowerTools ffmpeg
libpq-dev→libpq-devel
libxml2-dev→libxml2-devel
libxslt1-dev→libxslt-devel
file→インストール済み
git-core→git-core(VPS標準インストールだとインストール済み)
g++→gcc-c++(VPS標準インストールだとインストール済み)
g++をCentOSへインストールする - C++入門
libprotobuf-dev→--enablerepo=PowerTools protobuf-devel
protobuf-compiler→protobuf-develインストール時に済み
pkg-config→インストール済み
nodejs→あれ?さっき入れたよね
gcc→インストール済み
autoconf→autoconf(VPS標準インストールだとインストール済み)
bison→bison(VPS標準インストールだとインストール済み)
build-essential→groupinstall "Development Tools"
Ubuntu の build-essentials 的なことを yum でやりたいときの方法 - tokuhirom's blog
libssl-dev→openssl-devel
libyaml-dev→あきらめ(VPSにも入っていない)(PowerToolsにlibyaml-develが入っているっぽい)
libreadline6-dev→readline-devel
zlib1g-dev→zlib-devel(インストール済み)
libncurses5-dev→ncurses-devel(インストール済み)
libffi-dev→libffi-devel
libgdbm5→gdbm(インストール済み)
libgdbm-dev→gdbm-devel
nginx→nginx
redis-server→redis
redis-tools→rubygem-redis(あきらめ?)
postgresql→postgresql
postgresql-contrib→postgresql-contrib
certbot→certbot
python-certbot-nginx→python3-certbot-nginx
yarn→あれ?さっき入れたよね?dnfだと出てこない。
libidn11-dev→--enablerepo=PowerTools libidn-devel
libicu-dev→libicu-devel
libjemalloc-dev→--enablerepo=PowerTools jemalloc-devel
いくつか入らないのあったけど必要なら後で何とかするか。
次にマストドンユーザーの作成。
adduser mastodon
マストドンユーザーへ切り替え
su - mastodon
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
参考サイトだとここでmastodon直下に戻るべきっぽいのだが/home/mastodon/.rbenvにいるので自分で戻す。公式、どのディレクトリで作業するか書いてないのは不親切かな。
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
うーむ、.bashrcか.bash_profileか?←CentOSは.bash_profileが正解らしい。
exec $SHELL -l
Mastodon地域インスタンス「箕面どん」をv.2.4.0にアップデートしました – tonetalkを参考に。
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Rubyのインストール。参考サイトだと公式は2.6.6を指定。rbenvはRubyのバージョンを指定できるようにするツールとのこと。
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.6
ちょっと時間かかる。
rbenv global 2.6.6
2.6.6を使うという宣言。
gem install bundler --no-document
gemはRubyのパッケージ管理システム?
rootユーザーに戻る。
PostgreSQLのセットアップ
本当はpgTuneで計算してpostgresql.confを修正するらしいがちょっと無視。
systemctl restart postgresql
で、エラー。postgresql本体とpostgresql-contribしかインストールしていないがpostgresql-serverが必要な模様。
インストールしてもまだエラー。
参考サイトによるとpostgresql-setup initdbが必要な模様。
PostgreSQLのロケール問題
PostgreSQLはロケール(地域・言語といっていいのかな?)を無属性のCにしないとパフォーマンスの劣化やソートで問題を起こすらしい。で、このロケールをCにする方法だがあちこちにinitdbで--no_localeか--locale=Cにしろと書いてあるのだが今回の環境で行うとold-options: unrecognized optionと言われてエラーになってしまう。VPSのログを見たところ
export 'PGSETUP_INITDB_OPTIONS=--encoding=UTF-8 --no-locale'
を行ってからinitdbを行うのが正解らしい。
なお正しく設定せずにDBを作成してしまった場合はDBの再作成が必要となる。
CentOS 7.3にインストールしたPostgreSQL 9.4から9.6へアップデートする - ビー鉄ブログ
を参考にダンプ→/var/lib/pgsql/dataの削除→initdb→リストアで変更可能。
sudo -u postgres psql
許可がありませんとか言われるが気にせず
CREATE USER mastodon CREATEDB;
CREATE ROLEと表示されたのでOKだろう。
ついでに
select name,setting,context from pg_settings where name like 'lc%';
を打ってロケールがCになっていることを確認。
PostgreSQLのロケール(lc collate,lc ctype)の確認と変更 | 街のWeb屋さん
\qで抜ける。
再びmastodonユーザーへ。
git clone https://github.com/tootsuite/mastodon.git live && cd live
本丸のインストール(といってもgit cloneだけど)。終わると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
RAILS_ENV=production bundle exec rake mastodon:setup
マストドンのセットアップ。いろいろ聞かれる。どうもRedis関連で引っかかるので事前にrootで起動してredis-cli infoをしておくといいのかも。
Domain name:ドメインがないのでとりあえずlocalhostIPアドレスを指定しないと画像が表示されない。
Do you want to enable single user mode?シングルユーザーモードか?いったんはそのまま(N)。
Are you using Docker to run Mastodon?ドッカーを使っているか?明示的にN。
PostgreSQL host:そのままエンター。
PostgreSQL port:そのままエンター。
Name of PostgreSQL database:そのままエンター。(VPSのスタートアップスクリプトだとmasodonで作られている模様)
Name of PostgreSQL user:そのままエンター。
Password of PostgreSQL user:そのままエンター。
Redis host:そのままエンター。
Redis port:そのままエンター。
Redis password:ここ嵌まりどころ。/etc/redis.confのrequirepassを指定してredisをrestartしてから入力。
Redisのインストール・セットアップ - Qiita
rootでredisを起動して一度アクセスしておくと大丈夫みたい。パスワード指定なしでいけた。
Redisの認証について | shimar's blog
Do you want to store uploaded files on the cloud?そのままエンター。
Do you want to send e-mails from localhost?そのままエンター。
SMTP server:そのままエンター。
SMTP port:そのままエンター。
SMTP username:適当にroot。
SMTP password:適当に。
SMTP authentication:そのままエンター(VPSだと聞かれなかった)。
SMTP OpenSSL verify mode:そのままエンター(VPSだと聞かれなかった)。
E-mail address to send e-mails "from":そのままエンター。
Send a test e-mail with this configuration right now?明示的にN。
Save configuration?そのままエンター。
Prepare the database now?そのままエンター。
なんかエラー出た後に(VPSでエラー出なかった。redis関連か?)
Compile the assets now?そのままエンター。
時間かかる。
Do you want to create an admin user straight away?そのままエンター。
Username:そのままエンター
E-mail:適当に
でいいか。
あ、何かエラー出てる。
rake aborted!
Redis::CommandError: NOAUTH Authentication required.
ただjournalctlでは特にエラーないな。
ちょっと調べてみたけどブッチして置いても大丈夫かな?
Redisの認証について | shimar's blog
rootに戻ってnginxのセットアップ。公式は
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
こんな感じだがCentOSでは
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/conf.d
かな。
server_nameはlocalhost(VPSの場合は当然ドメイン)。2箇所ある。
オレオレ証明書も必要な模様。
nginx で オレオレ証明書をする - Qiita
(VPSの場合はserver_nameの修正が終わったら保存してcertbot --nginx -d ドメイン名で自動でせっとされる)
(それから後ろにも書いてあるけどuserをmastodonにする必要があるかも)
nginx.confの修正が終わったら
systemctl start nginx
systemctl enable nginx
ここでエラーになる場合はサーバーを再起動してみる。何故かnginxの別プロセスがポートを使用している。
続いてmastodonのセットアップ。元ネタは
/home/mastodon/live/dist/mastodon-*.serviceか?
あ、nginx.confもあるし。
/etc/systemd/systemに入れればよさそうなので公式のコマンドをそのまま使用。
cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
systemctl daemon-reload
systemctl start mastodon-web mastodon-sidekiq mastodon-streaming
systemctl enable mastodon-*
最後のはエラーになったので一つずつ設定。
systemctl enable mastodon-web.service
systemctl enable mastodon-sidekiq.service
systemctl enable mastodon-streaming.service
これで全て完了のはず。さて、画面が見れるのか?
こんな画面。 pic.twitter.com/DryWyakoA5
— OZAWA / Mobile (@bmwandmore) June 13, 2020
うーむ…
とりあえずユーザーを作って見る。メールが使えないのでツールで直接作成する。メールサーバーの設定か何か変わったのかわからんが直接作成がエラーになる場合、Webから登録してツールで承認する。
勝手 Mastodon tootctl リファレンス - Qiita
もしエラーの場合はredisを再起動してみる。
mastdonユーザーになってliveディレクトリに移動して
RAILS_ENV=production bundle exec bin/tootctl accounts create ユーザー名 --email root@localhost --confirmed
パスワードが表示されるので確保。
メールとパスワードを入力してログイン。
残念!真っ白な画面です!
nginxのエラーログに
/home/mastodon/live/public/" failed (13: Permission denied)
と出てる。
drwxrwxr-x 9 mastodon mastodon
なんだが。
— OZAWA / Mobile (@bmwandmore) June 13, 2020
出来た!
/etc/nginx/nginx.confのuserをmastodonに変更!
さらに/var/lib/nginxの所有者をmastodonに変更(これ意味わかんない。mastodonというよりnginxが)。
Mastodon構築手順・非Docker版・Fedora - Qiita
でほぼnginxの問題とあたりをつけ、そういえばuserの設定があったよなと思い
Nginx設定のまとめ - Qiita
で確認。
うーん、添付画像の表示が出来ないな。ffmepgとかImageMagickとかの問題か?←これはマストドンのセットアップでドメインにlocalhostを入れていたのが原因。サーバーのIPアドレスを入れて解決。
仮に動かせたしてメンテしきれるかな。とはいうもののVPSもどこまでサポートしてくれるか不明なんだよなぁ。基本ノーサポートっぽいし。
Postfixもインストールしておく(VPS)
お一人様インスタンスなのでアカウント設定はtootctlで行えばメールは不要だがこの際なのでPostfixも入れてみる。
CentOSとPostfixを使って送信専用のメールサーバーを構築する方法 - レムシステム エンジニアブログを参考にしてみた。とりあえず入れただけで特にテストはしていない。Logwatchも入れておくか。
v3.3.0にアップデートした
Rubyのバージョンアップもしたのでメモ。
su - mastodon
/home/mastodon/.rbenv で
git pull
/home/mastodon/.rbenv/plugins/ruby-build で
git pull
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.2
/home/mastodon で
rbenv global 2.7.2
su - postgres
pg_dumpall -c > backups/20201227.dump
rootに戻ってsu - mastodon
/home/mastodon/live で
git fetch && git checkout v3.3.0
bundle install
yarn install
SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate
RAILS_ENV=production bundle exec rails assets:precompile
ルートに戻って
systemctl start mastodon-web mastodon-sidekiq mastodon-streaming
su - mastodon
/home/mastodon/live で
RAILS_ENV=production bin/tootctl cache clear
RAILS_ENV=production bundle exec rails db:migrate
お一人様インスタンス向けのチューニング(VPS)
VPSはしばらく使用していると重くなって来た。Rubyはメモリの断片化を起こすということらしくメモリ使用量の増加→スワップの発生ということでio waitの値が大きい。ということでチューニングを検討する。
チューニングのポイントとしては
- マストドンの設定
- postgresの設定
という事になる。
1に関しては、Rubyのメモリ使用を抑えるのが目的。方法としてはjemallocの使用とMALLOC_ARENA_MAX=2を指定するというのがあるがMALLOC_ARENA_MAXに関してはデフォルトで適用済み。だがMALLOC_ARENA_MAXに関してはあまり効果がないという情報もあったのでMALLOC_ARENA_MAXはコメントアウトした。後はお一人様インスタンスなのであまりプロセスを動かないようにする。
/etc/systemd/system/mastodon-web.serviceは
Environment="WEB_CONCURRENCY=1"
Environment="MAX_THREADS=5"
Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2"
を指定。これは公式でもお一人様インスタンスはこれで大丈夫と言っているらしい。
小規模インスタンス向け チューニングガイド - Qiita
それから、
/etc/systemd/system/mastodon-sidekiq.serviceに
Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2"
と追加し
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 25
を5に。あわせてDB_POOLも5。こちらは
Mastodonアプリケーションイメージの使い方|ConoHa VPSサポートより。
更にPgBouncerというものを使用するとpostgresのプロセスを抑制出来るらしいがちょっと面倒そうなのでパス。
2に関してはPGTuneというツールでサーバーのスペックに合わせて設定値を出してくれるのでそれを参考に。ウチのVPSのスペックで出た値は以下の通り。
max_connections = 200
shared_buffers = 256MB
effective_cache_size = 768MB
maintenance_work_mem = 64MB
checkpoint_completion_target = 0.7
wal_buffers = 7864kB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 1310kB
min_wal_size = 1GB
max_wal_size = 4GB
max_worker_processes = 2
max_parallel_workers_per_gather = 1
max_parallel_workers = 2
これらに関して
PostgreSQLの設定内容 ~PGTuneを使ってみて~ - Qiitaとか
チューニング ~データベースチューニング~|PostgreSQLインサイド : 富士通を参考に考えてみた。
max_connections:バックエンドプロセスの数に影響する。11にする。もっと減らしたいが10以下はエラーになる。
↑11にしたら「ホームタイムラインの更新が30秒遅れ」、「連合タイムラインが更新されない」といった問題が発生したので100に戻した。
shared_buffers:小さすぎも大きすぎもよくない。デフォルト値(128MB)が小さすぎのようなので256MBに変更。
effective_cache_size:影響は少なさそうだがデフォルト値(4GB)が大きすぎのようなので768MBに変更。
maintenance_work_mem:デフォルト値と同じなので変更なし。
checkpoint_completion_target:チェックポイントをとるタイミング。checkpoint_timeoutと組み合わせて使われる。この値よりcheckpoint_timeoutを変更した方がよさそう。checkpoint_timeoutを30minに。
wal_buffers:小さいとディスクアクセスが増える。デフォルト値(4MB)が小さすぎのようなので7864kBに変更。
default_statistics_target:デフォルト値と同じなので変更なし。
random_page_cost:影響は少なさそうだがデフォルト値(4)が大きすぎのようなので1.1に変更。
effective_io_concurrency:デフォルト値不明(コメントアウト、1かな?)。とりあえずPGTuneに合わせる。
work_mem:大きいとメモリ逼迫の原因。デフォルト値(4MB)が大きすぎのようなので1310kBに変更。
min_wal_size:影響は少なさそうだがデフォルト値(80MB)が小さすぎのようなので1GBに変更。
max_wal_size:小さいとチェックポイント処理が増える。デフォルト値(1GB)が小さすぎのようなので4GBに変更。
max_worker_processes:以下、メモリよりプロセス数に関するものだがデフォルト値(コメントアウト)と異なりそうなのでPGTuneに合わせて2に変更。
max_parallel_workers_per_gather:同上で1に変更。
max_parallel_workers:同上で2に変更。
v3.5.0にアップデートした
Rubyを3.0.3にバージョンアップする必要あり。方法は前述のv3.3.0にバージョンアップしたのと同様。
Node.jsをdnfでインストールしているためバージョンアップが必要。方法はとりあえず以下の二つ。
nodejs、npm の最新版をインストールする(CentOS) at softelメモ
CentOS 8 : Node.js 14 インストール : Server World
前者はnodeのインストール先が/usr/local/bin/になるのでmastodon-streaming.serviceの設定にあるExecStart=/usr/bin/node ./streamingを修正する必要ある。最初は前者で対応したがインストールは極力dnfにしておきたかったので後で後者に変更した。
Node.jsのバージョン管理方法を変更
Node.js、やはりdnfではバージョン管理に限界があるので別の方法にすることに。CentOSだとだいたいnvmかnになるみたいだけどnvmは個別ユーザーに適用する開発環境用、nはサーバー全体に適用される稼働環境用みたいな感じ。dnfと同じように考えるのであればnかなと思い今回はnにしておいた。もっともRubyがスクリプト言語でMastodonユーザー配下に構築されているし他のパッケージを入れないことを考えるとnvmでもいいような気はするけど。
(2022/11/19追記)v4.0.2にアップデートした
自己責任でw
マストドン停止
# systemctl stop mastodon-*
ポスグレバックアップ
# su - postgres
$ pg_dumpall -c > backups/20221119.dump
Redisバックアップ
# cp -a /var/lib/redis/dump.rdb /tmp/dump.rdb_bak
メディアバックアップ(サイズが大きく諦め)
# cp -a /home/mastodon/live/public/system /tmp/20221119/
環境ファイルバックアップ
# cp -a /home/mastodon/live/.env.production /tmp/20221119/
Rubyバージョンアップ
# su - mastodon
$ cd .rbenv
$ git pull
$ cd plugins/ruby-build
$ git pull
$ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4
$ cd /home/mastodon
$ rbenv global 3.0.4
nodeバージョンアップ
# n 16.13.0
ヒープサイズ確認&拡張
# su - mastodon
$ node -e 'console.log(Math.floor(v8.getHeapStatistics().heap_size_limit/1024/1024))'
$ export NODE_OPTIONS="--max-old-space-size=2048"
$ node -e 'console.log(Math.floor(v8.getHeapStatistics().heap_size_limit/1024/1024))'
マストドンアップグレード
$ cd live
$ git fetch && git checkout v4.0.0
$ bundle install
$ yarn install
$ SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate
$ RAILS_ENV=production bundle exec rails assets:precompile
マストドンスタート
# systemctl start mastodon-web mastodon-streaming mastodon-sidekiq
# su - mastodon
$ cd live
$ RAILS_ENV=production bundle exec rails db:migrate
マストドンリスタート
ここまでで4.0.0にあがる。4.0.2へは公式ドキュメント見ればわかる。3.5.3からこの手順で直接4.0.2でも大丈夫だったのかも。