Event

2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 2

Vaporを動かす- iPhoneとラズパイ間をVaporで通信 2

この記事はiOSDC2022で発表したセッション、Swiftで我が家を より便利に、安全に!の発表の第2部の内容をまとめた記事の第2弾になります。
この記事は、2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信1 の記事の続編です。もしまだ読んでいない方は読んでいただけると!
この記事では、主にHerokuのセットアップについてまとめます!

2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 1この記事は、「Swiftで我が家をより便利に、安全に」の発表の2部「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 」の内容の一部をまとめた記事になります!...

Herokuのセットアップ

ここではHerokuにVaporで実装したサーバーアプリをデプロイするためのセットアップをします。
VaporのHerokuへのデプロイも、Vaporの公式にドキュメントがあります。

セットアップの流れは以下の通りです。

  1. Herokuのアカウント作成
  2. Herokuでダッシュボードでアプリ作成
  3. ビルドができるようにする設定
  4. PostgresのDBの設定
  5. Privateレポジトリを使用している場合、SSHの設定
  6. ビルド→デプロイ

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鍵の発行に関する詳細は以下の記事に記載しています。

xcode-ssh-key
Xcode用のSSH鍵を生成するXcode用のSSH鍵を生成する方法をまとめました...

あとは、公開鍵をGitHubに、秘密鍵をHerokuに登録すればOKです!

登録する際は、上記でも使用したConfig VarsSSH_KEYという環境変数として登録します。
その際は、base64に変換したものを登録することが必要です。
以下のコマンドを実行すれば、まとめて設定可能です!

$ heroku config:set SSH_KEY=$(cat path/to/your/keys/id_ed25519 | base64)

これで以下のように、Config VarsSSH_KEYというSecretが追加されます

最後にデプロイ時にこの鍵を使用できるように設定します。
今回は、ssh-private-key-buildpackというbuildpackを追加しました。
HerokuのアプリのSettingsページ>Buildpacksに上記のbuildpackを追加して、既存のvaporherokuを含めて、↓の順番に変更します

これで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の高度情報をラズパイに送信する方法を紹介します。

2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 3この記事は、「Swiftで我が家をより便利に、安全に」の発表の2部「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 」の内容の一部をまとめた記事になります!...

参考

+1

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA