2017年4月14日金曜日

【Microsoft Azure】みんな大好きMastodonをAzureで動かそう #1

最近にわかに話題に上がってるMastodonは、アメリカのヘヴィメタルバンドではなく、Twitterに似たWebサービスです。
https://github.com/tootsuite/mastodon

サーバーがそれぞれ分散しているのが特徴で、私を含む大人たちはもしかしたらNiftyServeみたいなのを思い出すかもしれません。
もちろんオープンソースですので、Azureで動かしちゃいます。

今回の構築に必要なものは、こちら。

・Azure Container Service(以下ACS)
docker-composeコマンドでさくっとMastodonサーバーを構築するのにちょうどいいです。

・PostgreSQLとRedisを動かす仮想マシン
今後DBを分散するために、dockerコンテナの外に構築します。
Ubuntuでやってみましょう。

・SMTPサーバー
登録時のメールアドレス確認のためのメールサーバーです。
なんでもいいんですけど。

では、さっそくやってみましょう。

まずは最初に仮想マシンを作成します。
こちらを参考にして、ログインするところまで頑張ります。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/quick-create-portal

ログイン後、以下のようにPostgreSQLとRedisを設定していきます。
まずは管理者になってパッチを当てます。
# apt update
# apt -y upgrade

次はaptコマンドでPostgreSQLとRedisをインストールします。
# aot -y install redis-server redis-tools postgresql postgresql-contrib

ACSからRedisに繋がるように設定します。
# vi /etc/redis/redis.conf
redis.confの中の「bind 127.0.0.1」を「bind 0.0.0.0」に書き換えます。
なお、この状態だとすべてのサーバーからの接続を許可するので、そのまま放置するのはよろしくないです。

PostgreSQLへ、Mastodonで使用するデータベース(mastodon)とユーザー(mastsan)を追加します。この作業はpostgresユーザーで行います。
# su - postgres
$ createdb mastodon
$ psql
> create role mastsan login createdb password 'ログインパスワード文字列';
> \q
$ exit

ACSからPostgreSQLへのパスワードログインを許可します。
# vi /etc/postgresql/9.5/main/postgresql.conf
まずは、postgresql.confに「listen_addresses = '*'」を追加します。
これで他のサーバーからのログインができるようになります。

# vi /etc/postgresql/9.5/main/pg_hba.conf
pg_hba.confの最後に以下の行を追加します。
「host   all  mastosan  0.0.0.0/0   md5」
mastosanユーザーはパスワードでログイン可能です。

最後に、サービスを再起動して反映します。
# /etc/init.d/redis-server restart
# /etc/init.d/postgresql restart


次はACSの設定ですが、今回は構築してSSHトンネリングで起動を確認するまでをやってみます。

まず、AzureポータルからACSを作成します。
左の「+」から、「Containers」を選び、「Azure Container Service」をクリックします。


そのまま下の「OK」をクリックします。


Orchestratorは「Swarm」を選んで、リソースグループやロケーションを決めたら、「OK」をクリックします。



DNSのプレフィックスに今回「mastodon」を設定しました。
コンテナへのユーザーネームと、ログインに必要な公開鍵を貼り付けます。



今回コンテナを3つ動作させるので、Agent count は「3」にします。
Agent virtual machine size はヘタレなので「Standard A0」(ACSでは最小)を選択します。


登録内容を確認して「OK」をクリック。


デプロイが終わるのを待ちます...。


デプロイが終わったら、リソースグループの一覧から今回作成したもの(acstest)を探して表示します。
左のメニューに「Deployments」があるので、選んで表示された一番上(最新)のデプロイ内容を表示します。


そこにdockerホストへのアクセス情報が書かれています。
SSHMASTER0というキーに表示されている値をコピーして、sshでdockerホストへアクセスします。
今回は「ssh ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200」となります。


さて、ここからはdockerホストでの作業です。

ログインしてまずはgithubからMastodonをクローンします。
$ ssh ユーザー名@プレフィックmgmt.リージョン.cloudapp.azure.com -A -p 2200
$ git clone https://github.com/tootsuite/mastodon.git
$ cd mastodon

環境に合わせて、「.env.production」ファイルを編集します。
$ cp .env.production.sample .env.production
$ vi .env.production

今回使うRedis、PostgreSQL、SMTPの設定をします。以下の値を環境に合わせて設定しましょう。

--------------------------------------------------------------------------------------------
REDIS_HOST=Redisが動作しているホスト名
REDIS_PORT=6379
DB_HOST=PostgreSQLが動作しているホスト名
DB_USER=ユーザー名(今回はmastsan)
DB_NAME=データベース名(今回はmastodon)
DB_PASS=PostgreSQLにログインするパスワード
DB_PORT=5432

# Federation
LOCAL_DOMAIN=example.com
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=長い文字列
SECRET_KEY_BASE=長い文字列
OTP_SECRET=長い文字列

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=SMTPサーバー
SMTP_PORT=587
SMTP_LOGIN=ログイン名
SMTP_PASSWORD=パスワード
SMTP_FROM_ADDRESS=メールに設定するFromアドレス
--------------------------------------------------------------------------------------------

保存したら、docker-compse.ymlを変更して、RedisとPostgreSQLのコンテナを作成しないよう以下のように変更します。

$ vi docker-compose.yml
--------------------------------------------------------------------------------------------
version: '2'
services:

#  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

  web:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/system:/mastodon/public/system

  streaming:
    restart: always
    build: .
    env_file: .env.production
    command: npm run start
    ports:
      - "4000:4000"
#    depends_on:
#      - db
#      - redis

  sidekiq:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/system:/mastodon/public/system
--------------------------------------------------------------------------------------------


あとはビルドしてコマンドから起動します。
途中で失敗する場合は、仮想マシンのRedisやPostgreSQLが起動していなかったりアクセスができない状態ではないか確認してみます。
$ docker-compose build
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
$ docker-compose up -d


ひとまず確認のため、ローカルホスト(私の場合はMacOS)からSSLトンネリングしてMastodonに接続できるか確認します。ローカルホストのポート30000/TCPに繋ぐとMastodonに接続するようにします。
$ ssh -fNL 30000:localhost:3000 ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200

ブラウザで「http://localhost:30000」へアクセスしてみましょう。
きっと見えてるはずw
















0 件のコメント: