Vaporを動かす- iPhoneとラズパイ間をVaporで通信 2
この記事はiOSDC2022で発表したセッション、Swiftで我が家を より便利に、安全に!の発表の第2部の内容をまとめた記事の第2弾になります。
この記事は、2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信1 の記事の続編です。もしまだ読んでいない方は読んでいただけると!
この記事では、主にHerokuのセットアップについてまとめます!
Herokuのセットアップ
ここではHerokuにVaporで実装したサーバーアプリをデプロイするためのセットアップをします。
VaporのHerokuへのデプロイも、Vaporの公式にドキュメントがあります。
セットアップの流れは以下の通りです。
- Herokuのアカウント作成
- Herokuでダッシュボードでアプリ作成
- ビルドができるようにする設定
- PostgresのDBの設定
- Privateレポジトリを使用している場合、SSHの設定
- ビルド→デプロイ
Herokuのダッシュボードでセットアップ
まずは上記の①にある通り、こちらからアカウントを作成しましょう。
アカウント作成後に、ダッシュボードのメニュー↓から新規アプリを作成します。
ここで設定するアプリ名が、Herokuへ接続する時のURLにも使用されます。
次にGit連携をしますbrew
でherokuのCLIをインストールします。
$ brew install heroku/brew/heroku
そしてログインします。
$ heroku login
$ heroku auth:whoami
そしてリポジトリとHerokuを接続します。
$ heroku git:remote -a your-apps-name-here
BuildPackというHerokuの設定を追加します。
これを追加することで、Herokuがvaporのビルドやデプロイなどの処理を実行することができるようになります。
BuildPackはダッシュボードからも変更できて、HerokuのアプリのSettingsページ > Buildpacks
から設定できます!
$ heroku buildpacks:set vapor/vapor
次にどのswiftのバージョンを使用するかを、.swift-version
に記載します。
今回は、v5.6.1を指定します。
$ echo "5.6.1" > .swift-version
次に③のビルドの設定を追加します。Procfile
というファイルをプロジェクトのルートディレクトリに追加し、以下の文言を追加します。
Herokuがビルドするときに、このファイルを参照します。
最初の行は、リリース時に自動でマイグレーションを実行する設定です。
2行目は、アプリのビルドに関する設定です。
release: Run migrate -y
web: Run serve --env production --hostname 0.0.0.0 --port $PORT
準備ができたら、デプロイしましょう!
これでデプロイできます!
$ git push heroku master
なおHerokuの画面で、自動デプロイを有効にすれば、指定のブランチにPushするたびに、ビルド→デプロイが実行されます。
HerokuのダッシュボードのHeroku > Automatic deploys
から確認できます↓
PostgresのDBの設定
次にPostgresの設定をプロジェクトやHerokuのダッシュボードに記載しましょう
まずはアプリ内でDBのURLやhostなどを読み取れるように、環境変数にDBのURLや認証情報など必要な情報を設定します。
Herokuで利用するDBのURLは、Heroku側で設定しています。Settings > Config Vars
で設定されているSecret
は確認できます。
Macの場合、.env
ファイルに記載することで、アプリビルド時に読み込むことが可能です。
以下のはサンプルなので、データはマスクしてます!
DATABASE_HOST=******
DATABASE_USERNAME=******
DATABASE_PASSWORD=******
DATABASE_NAME=******
次にconfigure.swift
にDBのURLや認証情報などを設定する処理を書きます。
今回はHerokuで利用する時とMacでビルドした時の2つを書く必要があります。
環境変数を読み込む時は、Environment.get(“Environment_Variable_Name”)
を使うことで、環境変数の値を取得できます。
Heroku上では、DATABASE_URL
を使用し、Macでは上記の.env
ファイルに設定した4つの項目を使用します。
ifで分岐する時に、Macで設定していないDATABASE_URL
の値が取得できた場合はHeroku、そうでない場合はMacと判定しています。
// Heroku build
if let databaseURL = Environment.get("DATABASE_URL"), var postgresConfig = PostgresConfiguration(url: databaseURL) {
postgresConfig.tlsConfiguration = .makeClientConfiguration()
postgresConfig.tlsConfiguration?.certificateVerification = .none
app.databases.use(.postgres(configuration: postgresConfig), as: .psql)
} else {
// localhost build on Mac
app.databases.use(.postgres(
hostname: Environment.get("DATABASE_HOST") ?? "localhost",
port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? PostgresConfiguration.ianaPortNumber,
username: Environment.get("DATABASE_USERNAME") ?? "postgres",
password: Environment.get("DATABASE_PASSWORD") ?? "password",
database: Environment.get("DATABASE_NAME") ?? "vapor_database"
), as: .psql)
}
MacでPostgresを使用する場合はその設定が別途必要です。postgresql
のインストールは、以下のコマンドを実行すればOKです。
$ brew install postgresql
$ psql --version
$ brew services start postgresql # Activate postgresql
$ brew services list # Check if postgresql is activated or not
またHerokuでPostgres使用する場合は、アドオンの追加が必要です。
ダッシュボードのResources > Add-ons
からHeroku Postgres
を検索して、追加できます。
これで準備は完了です。
残りのテーブルやカラムの設定は、Vaporのコードが実行してくれます!
SSHの設定をする
今回デプロイするSwiftHomeServer
ではSwiftHomeCredentials
というPrivateリポジトリを使用するので、HerokuでSSHの設定をする必要があります。
今回使用するEd25519
のSSH鍵の発行に関する詳細は以下の記事に記載しています。
あとは、公開鍵をGitHubに、秘密鍵をHerokuに登録すればOKです!
登録する際は、上記でも使用したConfig Vars
にSSH_KEY
という環境変数として登録します。
その際は、base64
に変換したものを登録することが必要です。
以下のコマンドを実行すれば、まとめて設定可能です!
$ heroku config:set SSH_KEY=$(cat path/to/your/keys/id_ed25519 | base64)
これで以下のように、Config Vars
にSSH_KEY
というSecretが追加されます
これでSwiftHomeServer
をHerokuにデプロイする準備ができました!
デプロイして、動作確認する!
あとはデプロイしましょう!
指定ブランチに対してPushをするか、ダッシュボードのDeploy > Manual deploy
から手動でデプロイすることができます。
ビルド実行中のログやデプロイが完了したこともダッシュボードから確認できます!
早速デプロイしたサーバーにアクセスしてみましょう!
Vaporのテンプレートプロジェクトで生成された/hello
にアクセスしてみましょう!
今回は、最近よく使っているVSCodeのThunder Clientという拡張機能を使って動作確認します。https:/{Herokuのアプリ名}.herokuapp.com/hello
というURLを設定し、Get
を指定します。
これで実行すると、↓のキャプチャのように、Hello, world!
が表示されたことが確認できました!🎉
まとめ
この記事では、「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信」の発表内容に関連する内容のうち、Herokuに関する内容をまとめました!
この記事の続きは、「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信3」で、CoreMotion
を使って、iPhoneの高度情報をラズパイに送信する方法を紹介します。