さくらVPSのUbuntu16.04でMastodonを立てる(Docker版)

開発 hironemuhironemu

Mastodon というものが流行っているらしいので、立ててみました。

  1. Ubuntuのアップグレード
  2. Dockerのインストール
  3. docker-composeのインストール
  4. Mastodonのインストール
  5. nginxの設定
  6. アカウント登録と管理者権限の設定

1. Ubuntuのアップグレード

しばらく放置されていたさくらVPSのインスタンスが1台あったんですが、12.04とだいぶ古いのでアップグレードしました。Mastodonとは関係無いので、読み飛ばしてもらって結構です。

一旦、12.04の状態を最新に更新します。

1  $ sudo apt-get update
2  $ sudo apt-get upgrade

do-release-upgrade で順番にアップグレードしていきます。今回は 12.04 → 14.04 → 16.04 という段階を経てアップグレードしました。

1  $ sudo do-release-upgrade -c
2  $ sudo do-release-upgrade

14.04 から 16.04 にアップグレードする時に以下のようなエラーが出ました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  Error in sys.excepthook:
  Traceback (most recent call last):
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/DistUpgrade/DistUpgradeViewText.py", line 145, in _handleException
      "\n".join(lines))
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/DistUpgrade/DistUpgradeViewText.py", line 179, in error
      print(twrap(summary))
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)

  Original exception was:
  Traceback (most recent call last):
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/xenial", line 8, in <module>
      sys.exit(main())
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/DistUpgrade/DistUpgradeMain.py", line 229, in main
      app = DistUpgradeController(view, options, datadir=options.datadir)
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/DistUpgrade/DistUpgradeController.py", line 119, in __init__
      self._view.updateStatus(_("Reading cache"))
    File "/tmp/ubuntu-release-upgrader-wsnfwle8/DistUpgrade/DistUpgradeViewText.py", line 159, in updateStatus
      print(msg)
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)

以下のフォーラムに解決策がありました。

https://ubuntuforums.org/showthread.php?t=2328729

つぎの環境変数付きで実行することで解決しました。

1
  $ LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8 sudo do-release-upgrade -d

2. Dockerのインストール

以下の公式のドキュメントがあるのでその通りにインストールしました。

https://docs.docker.com/engine/installation/linux/ubuntu/

Dockerのインストールに必要となるツール等をインストールします。

1
2
3
4
5
  $ sudo apt-get install \
      apt-transport-https \
      ca-certificates \
      curl \
      software-properties-common

GPGキーをインストールします

1
2
  $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  $ sudo apt-key fingerprint 0EBFCD88

Docker用のaptリポジトリを追加しましす

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

apt-get update しておきます

1
  $ sudo apt-get update

Docker本体をインストールします。バージョン指定もできるようですが今回は最新のDockerが取得できれば良いので、以下のコマンドでインストールしています。

1
  $ sudo apt-get install docker-ce

以下のコマンドで正常にインストールできたか確認します。

1
  $ sudo docker run hello-world

sudo して docker コマンドを入力しなくていいように以下のコマンドで自分自身を docker グループに追加しておきます。

1
2
  $ sudo gpasswd -a $USER docker
  $ sudo service docker restart

3. docker-composeのインストール

Mastodon は docker-compose を使っているようなので、これもインストールします。

docker-composeをダウンロードしてきて、実行権限つけるだけです。

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

4. Mastodonのインストール

GitHubからクローンしてきます。

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

取得してきたら、.env.production, docker-compose.ymlの2つのファイルを編集します。まず、.env.productionをコピーして編集します。

1
2
3
  $ cd mastodon
  $ cp .env.production.sample .env.production
  $ vi .env.production

  • LOCAL_DOMAIN: サーバのドメインを指定します(social.zealot.co.jp)
  • LOCAL_HTTPS: true
  • PAPERCLIP_SECRET: 次に説明するシークレットを設定
  • SECRET_KEY_BASE: 次に説明するシークレットを設定
  • OTP_SECRET: 次に説明するシークレットを設定
  • DEFAULT_LOCALE: ja (日本語をデフォルトにしました)
  • SMTP_SERVER: smtp.gmail.com (Gmailを使って送信するようにしました。その他のSMTP_*の設定も変更します)

上記3つのSECRETを生成するコマンドも用意されているので、以下のコマンドを3回実行してSECRETを取得します。(最初にイメージの取得などを行うのでちょっと時間がかかります)

1
2
  $ docker-compose build
  $ docker-compose run --rm web rake secret  ← このコマンドを3回実行します

DBにPostgreSQL、Redisを利用しているようです。データを永続化するには、以下のファイルのコメントアウトされている volumes の設定を有効にしておきます。

1
  $ vi docker-compose.yml

このあたりです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  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 # この部分

テーブルの作成と、アセットファイル(CSSやJS)のプリコンパイルを実行します。

1
2
  $ docker-compose run --rm web rake db:migrate
  $ docker-compose run --rm web rake assets:precompile

docker-compose run で起動します。PostgreSQL, Redis、Mastodonのアプリケーション本体等のコンテナが起動します。(-d でデーモンとして起動します。最初は、-dなしでフォアグラウンドで起動して問題なければ -d で起動しっぱなしにすると良いです)

1
  docker-compose up -d

5. nginxの設定

SSL経由でアクセスしたいので、nginxをインストールして設定します。

まず、nginxをインストールします。

1
  $ sudo apt install nginx

以下に、nginxの設定例があったので持ってきます。

https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md

日本語でコメントしているところを変更しています。

sudo vi /etc/nginx/sites-available/mastodon

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
  }

  server {
    listen 80;
    listen [::]:80;
    server_name social.zealot.co.jp;  # ここを変更
    # Useful for Let's Encrypt
    location /.well-known/acme-challenge/ { allow all; }
    location / { return 301 https://$host$request_uri; }
  }

  server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name social.zealot.co.jp; # ここを変更

    ssl_protocols TLSv1.2;
    ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    ssl_certificate     /etc/ssl/certs/social.zealot.co.jp.crt; # ここを変更
    ssl_certificate_key /etc/ssl/private/social.zealot.co.jp.key.nopass; # ここを変更
    #ssl_dhparam         /etc/ssl/certs/dhparam.pem;

    keepalive_timeout    70;
    sendfile             on;
    client_max_body_size 0;

    root /var/opt/mastodon/mastodon/public/; # ここを変更(Mastodonをクローンしてきたディレクトリの下の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 /assets {
      add_header Cache-Control "public, max-age=31536000, immutable";
    }

    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;
  }

シンボリックリンクをはります。

1
  $ sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/

nginxを起動します

1
  $ sudo service nginx start

6. アカウント登録と管理者権限の設定

ここまで出来たらセットアップは完了です。

今回は、 social.zealot.co.jp としてセットアップしたので、 https://social.zealot.co.jp にアクセスします。以下の新規登録画面が表示されたらインストール成功です。

適当にアカウントを登録します。アカウント登録が出来たら、以下のコマンドを実行して管理者権限をつけておきます。(存在するユーザに権限を付けているだけなので、最初にアカウントを作成しておく必要があります)

1
  $ docker-compose run --rm web bundle exec rails mastodon:make_admin USERNAME=hironemu

以下のURLで管理画面にアクセスできます。 https://ホスト名/admin/settings

以上でインストールの完了です。Dockerだと簡単にインストールできて良いですね。

Tags: