Mastodon

最近話題のMastodonについてと、そのインスタンスの建て方について書きます。

 

GNU Social互換のサービス、Mastodon。数時間前にはYahoo!ニュースに載ったり、今話題沸騰中です。Twitterに非常に良く似たものではありますが、理念が全然違っていたり、良い機能が一杯あるんです!

TwitterやFacebookなどの既存のSNSは、一社が開発、サービス提供しており、GNU Socialの言う所の”中央集権化している”状態なわけです。当然ながらそのデータはその会社が独占しているわけで、当然彼らはユーザーの呟きや投稿をビッグデータという形で、現に他の起業に売りに出したりしています。自分は別に良いかなと思うのですが、ちょっと嫌な感じはありますね。また、近年Twitter社の経営が危ぶまれており、有料化したり、サービス自体停止するかもしれません。

 

そんな中で登場したGNU Social。当然の如くオープンソースで、開発者は誰もがサービスを提供できます。ユーザーは複数あるサーバを選ぶことができ、またサーバを越えてコミュニケーションを行えます。まさに次世代のSNSです。

GNU Socialはギークの間で流行った(と思う)のですが、普段TwittterやFacebookを使う一般の人々には伝わりませんでした。しかし今流行りだしたMastodonは違います!UIがTweetDeckライクで、TweetDeckユーザーは簡単に移行できます。投稿は「toot(吠える)」が使われ、ストリームでtootが見れます。開発者はソースコードからDockerで簡単にデプロイ出来ます。

…もっと哲学的にまとめている方がいるので、こちらを見るとその思想がより分かりやすいと思います。

https://blog.cardina1.red/2017/04/13/federated-social-web/

 


 

自分はmstdn.cloudから始めたのですが、なかなか面白いです。入った当初の日本人ユーザーは、日本語と英語を併記する流れがあったので自分もそれに便乗していたのですが、いつの間にかmstdn.cloudは日本語で溢れかえってしまいました…海外サーバなのに哀しいかな。

自分の通っている大学では多くの人が(学生も教授も)日常的にTwitterを使っています。でも同じ大学の学生全員をフォローするのは億劫です。そこで今回有名になったMastodonのインスタンスを、自分の通っている大学の学生だけに限定して建て、ローカルタイムラインにはうちの大学生のtootが、連邦タイムラインには全国の大学のtootが…!なんて未来を期待しています。

そんなわけで自分はMastodonインスタンスを建てることにしたわけです。

 

建て方はREADMEに全て書いてあるので非常に簡単ですが、一応ここに日本語でまとめます。

docker、並びにdocker-composeをインストールした上で…

git clone https://github.com/tootsuite/mastodon.git cd mastodon docker-compose build

ここまでは何も問題ないかと思います。

cp .env.production.sample .env.production した上で、docker-compose run –rm web rake secret を3回繰り返し、.env.productionのApplication secretsの3箇所に貼り付けます。

docker-compose run –rm web rails db:migrate docker-compose run –rm web rails assets:precompile docker-compose up -d

これでhttp://${serverhost}:3000/にアクセスしてみましょう。ちゃんとaboutページが表示されたら成功です。

 

まぁこのままでも良いのですが、TLS無しでユーザー登録やログイン処理を行うのは非常に危険です。Nginxを挟みましょう。親切にもProduction guideを用意してくれているのでこれに従います。

map $http_upgrade $connection_upgrade { default upgrade; ‘’ close; }

server { listen 80; listen [::]:80; server_name mstdn.fun; return 301 https://$host$request_uri; }

server { listen 443 ssl; listen [::]:443 ssl; server_name mstdn.fun;

ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EECDH+AES; ssl_ecdh_curve prime256v1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m;

ssl_certificate /etc/letsencrypt/live/mstdn.fun/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mstdn.fun/privkey.pem;

keepalive_timeout 70; sendfile on; client_max_body_size 0;

root /home/mastodon/live/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 @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://localhost: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; }

あとはdocker-compose -dの上でNginxを動かせば、立派なMastodonインスタンスの完成です。

 

リファレンスにはNginxでなくApacheを使う方法や、Dockerを介さない方法とか色々書かれているので、本当に迷わずに立ち上げられました!開発者の方々に感謝です。

こんな感じで我が公立はこだて未来大学のMastodonインスタンスは運用を開始しました。

https://mstdn.fun

ユーザー登録時のメールアドレスはfun.ac.jpドメインのみ受け付けているので、外部の方は参加できないわけです。

 

なんやかんや言って特定の大学の学生を対象としたMastodonインスタンスは、うちが初めてではないでしょうか!会津さんも建てると聞いているので、是非繋がりましょう!

以上