Mastodonの新規構築 EPISODEⅡ メモリ不足の凱旋

先日、デレステのイベ曲のバカさにTwitterのTLが騒然としましたが、本日ついに今回のイベも後半戦モードに入ったので溜め込んだエンブレムを一気に消費してきました。

 

エンブレム4倍でぶん回すのじゃああ

 

だいたい二時間ぐらい前に6500程度あったんでしたかね。それをまあ10回程度4倍でぶん回して、一夜にして一気に7000点弱から20000点超えを達成。カタルシスがすごいです。これだから(後半戦モード実装後の)アタポンイベはやめられねえぜ!

 

f:id:haramAB:20170524225451p:image

ユッコ。

 

もうすでにユッコは一枚持っているので、MV的には何のプラスにもなりませんが、まあ雫さんも来たのでいいかな。最近はMVに凝って主要キャラのNを溜め込んでいるので所有枠が明らかに足りません。デフォで80とか埋まってる。

 

 

閑話休題。デレステイベも無事、僕の中では終了しましたのでMastodonの設定に移りましょう。めざせインフラエンジニア!

 

自宅。家はTelstra Velocityの利権による犠牲となった地域なので安定したインターネット接続はありませんが(!)、テザリングしなけなしの通信量を割いてサーバ管理します。

学校と違い上流ファイヤウォールによるブロックがないので端末からSSHできます。SSHできるとコピペができます。コピペができるとできないとでは実は雲泥の差です。ちゃんとUnix系が使える人ならばパイプとかwgetとかsedとかawkとかgrepとかを組み合わせ気持ち悪く長いシェルスクリプトを書いて魔法のように全てを解決するのでしょうが、僕はパイプは覚えたて、lessかgrepに渡すのが精一杯です。GUIの恩恵に預かってコピペさせてもらいます。

 

* .env.productionに鍵を入力

.env.productionには鍵が三つ必要ですが、前に何回も失敗しながら何回も使いまわしている鍵を今回も使います。(多分本当はダメ) テキストファイルからSSHによりテキストファイルへコピペする。

 

まずはlxc exec mastodon /bin/bashしてコンテナに入ります。

前回の記事で書いてなかった気がするけど、mastodonはrootの~/mastodonフォルダにクローンされてます。だからcd mastodonしてからvi .env.production。鍵をコピペ。

 

docker-compose.ymlの永続化設定もついでに確認しておきます。ここ失敗してる人いっぱいいるみたいだから怖い。

設定されてない。どうしてだ数時間前の僕。

 

でまあdocker-compose build。これが怖い。こいつすぐメモリ不足になるから。

でも今回はdockerがさらにまたコンテナの中で動いてるんで、壊れたり謎の謎のpostgresプロセスが大量に動いてメモリを圧迫してても、クリーンインストールしなくてもLXDをやり直せばいいだけ。これはいいかもしんない。

 

毎回毎回「fsevents1.0.14がインストールできないけど大丈夫!これどうせ要らねえから!」って言うのビビるからやめろ。本当に大丈夫なのかよ。てか時間を返せ。

 

 で成功する。でもまだbuildだけ、まだまだ油断はできません。

ここでもう一回元記事を確認しておきましょうかね。。。

 

言語設定を忘れた以外大丈夫そうなんで、DBを構築。成功。続いてフロントエンドのアセットを生成。成功。

インストールが終わったのでコンテナを起動します。docker-compose up -d。

curl -o /dev/null http://localhost:3000/してみる。エラーなく100%まで行くので、とりあえずインストールは成功です。

 

* ホストでnginxを設定

ホストでnginxにTCP80やら443やら3000やらを聴かせておいて、リクエスト来たらLXDコンテナ(の中のdockerコンテナ)を叩かせます(nginxをプロキシにする)。

 

今回の元記事によればsudo apt install nginx letsencryptをホストで実行だそうで。その通りにします。

ふたつパッケージあったのに一回プロンプトされただけで終了。不安だ。

 

次にsudo letsencrypt certonly --standalone --standalone-supported-challenges tls-sni-01 -d example.comします。Webを介したチャレンジアンドレスポンスによってSSL証明書を作ってるんでしょう。UFWが弾くと思いますがまずはやってみましょ。

案の定connect errorされたのでsudo ufw status。Webがやっぱり開いてないので80と443を開けておきましょう。

$ sudo ufw allow 443

$ sudo ufw allow 80

$ sudo ufw reload

$ suso ufw status

念のためwgetからもアクセスをチェック。wget http://example.com/は成功するがwget https://example.com:443/はダメ。つまりポートは開いている。

ダメ元で証明書をもう一回試すと成功する。やったぜ。

 

nginxにmastodon用の設定を流しましょう。/etc/nginx/conf.d/mastodon.confを新規作成します。sudoがいるよ。

そしてそこにhttps://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md:マストドン公式のドキュメントにある設定をコピペ。

:%s/example.com/your.domain/しておく。

あとlocalhostとか127.0.0.1をLXDのアドレスに変えておく。

$ lxc listして出てくるeth0のやつね。

 

ここで元記事が「では、よいマストドンライフを!」とか言ってぶん投げます。おいもうちょっとお願いできませんか。

仕方がないのでここからは他の文献も参考にしつつ自前で行きましょう。まずはnginxのリロードです。sudo nginx -s reload。ここでnginxからdhparam.pemがないと怒られます。

 

ググる。

robmclarty.com

ここによると、$ openssl dhparam -out /etc/letsencrypt/certs/dhparam.pem 4096すればいいらしいです。やってみる。めちゃくちゃ時間かかる。

 

 dhparam.pem - no such file or directoryって言われる。は?

 

sudo つけて4096を2048に減らし再挑戦する。がダメ。

普通にディレクトリがなかった。sudo mkdir certsする。それからもっかい例のコマンド。成功。

改めてnginxをreload。こいつ、/etc/sslを読んでる。mastodon.confの中のdhparamのパスを変えてからやると成功した。

早速端末側のブラウザから確認する。動いた!

 

* Mastodonのサービス管理初期設定

ブラウザからユーザを作る。メールが来ることを期待して。。。たぶんこないけど

 

コンテナ内でユーザを追加しようとするとメモリが足りないとnodeに憤怒されたので、プランをアップグレードすることにします。月$10ぐらい払ってやらあ

アップグレードのためスナップショットを取って、それが60分かかるとか言われたところで今日はおしまいです。

 

と、思ったらスワップ領域を作ればいい話のようなのでそうする。

http://qlita.com/scleen_x_x/items/f3fc492bcbf0f6c2896cqlita.com

ここを参考に。

sudo cat /proc/swapsによるとswapは今の状態だとなし。

sudo mkdir /var/swap

sudo dd if=/dev/zero of=/var/swap/swap0 bs=2M count=2048

sudo chmod 600 /var/swap/swap0

sudo mkswap /var/swap/swap0

sudo vi /etc/fstab

/var/swap/swap0 swap swap defaults 0 0を最終行に追加。sudo cat /proc/swapsを見ると追加されてます。これで4GBものスワップ領域を作ったことになります。多すぎない?RAM1024MBだよ?

もう一回ユーザ追加してみましょう。できた!アップグレードなんて要らんかったんや!

 

管理者権限もつけておく。

 

otya.me

 

あとこれの最後の方のcrontabのやつをLXDコンテナで実行しておく。

 テキストエディタを選べって聞いてくるから3のVimBasicにする。他のは使い方がよくわからん。

 

 42 */12 * * * cd /root/mastodon/mastodon-1.1.2/ && docker-compose run --rm web rake mastodon:media:remove_remote

無事crontabには読み込まれたが、実際に実行してみるとエラーになる。mastodon:remove_remoteの部分がダメらしい。

そこを--tasksに置き換えてみる。mastodon:media:clearが一番それっぽいな。まあいいや放置で。

 

諦めて管理者権限でブラウザからログインする。何も表示されない。このパターンはまずいぞ。

とりあえずdbとassetsを再準備する。swapがあるから怖いものなしである。

 

 

まあ色々やったんですけど、全然ダメなんでLXDコンテナの作り直しからやってみましょう。

ログ書いててよかった。

lxc stop mastodon

lxc delete mastodon

lxc list

これで前回の最初の方からやり直しになりました。いえーい