2017年4月30日日曜日

どろんこクラブの作り方(GCEとCloud SQLとCloud StorageでMastodon)

Mastodonインスタンス立ち上げの備忘録として今までこのブログで書いたことが無いIT系のことを書いてみようと思います。



Mastodonとは

Mastodonとは自分でサーバーを作れるTwitterのようなものです。

Mastodonのキャラクター
Twitterの鳥とクジラの両方の役割

サーバーごとにユーザーが管理され、そのサーバーのことをインスタンスと呼びます。
基本的にはインスタンスごとに別々の世界となりますが、別インスタンスのユーザーをフォローしたりフォローされたりできます。
なので分散型とか連合型のミニブログなんて呼ばれたりしています。

ちなみにこっちのMastodonではありません



インフラ環境について

僕も自分でMastodonインスタンス「どろんこクラブ」を立ち上げてみたわけですが、インフラ環境にはここしばらく個人的にいろいろ遊んで面白いと実感していた Google Cloud Platform (GCP)Compute Engine (GCE) と Cloud SQL 、そして Cloud Storage を選びました。

Amazon Web Services (AWS)さくらのクラウド あるいは自前サーバーという選択肢もありますが、GCPはいま12ヶ月+300USドルの無料クレジット付きキャンペーンをやっていてとてもお得です。



向学のためにいっそのことロードバランサーを入れてオートスケール(負荷が上昇すると自動的に追加でサーバーが起動して複数サーバーでアクセスを処理させる仕組み)させてデータベースとRedisもレプリケーションして可用性を高めようなどと考えてみました。
アップロードされたファイルもスケーラブルなインフラに保存です。

可用性が高くアクセス集中につおい環境

でも絶対過疎るしスケールアウトなんてしないはず。
とはいえフルセットを1サーバで動かすのは好みじゃないので、DBだけ分けた最小限の構成にすることにしました。

DBを分けたちょろい構成

これで必然的に Docker は使わない構成となります。
MastodonはDockerコンテナとして提供されています。
Dockerは開発環境構築がものすごく楽で、Docker Compose による環境はチーム開発にも最適です。
ですが基本的に1サーバの中でフルセットを動かす仕組みなので今回の構成では不要となります。



準備について

Mastodonインスタンスを構築するにあたって事前に必要な準備を列挙します。

  1. 独自ドメイン
  2. SSL証明書
  3. メール配信サービス


独自ドメイン

これがないと何も始まりません。
後述のSSL証明書、メール配信サービスのいずれも独自ドメインが登録されていないと設定が進みません。
僕はいつも VALUE-DOMAIN でドメインを登録しています。
doronko.club はキャンペーン中で100円/年くらいでした。

SSL証明書

http ではなく https でアクセスさせるために必要なものです。
でも高いんだよなあやだなあと思っていたら、最近は無料で証明書を発行してくれるサービスがあるんですね!
もちろんオレオレ証明書(自分のサーバで勝手に作る自己証明書)ではなくちゃんとしたものです。

メール配信サービス

自分のサーバーからメールを配信することもできますが、配信数が多くなるとIPウォーミングをしないとスパム配信元として扱われてブラックリストに載せられてしまいます。
大量配信用途のSMTPサーバに特化したサービスが色々とあるのでそれを利用します。
MastodonではMailgunが推奨されているようです。



サーバー構築について

以下の順に作業を進めます。
  1. GCEインスタンスの用意
  2. Mailgunの登録
  3. DNSの設定
  4. Mailgunの設定
  5. Cloud SQLの設定
  6. Cloud Storageの設定
  7. Mastodonサーバの設定

GCEインスタンスの用意

MastodonサーバーとなるGCEインスタンスを起動します。
GCPコンソールからCompute Engineを開いてVMインスタンスを作成します。


マシンタイプは最小のmicroです。
僕はCentOSが一番使い慣れているのでCentOS 7のイメージを選択しています。
(DebianとかUbuntuはよくわかりましぇん)
更にここでローカルストレージにSSDを選択しています。
メモリが0.6GBしか無いのをスワップファイルを作って回避するのですが、SSDだとI/Oが速いのでメモリの少なさを感じさせません。

またネットワーキングの設定から固定の外部IPアドレスを設定します。


エフェメラルは動的IPアドレスのことなので再起動するとIPアドレスが変わってしまう可能性があります。
「新しい静的IPアドレス」を選択しておきます。

Mailgunの登録

メール配信Mailgunに先にアカウントを登録しておきます。
その後ドメインを登録すると本当にドメインの保有者かどうかの確認手続きに入ります。
この確認手続きにDNSの設定が必要となります。
ちなみにここでメール配信用に設定したドメインは mail.doronko.club です。

DNSの設定

VALUE-DOMAIN の管理画面からDNSの設定をします。

a @ GCEのIPアドレス
txt mail v=spf1 include:mailgun.org ~all
txt pic._domainkey.mail k=rsa; p=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mx mxa.mailgun.org. 10 mail
mx mxb.mailgun.org. 10 mail
cname email.mail mailgun.org.

1行目は https://doronko.club/ でGCEインスタンスにアクセスできるようにするための設定です。
2行目以降は Mailgun を利用できるようにするための設定です。
この設定内容は Mailgun の管理画面に表示されているのでそれを利用する感じです。

こんな感じで書いてあります

僕はMXレコードとCNAMEレコードの記述でミスってしまってなかなか承認されずに困りました。

Mailgunの設定

DNSの設定をしてそれがインターネットに浸透するまで少々時間がかかります。
早ければ10分、遅ければ数10分。
その後Mailgun管理画面からドメインの承認手続きをします。Verificationボタンを押すだけです。
DNSの設定が正しければこれでメール配信の準備が整います。

Cloud SQLの設定

今回GCPを選択した理由の一つはCloud SQLにPostgreSQL版ができたことが大きいです。


バックアップ、セキュリティパッチの適用、ストレージの自動増量などを勝手にやってくれるCloud SQLのサービスは魅力的です。

Cloud SQLもマシンタイプはmicroで
ストレージはもちろんSSDで自動増量を有効化

PostgreSQLは定期的なバキューム処理が必要なので autovacuum を On に。
またMastodonサーバからの接続を許可するために承認済みネットワークにMastodonサーバの外部IPアドレスを設定します。

Cloud Storageの設定

Cloud Storageでユーザーがアップロードしたファイルを管理するようにします。
スケーラブルなインフラなのでサーバがクラッシュしてファイルが無くなっちゃうような事故を防げます。

Storage のメニューから「バケットの作成」を選択して Multi Regional のストレージクラスを選択して作成します。


バケットができたらStorageの設定画面の「相互運用性」からアクセスキーを生成します。
アクセスキーはMastodonサーバの設定ファイルに記載する必要があります。


Mastodonサーバの設定

やっとMastodonサーバの構築です。
基本的にMastodonの公式ドキュメントに従って進めましたが、CentOS 7へのインストールの先達の資料も参考にさせて頂きました。

基本的に上記参考サイトの手順に従って進めましたが、ところどころ異なるので異なる部分だけ抜粋して記載します。



なによりまずはスワップ領域の作成です。
これをしないとMastodonサーバ構築の操作でメモリ不足のエラーが発生します。
dd if=/dev/zero of=/swapfile count=4194304 bs=1K && mkswap /swapfile && swapon /swapfile


PostgreSQLは既に準備済みなのでserverモジュールはインストールしません。
# yum install postgresql96-{contrib,devel}


GCEインスタンスとPostgreSQLのタイムゾーンがUTCなのでJSTに変更しておきます。

GCE側
# timedatectl set-timezone Asia/Tokyo
PostgreSQL側(GCEインスタンスから接続して操作)
# psql -h CloudSQLのIPアドレス -U mastodon -d mastodon
Password for user mastodon:
psql (9.6.2, server 9.6.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.
mastodon=> alter database mastodon set timezone = 'Asia/Tokyo';
ALTER DATABASE
mastodon=> \q


この後Ruby絡みの手順で pg_config が無いと怒られてエラーになります。
パスが通っていないだけなのでパスを通します。
# PATH=$PATH:$HOME/bin:/usr/pgsql-9.6/bin; export PATH


続いてSSL証明書を設定します。
こちらを参考にSSL証明書を作成します。
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
# ./certbot-auto
# ./certbot-auto certonly --standalone -d doronko.club --rsa-key-size 4096

続いてこちらを参考にPFSの準備をします。
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl dhparam 4096 -out dhparam.pem

これで /etc/letsencrypt/live/doronko.club 以下に fullchain.pem と privkey.pem と chain.pem ができ(実際にはシンボリックリンクで元ファイルは別の場所にある)、/etc/nginx/ssl 以下に dhparam.pem ができます。
これらを Nginx の設定ファイルに記載します。
ssl_certificate     /etc/letsencrypt/live/doronko.club/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/doronko.club/privkey.pem;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_trusted_certificate /etc/letsencrypt/live/doronko.club/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;


そしてMastodonの設定ファイル .env.production を編集します。
# Service dependencies
REDIS_HOST=localhost(←これ元ファイルは Redis ってなってるから修正必須!)
REDIS_PORT=6379
# REDIS_DB=0
DB_HOST=(CloudSQLのIPアドレス)
DB_USER=(ユーザー名)
DB_NAME=mastodon
DB_PASS=(パスワード)
DB_PORT=5432
# Federation
LOCAL_DOMAIN=doronko.club
LOCAL_HTTPS=true
# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=(rake secret 1回目の結果)
SECRET_KEY_BASE=(rake secret 2回目の結果)
OTP_SECRET=(rake secret 3回目の結果)
# Mailgun
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=2525
SMTP_LOGIN=(MailgunのSMTPログインID)
SMTP_PASSWORD=(MailgunのSMTPパスワード)
SMTP_FROM_ADDRESS=notification@mail.doronko.club
# S3 (optional)
S3_ENABLED=true
S3_BUCKET=(Cloud Storageのバケット名)
AWS_ACCESS_KEY_ID=(先の手順で発行したアクセスキーID)
AWS_SECRET_ACCESS_KEY=(先の手順で発行したシークレットアクセスキー)
S3_PROTOCOL=https
S3_HOSTNAME=storage.googleapis.com
S3_ENDPOINT=https://storage.googleapis.com/


さあこれで起動だぜと思ってアクセスしたら403 Forbiddenに。
MastodonインストールディレクトリのSELinuxコンテキストを修正します。
# setenforce Permissive
# chcon -Rt httpd_sys_content_t /home/mastodon/live/public



これで完成です。
ちなみにデイリージョブを実行するとエラーが発生したので調べたら同じことを解決している人がいたので真似しました。





運用開始後に数人が同時アクセスすると GCE の micro インスタンスだとあっという間にCPUがブン回ってしまうことが判明したので、今は small インスタンスにマシンタイプを上げてあります。




いろいろな記事に助けられたのでこの記事が誰かの参考になりますように。




2017年4月29日土曜日

じょしどきとWEX勝沼とどろんこクラブ

来る5月6日(土)にモトスポーツランドしどきで貸切走行会をやることになりました。その名も「じょしどき」
kwskくんからの提案で「妹やその友達のような女子でも着の身着のままでオフロードライディングを楽しめちゃう会」がコンセプトです。



フルレンタルでベスコンしどきを味わいましょう



今の時点で40人くらい集まっていて、半分くらい女子です。
誰でも参加できます。引き続きエントリー受け付けてますんで興味ある方はゼヒ。






ところで去る3月26日に雪が降る WEX EAST Rd.1 クロスパーク勝沼に参戦したんですが、現場の様子を伝えるこれ以上ない動画が出ていたので動画編集もしていなければブログも書いていません。
いつかのWEXデコボコランドみたいでした。



午前中に雪がこねられて最悪の激重マディに

カチカチツルツルベトベトマディ



居酒屋で一人飲みしてたら泥酔して120Aクラスへのエントリーを煽ってしまったことを深く後悔するとともに、巻き込んでしまった姫丸さん滝澤さんにお詫び申し上げます。






申し訳ございませんでしたあああ!!!






でもってまた別の話。



4月に入ってからTwitterクローンの登場と騒がれていたMastodon
自前でサーバーを構築するのも簡単そうだったんですが、月前半の混乱を見て静観することにしていました。
最近やっと落ち着いて、絵が好きな人向けの pawoo.net やニコ動ユーザー向けの friends.nico など、同じ趣味のコミュニティ毎にインスタンス(サーバー)が立ち上がるようになってきました。

てなわけで僭越ながらオフロードバイク乗りというとても限られた世界の人々向けにMastodonインスタンスを立ち上げてみました。












9割がた僕の好奇心(Google Cloud Platform の利用と Mastodon サーバーの構築)で作ったので運営とか全然考えていません。
Twitterでいいじゃんというのももちろんその通りなんですが、ここに来ればオフ車で楽しんでる人がいるってわかるだけでもいいかなと思ってます。



こんな感じで考えてます



過疎ってる今くらいが気楽でいいけど、個人のお小遣いでできる範囲を超えるくらい人が集まっても楽しそうだなとはちょっと思ってます。
(オートスケールとか試してみたいし)




興味ある人はほとんどいないと思うけど、備忘録的に今回の鯖立て手順を別エントリーで書くつもりです。









2017年3月8日水曜日

CGCひな祭りエンデューロに参戦しました

Beta RR2T 250 を買ってからというもの、各方面からハードエンデューロへの誘導が著しく途方に暮れる日々を送っています。



「Betaを買ったってことはそういうことでしょ」
tacさんとこ(Strange Motorcycle)から買ったんだから」
白井に行きましょう」
「大丈夫大丈夫イケるイケる」



ハード系をやる人はもちろん、やらない人にまで言われます。



でもね。
やられたらやりかえす。倍返しだ!やってから盛大にdisってやるからな!
ということで非常に残念ながらエントリーしてしまいました。






今まで絶対近寄らないようにしようと思ってたけど、アタックエンデューロは出ちゃったしな。
年イチなら出てやらないこともないぞと一瞬でも思ってしまった自分が悲しい。
なんて無駄な反骨精神を発揮してしまったんだ……。後悔しか無い……。



僕はバイクでスピードを出して長く追いかけっこしたいのです。
できるならばバイクに乗る以外の全てのことを誰かにお願いしてしまいたい派なのです。
今の腕の範疇でバイクを壊さず全開で走りたいのです。
(つまりしどき最高)






僕はクロスカントリーがしたいのです!






そしたらCGCの中の人ことカエルさんは言いました。



「CGCはクロスカントリーです。」



ダメだ。もう逃げられない。



一昨年tacさんに連れて行ってもらったSUGOのB面は面白かったし、あんな風に合法的にお山でセクション遊びをするのは嫌いじゃないです。
でもハードエンデューロに「参戦」するのとは決定的に違うのです。



参戦するからには走破しなければならないじゃないですか。
走破するにはやったことないことをやらなきゃならないじゃないですか。
やったことないことやるとコケるじゃないですか。
コケるとバイク壊れるじゃないですか。



そう。バイクが壊れる。



はぁぁぁ。バイク壊したくないよぉぉぉ。
(白井も石ばっかでバイク壊れるから行きたくない)






3月4日午前3時。GUCCIさんが自宅にやってきてバイクを積み込んで出発。
片道4時間の旅の始まりです。



会場のスラムパーク瀬戸に着いてしまいました



7時半に会場入りしましたが、既に駐車場は一杯。
会場入りして早々に会ったシーザーさんマキちゃんに言いました。



「もうこんなに集まってんのかよ!バカばっか!!!」



僕の参戦するさわやかクラスは土曜の午後から。
いつもは日曜がレース日なので新鮮です。

今回は僕、デニーロことU★S★Aゆうのりくんの3人がさわやかクラスにエントリー。
翌日のレースには楽さんがおひなさまクラス、GUCCIさんひろしくん友也さんがおだいりさまクラスにエントリーです。

観戦には鯱さんせんせいげんさん美人フォトグラファーJKさんがやってきました。



CGCなのでガムテでスペシャルデカールを作成しました

土質は裏しどきのような重めの山砂?

ラブラブクロスが異様に楽しそうでした



ラブラブクロスという裏山爆発案件が終了すると、とうとう僕のさわやかクラスのレースが始まってしまいます。
四の五の言わずに動画をどうぞ。







こてんぱんにやられました……。
最初の沼に30分はいました。沼に留まったりバイクを押し引きするためにお金払ったのかと思ったら怒りが込み上げてきて過去最高にエモってしまいました。



このキャンバーで2回落ちました
©GUCCIさん

2度目の滑落で腹が立ってエモりのピークに到達
©美人フォトグラファー

その間にゆうのりくんがキャンバーに到達
©楽さん

FMXヒル上部のフカフカ斜面は渋滞で自分の腕では押しが基本
©美人フォトグラファー

2周目以降の沼の先のキャンバーは赤堀さんに教わった直登して上に行くラインを使ったら楽勝でした
ちんゆうさん写真ありがとうございました
©ちんゆうさん



結果は4周。
心も体もバッキバキにやられてしまいました。
3〜4周目でなごやんさんと追いかけっこできたのが唯一レース中に楽しかったことでしょうか…。
CGCぜったいゆるさない。



もうやだ……



疲れた体を癒やすべくお風呂へ。
レース後に会場でご飯を作るのは辛いと思い、今回はお店を予約してご飯を食べました。



お風呂の後にみんなで宴会
©楽さん

なごやんさんまえはしくんも合流
©楽さん

楽さん「セルのないバイクで助けられようと思ってんじゃねえよ!セルはエチケットだよ!」
アキさん「へたくそ!」
©げんさん

がんばったご褒美はうな丼(特)



新しいパワーワードが生まれてしまいました。



「セルはエチケット」



声に出して読みたい日本語ですね。今後も強く唱えていきたいです。



パドックに戻ってからはぴらふさんやカエルさんも交えて寒中予選

翌日レースのない予選って楽しい!



たくさん飲んでも全然平気!今回も予選は完走です。
もうあの山の中にバイクで行かなくていいと思うとなんて清々しいんだろう!
日曜はU★S★Aと一緒に全力でおひなさまクラスのスタックスイーパーをしました。



おひなさまクラスのスタートです
U★S★Aの恩返し!
©CGC公式

昨日お世話になった楽さんを全力でスイープ!
©CGC公式

轍ヒルを登ってくるおひなさまを全力サポート
©CGC公式

俺達の分まで走れ
©CGC公式

人助けをして飲むビール is さいこう
©鯱さん

場所を移動して地すべりヒルでスイーパー
©鯱さん

近藤香織さんも全力スイープ
©CGC公式

地すべりヒルでぶっ飛んだ楽さん「U★S★Aは谷側に立つんじゃないよ!見ちゃうだろ!」
©鯱さん

おひなさまクラス終了
みんな笑顔
©CGC公式



なんだか今日はとても楽しいです。
そして今日のメインイベント、おだいりさまクラスのスタートです。



トナカイぴらふさん出陣

第3ヒートから友也さんとひろしくんも出陣

全員スタート位置に整列

物好きが100人以上……



そしてとうとうスタートですが、いきなり地獄絵図です。







出なくてよかった!絶対ムリ!



スタートの坂で上からRTLが降ってきて頭を直撃した岡庭さん
「頭がクラクラするし舌噛んで血が出た」

戻ってきた破壊神岡庭さん
「ライトカウル取って軽量化しました」

沼の手前で休憩地蔵の友也さん
「世の中にはいろんな性癖の人がいるんですね」


友也さんのヘルカメ動画はこちら


終始しゃべりっぱなしの総帥
流れるように漫談し続けてました


そんな総帥の動画はこちら→


その総帥の背後にはぴらふさん
「総帥じゃま!」

盛大にスタックするバイクが続出する中を華麗にクリアするひろしくん
「CGCお断りってステッカー作って下さい」


ひろしくんのヘルカメ動画はこちら


そのラインはダメって言ったのに行っちゃってスタックしたなべちゃん
この日見た最高のエモりかたをしてましたw

地すべりヒルから脇に入ったキャンバー
絶対走りたくない

ロングヒルクライムから戻ってきたところの下り
バイクを横滑りさせながら降りる人続出



いやいやいや、とんでもないコースでした……。
とてもじゃないけど1周できる気がしませんでした。エントリーした皆さんは本当にすごい。
僕は一生おだいりさまクラスには出ません。






初めて参加したCGCですが、レースの雰囲気は主催者もエントラントもとてもあたたかくて、知ってる範囲だとWEXみたいなゆるい居心地の良さを感じました。
ひどいコースなのに人が集まる理由が少しわかりました。(少しだからな!)

今の気持ちは、そうですね。こんな感じでしょうか。


















「二度と来るもんか!(また来るかもしれんけど…)」
菅平ラグビーサマーキャンプ的感情
©ネットから拝借



CGCから2日経って、残念ながら今少しだけ発症しています……。



ICGCHMJHKSS 
「今CGC走ったらもっと上手に走れる気がする症候群」



来年また考えますよ。ええ。来年。



またダーフリ行きたいし



でもやっぱバイク壊れるからやだな……。



頑丈なガムテープ外装なのに1レースでズタボロになったし

フロントフェンダーとゼッケンプレート割ったし









CGCぜったいゆるさない