Mastodonの開発環境の構築方法をざっくりまとめました。
対象は2017/05/04以降のmasterブランチです。
Vagrantを使う
Vagrantを使う場合は非常に簡単に開発環境を構築できます。
Vagrant-guide.mdに詳しく書かれているので読むといいでしょう。
まずは、あらかじめVirtualBoxやVagrantが使えるようにしておきます。
Vagrantを使った開発環境では、mastodon.dev
というホスト名でアクセスできるようにhostsファイルを書き換えます。そのため、hostsファイルを書き換えるためのプラグインをインストールしておく必要があります。
$ vagrant plugin install vagrant-hostsupdater
次にcloneしてきたMastodonのディレクトリで以下のコマンドを実行して仮想マシンを起動します。
$ vagrant up
するとUbuntuのダウンロードやパッケージのインストールなどが実行されます。
vagrant up
だけではアプリケーションサーバは起動しないので、以下のコマンドを実行します。
$ vagrant ssh -c "cd /vagrant && foreman start"
すると、Railsのサーバとストリーミングサーバ、webpack-dev-serverがforeman経由で起動します。
http://mastodon.dev (または http://localhost:3000 )にアクセスすることでページを見ることができます。
ローカルのMastodonのディレクトリは仮想マシン内の/vagrant
にマウントされています。
そのため、Rails関連のコードを変更した場合は自動的に読み込まれるため、基本的にはforemanの再起動などは必要ありません。
しかし、データベースのマイグレーションや、gemやnpmのパッケージの更新が必要な場合は、
vagrant ssh
で仮想マシン内に入ってコマンドを実行する必要があります。
ローカルで開発環境を構築する
ローカルで開発環境を構築する場合、PostgreSQLとRedisが必要になります。
ローカルにこれらのサーバを立てたくない場合は、Dockerを使うと便利です。
以下のdocker-compose.dev.yml
をローカルに作成して起動します。
version: '2'
services:
db:
restart: always
image: postgres:alpine
ports:
- "5432:5432"
redis:
restart: always
image: redis:alpine
ports:
- "6379:6379"
$ docker-compose -f docker-compose.dev.yml up -d
これでPostgreSQLとRedisが立ち上がります。
次に、RailsやストリーミングサーバからPostgreSQLとRedisのサーバを指定するために.env
ファイル作成します。
ローカルのPostgreSQLとRedisを使用する場合は適宜値を変更してください。
DATABASE_URL=postgres://postgres:@localhost:5432
REDIS_HOST=localhost
REDIS_PORT=6379
設定が終わった後はデータベースのセットアップを行います。
通常であればbin/rails db:setup
を実行するだけなのですが、testデータベースを作成するときにDATABASE_URL
が反映されないため途中で落ちてしまいます。(rails/rails/issues/28827)
なので、以下のように一つづつコマンドを実行します。(testデータベースに関してエラーが出ますが、無視しましょう)
$ bin/rails db:create
$ bin/rails db:schema:load
$ bin/rails db:seed
最後に、以下のコマンドを実行してアプリケーションを起動します。
(foremanをインストールしてない場合はgem install foreman
でインストールしましょう。)
$ foreman start
Vagrantを使用する場合と同様に、Railsのサーバとストリーミングサーバ、webpack-dev-serverがforeman経由で起動します。
ページは http://localhost:3000 にアクセスすることで見ることができます。(http://mastodon.dev にはアクセスできません。)
あとがき
Vagrantを使用する方法と、ローカルで動かす方法を紹介しました。
個人的におすすめするのは、PostgreSQLとRedisをDockerで動かしつつ、アプリケーションをローカルで実行する方法です。
VagrantだとCPUやメモリの制限もありますし、マイグレーションやパッケージの更新を行うためにvagrant ssh
を実行する必要があるので、少し面倒だと思っています。
ローカルで実行する場合はそういった面倒な部分はないのでオススメです。