個人用のmastodonのインスタンスを立てる

1. 目標

  • やること


自前のmastodonインスタンスを持つこと。
分散型なのでやるっきゃない。
途中で面倒くさくなってもよそのインスタンスへ移ればいいだけだし。
フォローとかブロックの設定はエクスポートできるみたいだけど
トゥートが同じことできるかは不明。
まあ消えても現状だとtwitterがあるからそれでも良いな。


2. 参考にしたサイト


基本的にMIROさんのやりかたそのまんま。
http://blog.mobilehackerz.jp/2017/04/mastodon_15.html?m=1
http://qiita.com/t-mimura/items/c206d46f3af771292f89
http://qiita.com/motiakoron/items/1e5b0679f7283bfee70b
https://tsuchikazu.net/lets-encrypt-nginx/
http://qiita.com/sawanoboly/items/c7d6b913fd5455fb0f36
http://knowledge.sakura.ad.jp/knowledge/5573/

違いはこれくらい。

  • 無料で使えるSSLがまともに運用できる知らなかったのでそれ関連。
  • CentOSをもう使うつもり無いのでホストはUbuntuで運用。


3. サーバーの選定


まずは先人の現状を確認してみる。

[~]kappa$ ping mstdn.mobilehackerz.jp
PING mstdn.mobilehackerz.jp (160.16.60.86): 56 data bytes
64 bytes from 160.16.60.86: icmp_seq=0 ttl=50 time=95.507 ms
64 bytes from 160.16.60.86: icmp_seq=1 ttl=50 time=82.006 ms

[~]kappa$ whois 160.16.60.86 | grep -i desc | head -n 5
descr: SAKURA Internet Inc.
descr: 1-8-14, Minami Honmachi, Chuo-ku, Osaka 541-0054, Japan
descr: SAKURA Internet Inc.

さくららしい。

  • さくらの価格表

http://vps.sakura.ad.jp/
最安値が月685円らしい。
途中からスケールアップできるらしいからこれで良さ気。

4.契約
スケールアップできるらしいので1番下のプランで。

  • 512MB 685円/月

http://vps.sakura.ad.jp/
上記のプランで申し込み&会員登録。


5.OSインストール

  • 管理画面へ移動


会員メニュートップ > 契約情報 > 契約サービス一覧-表示>サーバ設定

  • 設定変更
    • 各種設定>サーバ情報 でもろもろ変更
  • OS起動


「起動」をクリックでOSが立ち上がる。

  • コンソールへログイン

コンソール>シリアルコンソール(ベータ版)がなかなか良さ気。他使ってないけど。
メールで届いているユーザーとパスワードでログインする。
2017年04月16日14時頃だとバージョンはこれ。

CentOS release 6.9 (Final)

初期設定を見て満足したのでサーバーを落とす。

shutdown -h now

  • OSをインストール
    • 各種設定>OSインストール>標準OSインストール で以下を選択
      • インストールOS:Ubuntu 16.04 amd64
      • 新しいUbuntuパスワード:秘密のパスワード
      • 設定内容を確認する をクリック
    • インストールを実行する をクリック

6.ユーザーの作成

  • ユーザーを作成する

# サーバー作業
$ sudo adduser mastodon
$ sudo gpasswd -a mastodon sudo
$ sudo gpasswd -a mastodon adm
$ sudo su - mastodon

  • 鍵の作成

# ローカル作業
ssh-keygen -t rsa -b 4096 -C "kappaあっとまーくseijin.jp"

# サーバー作業
$ cd ~/
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ vi authorized_keys
$ chmod 600 authorized_keys
$ ls -alht

# サーバー作業
[~]kappa$ ssh -i ~/aws_key/mastodon.id_rsa kappa@153.126.130.194
The authenticity of host '153.126.130.194 (153.126.130.194)' can't be established.
ECDSA key fingerprint is SHA256:5HWX5pALz+SjF2BWwj8aX1ceS/Op/41bOkO30LacwPc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '153.126.130.194' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Sun Apr 16 19:08:04 2017


7.dockerのインストール

  • システムアップデート

$ sudo apt-get -y update
$ sudo apt-get -y upgrade
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

$ sudo apt-get -y install curl vim tree

$ sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

$ sudo apt-get -y update

  • dockerのインストール
    • コマンド

$ sudo apt-get -y install docker-ce
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

  • dockerを一般ユーザーで使えるようにする
    • dockerのグループがいるか確認

$ grep docker /etc/group
docker:x:999:

    • dockerのユーザーがいるか確認(いない)

$ grep docker /etc/passwd

    • 運用ユーザーの情報を確認

$ id mastodon
uid=1001(mastodon) gid=1001(mastodon) groups=1001(mastodon),4(adm),27(sudo)

    • docker運用ユーザーをdockerグループへ追加

$ sudo gpasswd -a mastodon docker
Adding user mastodon to group docker

    • docker運用ユーザーの情報を確認

$ id mastodon
uid=1001(mastodon) gid=1001(mastodon) groups=1001(mastodon),4(adm),27(sudo),999(docker)

    • dockerサービスを確認

$ ps axuw | grep [d]ocker
root 25161 0.0 7.7 414104 38648 ? Ssl 21:22 0:00 /usr/bin/dockerd -H fd://
root 25180 0.0 1.9 199828 9784 ? Ssl 21:22 0:00 containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime runc

    • docker運用ユーザーを再ログイン

logout
sshで再ログイン

    • 確認

$ sudo systemctl start docker
$ sudo systemctl enable docker
$ docker info
$ docker ps -a
$ docker images


8.セキュリティー確認

$ sudo iptables -L

  • 塞ぐ

$ sudo vim /etc/iptables/iptables.rules
$ sudo cat /etc/iptables/iptables.rules
*filter

INPUT ACCEPT [0
0]
FORWARD ACCEPT [0
0]
OUTPUT ACCEPT [0
0]
  • A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  • A INPUT -p icmp -j ACCEPT
  • A INPUT -i lo -j ACCEPT
  • A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  • A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
  • A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
  • A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
  • A INPUT -j REJECT --reject-with icmp-host-prohibited
  • A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

$ sudo /etc/init.d/networking restart

  • 状態確認

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:3000
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

  • dockerを再起動

iptablesの再起動するとdockerのポート転送がおかしくなるので再起動する。

$ sudo systemctl restart docker

    • 3000番ポートは最後に削除する


9.smtpサーバーの設定
gmailを使います。


10.mastodonのインストール

$ cd ~/
$ git clone https://github.com/tootsuite/mastodon.git live
$ cd live
$ git checkout $(git tag | tail -n 1)

  • secret鍵の作成
    • PAPERCLIP_SECRET,SECRET_KEY_BASE,OTP_SECRET用に3つ作る

docker-compose run --rm web rake secret

$ cp .env.production.sample .env.production
$ vim .env.production

# example.commastodon.seijin.jpへ置換する

# PAPERCLIP_SECRET,SECRET_KEY_BASE,OTP_SECRETを設定する

# FQDN設定、SSL有効
LOCAL_DOMAIN=mastodon.seijin.jp
LOCAL_HTTPS=true

# 言語
DEFAULT_LOCALE=ja

# mail
SMTP_DOMAIN=gmail.com
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=SMTP_Injection
SMTP_PASSWORD=secret-password
SMTP_FROM_ADDRESS=notifications@mastodon.seijin.jp
SMTP_DELIVERY_METHOD=smtp
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_ENABLE_STARTTLS_AUTO=true

  • データの永続化

vim docker-compose.yml
dbとredisのvolumesがコメントアウトされているので有効にする


11.コンテナ起動

  • ビルド

$ docker-compose build

$ docker-compose run --rm web rails db:migrate

$ docker-compose run --rm web rails assets:precompile

  • 起動

$ docker-compose up -d


12.SSL/nginxの設定

  • インストール

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get -y install certbot nginx
$ sudo dd if=/dev/zero of=/home/swap.swp bs=1M count=3000
$ sudo chmod 0600 /home/swap.swp
$ sudo mkswap /home/swap.swp
$ sudo swapon /home/swap.swp
$ sudo vi /etc/fstab
/home/swap.swp swap swap defaults 0 0

  • nginxのファイルを設定する

# この内容を
https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md
# ここにコピペしてドメインFQDNexample.comを置換する
$ sudo vim /etc/nginx/conf.d/mastodon.conf

$ sudo certbot certonly --standalone -d mastodon.seijin.jp --email kappaあっとまーくseijin.jp
$ sudo certbot certonly --webroot -w /home/mastodon/live/public -d mastodon.seijin.jp --email kappaあっとまーくseijin.jp

    • SSLのDHE鍵の更新

$ sudo openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem

  • nginxを起動する

$ sudo systemctl start nginx
$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable nginx

  • 起動確認

https://mastodon.seijin.jp


13. 登録、運用

  • ユーザー登録する
    • メールが飛ばないのでなにかミスったっぽい。あとで。
  • 登録したユーザーをコマンドで承認する

$ docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=kappaあっとまーくseijin.jp
kappaあっとまーくseijin.jp confirmed

  • 管理者へ昇格する

$ docker-compose run --rm web rails mastodon:make_admin USERNAME=kappaseijin
Congrats! kappaseijin is now an admin. \o/
Navigate to https://mastodon.seijin.jp/admin/settings to get started

  • 設定を変更するためコンテナを一時的に止める

$ docker-compose stop

$ vim .env.production
これを有効にする
SINGLE_USER_MODE=true

  • コンテナを起動する

docker-compose up -d

  • 確認用の3000番ポートを削除

$ sudo vim /etc/iptables/iptables.rules

  • OS再起動

sudo reboot

  • 管理者画面へログインして新規登録を無効にする

ログイン>サイト設定>新規登録を受け付ける>無効