DartのサーバサイドフレームワークのAqueductとAngularDartで開発してみようとしています。ひとまずAqueductからpub serve
へのproxyも通して、grind serve
でAqueductとpub serve
のどちらも立ち上がるようになってかなり快適になりました。アプリは全く作っていませんが、とりあえずAngularDartが動くことが確認できたのでよしとします!これらについてはまた別の記事を書こうと思います。
Herokuにデプロイしてみる
Aqueductのドキュメントに、Herokuへのデプロイの仕方が書いてあったので、とりあえずやってみることにしました。せっかく作ってもデプロイできなかったら悲しいですからね。ドキュメントは以下になります。
とりあえずこのままやってみます。
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
すると、出ましたー!
AngularDartのチュートリアルの最初で設定する文字列が表示されました。
編集後記
DartのプログラムがHerokuで動作することが確認できましたので、安心して開発することができます!