GameProgrammar's Night

ゲームプログラム系の覚え書き

Web素人がMastodonを立ててみた

 ゲームプログラム一筋で、オンライン対応でクライアント側のP2P対戦作ったり、サークルの開発サーバーをちょっとだけやってた程度の知識で立ててみた話。
 SMTPサーバーも立ち上げて、外部のメールサービスを使わない形で立ち上げます。ドメインはお名前.comで適当に取って来て、適当に設定しています。

サーバー

さくらVPS 1Gプラン(石狩)

CentOS6をCentOS7に入れ替える

 さくらVPSはデフォルトだとCentOS6ですので、CentOS7に入れ替えます。
 CentOS7自体は標準対応なので、VPSの設定画面からボタン一発で再インストールされます。
 石狩設置じゃないとCentOS7にできないらしいので、契約気をつけましょう。

f:id:katze_7514:20170415215008j:plain

 CentOS7にしないといけないのは、CentOS6はDockerのサポートが切られてるからです。

基本的な設定をする

help.sakura.ad.jp

 なんかを見ながら、rootとかSSHとかfirewallとか入れていきます。
 作業は、rootでやちゃってます。

必要なものインストール

 マニュアル見ると他にもいるもの(DBとかRubyとか)が書いてあるんですが、Dockerが全部引っ張ってきてくれるので気にしなくて良いようです。自分はDockerがどういうものかを良く知らなかったのでチマチマ入れてたんですが、Twitterで教えてもらいました。

git

 主にGitHubからソースを引っ張ってくるために使う。
 特に最新である必要もないので、yumに任せてOK

yum -y install git

Mastodon

 作業フォルダとなるので、tmpには置かない方が良いと思います。
 自分は、SSHログイン用に作ったユーザーのhome内においてます。

git clone https://github.com/tootsuite/mastodon.git

nginx

 Apacheの仲間のWebサーバーです。
 yum インストールでも良いですが、この手は最新が良いと思うので、ngnix.repoをつくってからinstallしました
/etc/yum.repos.d/nginx.repo ファイルを作り以下の内容を書きます。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

 その上で

yum -y --enablerepo=nginx install nginx

 とします。

Docker/Docker-compose

 仮想マシンを構築するパッケージらしいです。Dockerが本体で、Docker-composeは設定ファイルに基づいてDockerコンテンを作るサポートパッケージです。

Docker

 最新を入れた方が良いかなと思いましたので、公式ドキュメントに従いdocker-ceを入れます。ceは無料版で、eeは企業向けの有料サポートあり版だそうです。

 yum-utilsを入れます。

yum -y install yum-utils

 dockerのリポジトリを登録してから、インストールします。

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
Docker-compose

 docker-composeは、ビルド済みのをGitHubから引っ張ってきます。

curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

 

postfix

 mastodonからの確認メールなどを送信のに使います。今回は送信機能しか使わないので、dovecotなど受信サービスは使用しません。
 外からの送信は受け付けない用にしますので、バージョンはひとまず気にしないことにします。

yum -y install postfix

ファイアーウォール設定

 http(80)、https(443)、smtp(25)、smtps(587)を開放します。

firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
firewall-cmd --add-port=25/tcp --zone=public --permanent
firewall-cmd --add-port=587/tcp --zone=public --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --add-service=smtp --permanent
firewall-cmd --add-service=smtps --permanent

firewall-cmd --reload

Dockerの設定

 cloneしたMastodonのフォルダに移動して、環境設定ファイルをいじります。
 環境設定ファイルは、.env.production.samle をコピーして書き換えます。

cp .env.production.sample .env.production

ドメイン

# Federation
LOCAL_DOMAIN=ドメイン名
LOCAL_HTTPS=true

 ドメインは自前で取っても、さくらVPSで割り当ててあるやつでもご自由に。
 HTTPSを使うには証明書が必要になります。Let’s Encryptなどを使って取得して設定しておきます。nginx設定の時に軽く紹介します。

DB

 データベースは、特に設定する必要はありません。

 Application secrets 項に3つの鍵(PAPERCLIP_SECRET/SECRET_KEY_BASE/OTP_SECRET)を設定します。
 Docker-composeが生成するらしいので、以下のコマンドを3回実行して、最後に出てくる文字列を順番にコピペします。
 初回だけ実行に時間がかかりますが、それ以降はすぐ出てきます。

docker-compose run --rm web rake secret

 docker-composeは、mastodonのソースがあるフォルダで実行します。
docker-composeを使うには、Dockerのサービスを立ち上げておく必要がありますので、先に立ち上げておきます。

systemctl start docker

メール

 メールは、外部のsmtpサービスを使っても良いですが、ここではホスト側にpostfixサービスを立ち上げて、それを使います。
 まずは、メールを送信用のユーザーを作ります。

useradd mstdn_mail
passwd mstdn_mail

 次にdocker0という名前のブリッジのIPアドレスを確認します。

ip a

 docker0に設定されているIPアドレスが、Dockerの中からホストへ通信するためのIPとなります。
 例えば、「172.16.0.1」と設定されていたとします。
 .env.productionのメール設定を以下のようにします。

# E-mail configuration
SMTP_SERVER=172.16.0.1
SMTP_PORT=587
SMTP_LOGIN=mstdn_mail
SMTP_PASSWORD=設定したパスワード
SMTP_FROM_ADDRESS=送信先として設定されるアドレス
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_ENABLE_STARTTLS_AUTO=true

 ただし、オープンなmstdnを立ち上げようと思っているならば、外部のsmtpサービス(SparkPostとか)を使う方が良いと思います。
自前のドメインだと、迷惑メールにならないようにする対策とかOP25Bを解決するのがとても大変です。

DBを永続化する

 デフォルトの設定ですとDockerを再起動する度にDBが初期化されてしまいますので、そうならないようにします。
 mastodonフォルダにあるdocker-compose.yml を開いて、db,redis項目のvolumesの2行をアンコメントします。

db:
    restart: always
    image: postgres:alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data

postfix

 /etc/postfix/main.cf を書き換えます。

基本

myhostname=メールサーバーの名前
mydomain=ドメイン名
home_mailbox=Maildir/

送信受付

 ローカルとDockerからのみメール送信を受け付けるようにします。
 docker0に設定されているIPを「172.16.0.1」とします。

inet_interfaces = localhost 172.16.0.1
mynetworks = 127.0.0.0/8 172.16.0.0/16
relaydomin=

認証

サブミッションポート(587)を有効にします。

smtpd_sasl_auth_enable=yes
smtpd_recipient_restrictions = pemit_mynetworkd permit_sasl_authenticated reject_unauth_destination

nginx

 Docker内で動いているmastodonをhttp/httpsにリダイレクトするのに使います。
 設定ファイルは、mastodon公式で公開されているものをコピーして使います。
 置き場は、/etc/nginx/conf.dフォルダ に例えばmstdn.confという名前で作ります。
 example.comを自分のドメインに置き換えるだけで完了です。

証明書を取る

 証明書はLet'sEncryptを利用して取ります。
 GitHubからスクリプトを落としてきます。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencypt
./letsencypt-auto certonly

 途中で登録用のメアド、証明書を取るドメイン名などの入力を求められますのでいれます。
 nginxへの設定がいりますがmastodonで公開されているファイルに含まれていますので、何もしなくて大丈夫です。

サービスを立ち上げる

systemctl start postfix
systemctl enable postfix

systemctl start nginx
systemctl enable nginx

docker-composeを立ち上げる

 mastodonのフォルダに移動しておきます。

docker-compose pull
docker-compose build
docker-compose up -d

以上です。
 立ち上がるのには、少し時間がかかるのでしばらく待ちます。