30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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ライフを!

30
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?