patorashのブログ

方向性はまだない

AqueductアプリをHerokuにデプロイしてみた

DartのサーバサイドフレームワークのAqueductとAngularDartで開発してみようとしています。ひとまずAqueductからpub serveへのproxyも通して、grind serveでAqueductとpub serveのどちらも立ち上がるようになってかなり快適になりました。アプリは全く作っていませんが、とりあえずAngularDartが動くことが確認できたのでよしとします!これらについてはまた別の記事を書こうと思います。

Herokuにデプロイしてみる

Aqueductのドキュメントに、Herokuへのデプロイの仕方が書いてあったので、とりあえずやってみることにしました。せっかく作ってもデプロイできなかったら悲しいですからね。ドキュメントは以下になります。

aqueduct.io

とりあえずこのままやってみます。

1. Herokuにアプリを作る

Herokuにアプリを作るところはコマンドラインでやりました。アプリ名はユニークでないといけないので、なにかしらprefixをつけておくと、バッティングしづらいです。データベースを使う場合はheroku-postgresqlも入れておきましょう。

heroku apps:create [prefix-app-name]
heroku addons:create heroku-postgresql:hobby-dev

2. Aqueductアプリを作って、Herokuで動かす設定を行う

まだアプリがない場合はアプリを作ります。

aqueduct create [app-name]
cd [app-name]
git init

そして、herokuで動かすための設定を行うコマンドを実行します。もしheroku cliでログインしていなかったらログインしておいてください。

aqueduct setup --heroku=[prefix-app-name]

このコマンドを実行すると、以下のようなログが流れます。

-- Aqueduct CLI Version: 2.5.0
-- Aqueduct project version: 2.5.0
-- Setting up Heroku for patorash-project-chat
    Running heroku git:remote -a patorash-project-chat in /Users/patorash/sources/github.com/patorash/[app-name]
    Running heroku config:set DART_SDK_URL=https://storage.googleapis.com/dart-archive/channels/stable/release/latest/sdk/dartsdk-linux-x64-release.zip in /Users/patorash/sources/github.com/patorash/[app-name]
    Running heroku config:add BUILDPACK_URL=https://github.com/stablekernel/heroku-buildpack-dart.git in /Users/patorash/sources/github.com/patorash/[app-name]
    Running heroku config:set PATH=/app/bin:/usr/local/bin:/usr/bin:/bin:/app/.pub-cache/bin:/app/dart-sdk/bin in /Users/patorash/sources/github.com/patorash/[app-name]
    Running heroku config:set PUB_CACHE=/app/pub-cache in /Users/patorash/sources/github.com/patorash/[app-name]
    Removing config.yaml from .gitignore

どうやら、

  • heroku git:remoteを実行(これでgit push heroku masterなど、heroku指定できるようになる)
  • 環境変数Dart SDKのURLの設定
  • Dartを含んだビルドパックのURLの設定
  • Dartへのパスを通す
  • Dartのライブラリの位置を指定する
  • .gitignoreからconfig.yamlを外す

という処理が実行されたようです。

また、ここには書かれていませんが、Procfileが作られています。ProcfileはHerokuにデプロイしたら実行される処理が書かれています。

release: /app/dart-sdk/bin/pub global run aqueduct:aqueduct db upgrade --connect $DATABASE_URL
web: /app/dart-sdk/bin/pub global run aqueduct:aqueduct serve --port $PORT --no-monitor

リリースしたら、DBのマイグレートが自動で行われ、Aqueductアプリが起動する設定でした。

3. 設定ファイルを書く

config.yamlに、データベースへの接続設定を書く必要がありますので、以下のように書きます。

database: $DATABASE_URL
logging:
 type: console

$DATABASE_URLはheroku postgresqlを入れたら設定される環境変数です。これを指定しておきます。

4. デプロイする

まずマイグレーションファイルを作っているようですが、私はすでにマイグレーションファイルがあったのでここは飛ばしました。

aqueduct db generate

このコマンドで、すでにモデルファイルがあれば、その情報を元にマイグレーションファイルが作られます。

チュートリアル的に、準備ができたみたいなので、コミットしてデプロイしてみましょう。

git add .
git commit -m "initial commit"
git push heroku master

こうすると、ズラズラーっとログが表示されます。Dart SDKのダウンロードとビルドパックの設定、それにライブラリのダウンロードが毎回実行されるようで、デプロイの時間は結構長いです。私の環境では、3分半くらいかかりました。なお、pub buildは自動で実行されます。

そして、Dynoを起動させましょう。

heroku ps:scale web=1

これで、チュートリアルは完了。早速アクセスしましょう。以下のコマンドで、アプリのURLをブラウザで表示してくれます。

heroku open

っと思ったら、エラーが起きて落ちていました…。ログを見てみましょう。

heroku logs -t

すると、以下のようなログが。

2017-11-14T15:45:51.731620+00:00 heroku[web.1]: Starting process with command `/app/dart-sdk/bin/pub global run aqueduct:aqueduct serve --port 18743 --no-monitor`
2017-11-14T15:45:55.599716+00:00 app[web.1]: -- Aqueduct CLI Version: 2.5.0
2017-11-14T15:45:55.655924+00:00 app[web.1]: -- Aqueduct project version: 2.5.0
2017-11-14T15:45:56.832025+00:00 app[web.1]: -- Preparing...
2017-11-14T15:45:56.836338+00:00 app[web.1]: -- Starting application '[app-name]/[app-name]'
2017-11-14T15:45:56.836641+00:00 app[web.1]:     Sink Type: AppNameSink
2017-11-14T15:45:56.836841+00:00 app[web.1]:     Config: /app/config.yaml
2017-11-14T15:45:56.837397+00:00 app[web.1]:     Port: 18743
2017-11-14T15:45:58.574365+00:00 app[web.1]: ConfigurationException: AppNameConfiguration contained unexpected keys: logging
2017-11-14T15:45:58.574378+00:00 app[web.1]:  #0      ConfigurationItem.readFromMap (package:safe_config/src/configuration_item.dart:76:7)
2017-11-14T15:45:58.574379+00:00 app[web.1]: #1      new ConfigurationItem.fromString (package:safe_config/src/configuration_item.dart:19:5)
2017-11-14T15:45:58.574380+00:00 app[web.1]: #2      new ConfigurationItem.fromFile (package:safe_config/src/configuration_item.dart:26:45)
2017-11-14T15:45:58.574381+00:00 app[web.1]: #3      new ProjectChatConfiguration (package:[app-name]/[app-name]_sink.dart:194:47)
2017-11-14T15:45:58.574382+00:00 app[web.1]: #4      new ProjectChatSink (package:[app-name]/[app-name]_sink.dart:31:23)
2017-11-14T15:45:58.574384+00:00 app[web.1]: #6      _LocalClassMirror.newInstance (dart:mirrors-patch/mirrors_impl.dart:842)
2017-11-14T15:45:58.574383+00:00 app[web.1]: #5      _LocalClassMirror._invokeConstructor (dart:mirrors-patch/mirrors_impl.dart:916)
2017-11-14T15:45:58.574385+00:00 app[web.1]: #7      isolateServerEntryPoint (package:aqueduct/src/application/isolate_application_server.dart:85:8)
2017-11-14T15:45:58.574385+00:00 app[web.1]: #8      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:268)
2017-11-14T15:45:58.574386+00:00 app[web.1]: #9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:151)
2017-11-14T15:45:58.574387+00:00 app[web.1]:
2017-11-14T15:46:52.005405+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2017-11-14T15:46:52.005405+00:00 heroku[web.1]: Stopping process with SIGKILL
2017-11-14T15:46:52.148959+00:00 heroku[web.1]: Process exited with status 137
2017-11-14T15:46:52.168200+00:00 heroku[web.1]: State changed from starting to crashed
2017-11-14T15:46:52.171578+00:00 heroku[web.1]: State changed from crashed to starting

config.yamlに設定されているloggingていう項目がわからないとということのようなので、config.yamlから削除しました。うーむ、サンプル通りにしたのだけれど…。とりあえず以下のようにしてコミット。

database: $DATABASE_URL

そして再push。

git push heroku master

すると、出ましたー!

f:id:patorash:20171115021813p:plain

AngularDartのチュートリアルの最初で設定する文字列が表示されました。

編集後記

DartのプログラムがHerokuで動作することが確認できましたので、安心して開発することができます!