Dokku
Dokku は、独自のLinuxサーバー上で動作し、Heroku に似たデプロイ・ワークフローを提供するセルフホスト型のPaaS(Platform-as-a-Service)です。Ktorアプリケーションは、ファットJAR(fat JAR)を手動でサーバーにコピーしてデプロイすることもできますが、Dokkuを使用すると周辺のインフラストラクチャを自動化できます。
- Gitベースのデプロイ —
git pushでコードをプッシュすると、Dokkuがアプリケーションを自動的にビルドして再起動します。SSHによるファイルコピーや手動での再起動は不要です。 - プロセス管理 — Dokkuは、サーバーの再起動後も含め、アプリケーションの起動、停止、再起動を自動的に行います。
- 1つのサーバーで複数のアプリを実行 — 各アプリケーションは分離されたコンテナ内で実行されるため、ポートの競合やアプリ間の干渉を防げます。
- HTTPS — 1つのコマンドで、アプリにLet's Encrypt証明書をプロビジョニングできます。
- ゼロダウンタイム・デプロイ — Dokkuは、新しいコンテナがヘルスチェックに合格するのを待ってから、古いコンテナからトラフィックを切り替えます。
Dokkuを実行するにはLinuxサーバーが必要です。いくつかのホスティングプロバイダーでは、Dokkuがプリインストールされたイメージを提供しているため、手動でセットアップする必要はありません:DigitalOcean、Hostinger、HOSTKEY。
前提条件
このチュートリアルを始める前に、以下の前提条件が満たされていることを確認してください。
- DokkuがインストールされたLinuxサーバーがあること。手動でインストールするか、プリインストールされたDokkuイメージを提供しているホスティングプロバイダーを使用できます。
- ローカルマシンに Git がインストールされていること。
アプリケーションの準備
ステップ 1:ポートの設定
まず、着信リクエストをリッスンするために使用するポートを指定する必要があります。Dokkuは各アプリケーションに動的にポートを割り当て、それを環境変数 PORT を使用して渡します。アプリケーションは起動時にこの変数を読み取る必要があります。そうしないと、間違ったポートでリッスンしてしまい、Dokkuがトラフィックをルーティングできなくなる可能性があります。Ktorサーバーの設定方法に応じて、以下のいずれかを行ってください。
サーバーの設定をコードで指定している場合は、
System.getenv()関数を使用して環境変数を読み取り、それをembeddedServer()関数のportパラメーターに渡します。kotlinfun main() { embeddedServer(Netty, port = System.getenv("PORT")?.toIntOrNull() ?: 8080) { // ... }.start(wait = true) }サーバーの設定を構成ファイルで指定している場合は、
src/main/resourcesにある application.conf または application.yaml ファイルを開き、以下のようにportプロパティを更新します。shellktor { deployment { port = 8080 port = ${?PORT} } }yamlktor: deployment: port: ${PORT:8080}
ステップ 2:stageタスクの追加
build.gradle.kts ファイルを開き、Dokkuがアプリケーションのビルドに使用するカスタムのstage タスクを追加します。tasks {
register("stage").configure {
dependsOn("installDist")
}
}
installDistタスクは、Gradleの applicationプラグイン に含まれています。
ステップ 3:Javaバージョンの指定
プロジェクトのルートに system.properties ファイルを作成し、Javaバージョンを指定します。
java.runtime.version=21このバージョンは、build.gradle.kts ファイルで指定されているJVMツールチェーンのバージョンと一致している必要があります。このファイルがない場合、Dokkuは利用可能な最新のJDKバージョンを使用しますが、これは時間の経過とともに変更され、予期しないビルド失敗の原因となる可能性があります。
ステップ 4:Procfileの作成
プロジェクトのルートに Procfile を作成し、以下の内容を追加します。
web: ./build/install/<project-name>/bin/<project-name>このファイルは、stage タスクによってビルドされた後、Dokkuにアプリケーションの起動方法を指示します。 <project-name> をプロジェクト名に置き換えてください。プロジェクト名を確認するには、以下のコマンドを実行します。
./gradlew properties -q | grep "^name:" | sed 's/name: //'アプリケーションのデプロイ
Gitを使用してアプリケーションをDokkuにデプロイするには、新しいターミナルウィンドウを開き、以下の手順に従います。
前のセクションで行った変更をローカルでコミットします。
bashgit add . git commit -m "Prepare app for deploying"サーバーに接続し、Dokkuアプリケーションを作成します。
<app-name>をアプリケーションの名前に置き換えてください。bashssh <user>@<your-server> dokku apps:create <app-name>DokkuサーバーをGitリモートとして追加します。
<your-server>をサーバーのホスト名またはIPアドレスに、<app-name>を前のステップで使用した名前に置き換えてください。bashgit remote add dokku dokku@<your-server>:<app-name>コードをDokkuにプッシュして、ビルドとデプロイをトリガーします。
bashgit push dokku mainブランチ名が異なる場合は、
mainを使用しているブランチ名に置き換えてください。Ktorアプリケーションがサブディレクトリにある場合は、代わりに
git subtree pushを使用します。bashgit subtree push --prefix=<subdir> dokku mainDokkuがアプリケーションをビルドして起動するまで待ちます。
text... =====> Application deployed: http://<app-name>.<your-server>アプリケーションにアクセスできるように、ドメインまたはIPアドレスを設定します。
bashssh <user>@<your-server> dokku domains:set <app-name> <domain-or-ip>アプリケーションは
http://<domain-or-ip>で利用可能になります。
