MastodonサーバーをUbuntuとLXDとDockerを使って構築する

  • 18
    いいね
  • 0
    コメント

MastodonサーバーをUbuntuとLXDとDockerを使って構築する

この記事は、今流行りのMastodonの自前サーバーを、以下の組み合わせで構築する手順です。

  • Ubuntu 16.04 LTS
  • LXD 2.0.x
  • Docker 1.12.6(Ubuntuリポジトリ版)
  • docker-compose 1.12.0
  • Let's encrypt
  • Gmail(SMTPサーバー)

docker-composeはLXDコンテナの上で実行します。LXDコンテナに閉じ込めておくと、なんらかの理由でインスタンスを別サーバーに移行したくなったとき、LXDコンテナ単位でデータベースなども含めて簡単にマイグレーションできるからです。

またLXDコンテナの中でDockerを使うために、LXDパッチの当たったUbuntuリポジトリのdocker.ioパッケージを使うことにします。Docker公式の独自パッケージだとおそらく動きません。

LXDコンテナ環境の準備

Ubuntu 16.04 LTS上にLXDコンテナを使用するための環境を準備します。すでにLXDコンテナの使用環境が整っているのであれば、次の項目まで飛ばしましょう。

まずLXDをインストールします。サーバー版のUbuntu 16.04 LTSであれば、最初からインストールされているはずです。明示的にインストールする場合は、次のコマンドを実行してください。

$ sudo apt install lxd

インストールと同時にlxdグループが作成され、sudoを実行できるユーザーは自動的にlxdグループに所属します。グループの変更を反映するために、一度ログインしなおしましょう。lxdグループに所属すると、sudoなしにlxcコマンドを実行できるようになります。

次にLXDの初期設定を行います。LXDは「sudo lxd init」によって、全体的な初期設定を行えます。設定するのはストレージのバックエンド(コンテナのルートファイルシステムをどのように保存するのか)とコンテナのネットワーク設定です。というわけで、インストール直後に一回だけ実行します。

$ sudo lxd init

基本的に既定の設定をそのままOKしていくだけです。詳しいことはUbuntu Weekly Recipeの第459回の2ページ目を参照してください。

LXD上にmastodonコンテナを作成する

LXD上にmastodonをインストールするためのコンテナを作成します。ポイントはDockerをLXD上で利用できるようにするために「-p」オプションで「dockerプロファイル」を指定することです。

$ lxc init ubuntu:16.04 mastodon -p default -p docker

ルートファイルシステムをダウンロードするため、完了するまでに若干時間がかかります。

このあとコンテナを起動してからログインし必要なDockerなどをインストールします。ただし、このあたりは定型的な作業ですのでcloud-initで自動化してしまいましょう。LXDはコンテナのプロパティにcloud-initのファイルを指定できるのです。またcloud-initのファイルは他のクラウドプラットフォームでもそのまま流用できるというメリットもあります。

最初に、次の作業を行うcloud-initファイルを「mastodon.cfg」という名前で作成します。

#cloud-config

apt:
  primary:
    - arches: [default]
      uri: http://jp.archive.ubuntu.com/ubuntu

package_upgrade: true

packages:
  - language-pack-ja
  - docker.io
  - git

locale: ja_JP.UTF-8

timezone: Asia/Tokyo

runcmd:
  - [ dpkg, --add-architecture, i386 ]
  - [ curl, -L, "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-Linux-x86_64", -o, /usr/local/bin/docker-compose ]
  - [ chmod, +x, /usr/local/bin/docker-compose ]

上記の設定ファイルをmastodonコンテナにセットした上で、コンテナを起動します。

$ lxc config set mastodon user.user-data - < mastodon.cfg
$ lxc start mastodon

次のコマンドで、Dockerやdocker-composeが期待通り動作していることを確認しておきましょう。

$ lxc exec mastodon docker info
$ lxc exec mastodon -- docker-compose --version

ついでに「ubuntu」ユーザーで、dockerコマンドを実行できるようにしておきます。「ubuntu」はUbuntu 16.04 LTSコンテナの初期ユーザーです。
もちろん別のユーザーを作っても問題ありません。

$ lxc exec mastodon -- usermod -aG docker ubuntu

ちなみにmastodonコンテナの中にログインするためにはSSH鍵を登録する必要があります。cloud-initのssh_import_idを使うという手もありますが、次のように直接authorized_keysを書いてもかまいません。

$ lxc file push ~/.ssh/id_rsa.pub mastodon/home/ubuntu/.ssh/authorized_keys
$ lxc exec mastodon chown ubuntu: /home/ubuntu/.ssh/authorized_keys

もしGitHubにすでに公開鍵を登録済みであれば,ssh-import-idを使ってGitHubからインストールする方法もあります。

$ lxc exec mastodon -- sudo -u ubuntu ssh-import-id -o /home/ubuntu/.ssh/authorized_keys gh:(GitHubのアカウント名)

あとはlxc listでIPアドレスなどを確認すれば、SSHログインできるはずです。

$ lxc list mastodon
+----------+---------+--------------------------------+-----------------------------------------------+------------+-----------+
|   NAME   |  STATE  |              IPV4              |                     IPV6                      |    TYPE    | SNAPSHOTS |
+----------+---------+--------------------------------+-----------------------------------------------+------------+-----------+
| mastodon | RUNNING | 172.17.0.1 (docker0)           | fd3b:f724:c6b0:f8f8:216:3eff:fea8:9a74 (eth0) | PERSISTENT | 0         |
|          |         | 10.241.13.168 (eth0)           |                                               |            |           |
+----------+---------+--------------------------------+-----------------------------------------------+------------+-----------+

本記事では「mastodon$」と記述している場合、上記で作ったコンテナの中で操作しているものとします。
原則としてコンテナの外からlxc execを使って操作しても問題ありません。
もちろん将来的には自動化すると良いでしょう。

Mastodonのインストール

ソースコードを取得し、docker-composeで環境を構築します。

mastodon$ cd ~ubuntu/ && mkdir mastodon && cd $_
mastodon$ wget https://github.com/tootsuite/mastodon/archive/v1.1.2.tar.gz
mastodon$ tar xvf v1.1.2.tar.gz
mastodon$ cd mastodon-1.1.2

Mastodonの設定

ここから先はREADME.mdにあわせて作業を行います。ただし手順そのままだとダメだったので、いくつか変更を加えています。

mastodon$ cp .env.production.sample .env.production
mastodon$ docker-compose build

しばらく経過したらビルドが完了します。次は秘密鍵を3つ生成しましょう。

mastodon$ docker-compose run --rm web rake secret
mastodon$ docker-compose run --rm web rake secret
mastodon$ docker-compose run --rm web rake secret

出力された結果をもとに.env.productionを編集します。

LOCAL_DOMAIN=mastodon.example.com
LOCAL_HTTPS=true

秘密鍵(web rake secretの最後の文字列をそれぞれ指定する)
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=

標準の言語
DEFAULT_LOCALE=ja

メール通知用
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=notifications@example.com

SMTP_*はいくつかの選択肢がありますが、一番簡単なのはGmailを使う方法かもしれません。なおGmailで2段階認証を有効にしている場合は、アプリパスワードを生成し、それを設定する必要があります。

設定が終わったらdb:migrateassets:precompileを実行します。

mastodon$ docker-compose run --rm web rails db:migrate
mastodon$ docker-compose run --rm web rails assets:precompile

ここまでの作業でインストールは完了です。

Mastodonテストサーバーの起動

docker-compose.ymlを見るとわかりますが、実はデータベースなどもDockerの中で作るため、Dockerコンテナを再起動するとデータが初期化されます。
よってまずは、そのままで起動した上で、動作を確認しましょう。

mastodon$ docker-compose up -d

Nginxの設定

テストサーバーのURLはmastodonコンテナの中の「http://localhost:3000/」です。そこでホストにNginxプロキシを用意して、外部からプロキシ経由でアクセスすることにしましょう。

ホストにNginxとSSL証明書のためのLet's encryptをインストールし、証明書を生成します。

$ sudo apt install nginx letsencrypt
$ sudo letsencrypt certonly --standalone --standalone-supported-challenges tls-sni-01 -d mastodon.example.com

あとはMastodonのドキュメントにしたがって、Nginxの設定を追加するだけです。

  • example.comは自分のドメイン名にしましょう
  • 127.0.0.1localhostlxc listで表示されるmastodonコンテナのeth0のアドレスに設定しましょう

上記以外は特に変更する必要はありません。

では、良いMastodonライフを!