手動デプロイの悪夢
単純な git pull の後に壊れたNginx設定のデバッグで1時間を費やしたことがあるなら、手動デプロイの苦しみをご存知でしょう。かつての私は金曜の夜にサーバーへSSH接続し、手動でsystemdサービスを再起動し、マイナーな依存関係の更新がスタック全体をクラッシュさせないよう祈っていたものでした。1つのアプリなら何とかなりますが、5つや6つのマイクロサービスを管理するようになると、それは燃え尽き症候群への近道です。
Herokuの基本的なdynoに月額25ドルという価格設定を見て、手元の5ドルのDigitalOcean Dropletでそのシンプルさが手に入ればいいのに、と思うかもしれません。そこでDokkuの出番です。Dokkuは、生のインフラとハイレベルなプラットフォームの間の溝を埋めてくれます。長年の現場経験から、サーバーのメンテナンスよりもコードに集中したい開発者にとって、Dokkuは最高のツールであると確信しています。
Dokkuとは一体何か?
Dokkuは、自身のサーバー上で動作する軽量なPaaS(Platform as a Service)です。DockerとHerokuishを巧みにラップしたものだと考えてください。Buildpacksを使用して、Node.js、Python、Ruby、Goなどのコードを自動的に検出し、Dockerfileを一度も触ることなくコンテナ化された環境を構築します。
小さなプロジェクトごとに複雑なCI/CDのYAMLファイルを書く必要はありません。Dokkuなら、ローカルのリポジトリにGitのリモートリポジトリを追加してプッシュするだけです。プラットフォームが重労働をすべて代行します。イメージのビルド、コンテナのライフサイクル管理、そして新しいデプロイへのトラフィックを即座にルーティングするためのNginxリバースプロキシの再設定まで自動で行われます。
個人用PaaSの前提条件
インストールを実行する前に、環境が以下の基本要件を満たしていることを確認してください。
- Ubuntu 22.04 または 24.04 が動作しているサーバー。
- 1GB以上のRAM(Dokkuならこのスペックで5〜10個の小さなコンテナを容易に実行できます)。
- 最低10GBのSSDストレージ。
- サーバーのIPを指すワイルドカードAレコード(例:
*.yourdomain.com)を持つドメイン名。
ステップ1:Dokkuのインストール
最も確実な開始方法は、公式のブートストラップスクリプトを使用することです。これにより、Docker、Dokku、および必要なコア依存関係のインストールが約5分で自動完了します。
# Dokkuのインストールスクリプトをダウンロードして実行
wget -qO- https://packagecloud.io/dokku/dokku/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/dokku.gpg
echo "deb [signed-by=/etc/apt/keyrings/dokku.gpg] https://packagecloud.io/dokku/dokku/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/dokku.list
sudo apt-get update
sudo apt-get install dokku
パッケージのインストール後、グローバルドメインを定義する必要があります。これにより、Dokkuは作成するすべてのアプリに対してサブドメインを自動生成できるようになります。
# yourdomain.com を実際のドメインに置き換えてください
sudo dokku domains:set-global yourdomain.com
ステップ2:SSHキーの追加
DokkuはデプロイにSSHを使用します。ローカルマシンがコードをプッシュする権限を持っていることをサーバーに伝える必要があります。サーバーのコンソールではなく、ローカルのターミナルからこのコマンドを実行してください。
# 'user' と 'ip-address' をサーバーの情報に置き換えてください
cat ~/.ssh/id_rsa.pub | ssh user@ip-address "sudo dokku ssh-keys:add admin"
多くの開発者がこれをスキップしてパスワード入力を求められ、イライラしているのを見かけます。キーを正しく追加することで、単純な git push だけでデプロイサイクル全体をトリガーできるようになります。
ステップ3:最初のアプリケーションを作成する
プラットフォームにはプロジェクト用の名前空間が必要です。ここでは “api-service” という名前のNode.jsアプリケーション用のプレースホルダーを作成しましょう。
# サーバー上で実行してください
dokku apps:create api-service
ステップ4:Git Push 1回でデプロイする
ローカルのプロジェクトフォルダに移動します。まだGitリポジトリになっていない場合は git init を実行してください。ここから自動化が始まります。サーバーをリモートの宛先として追加し、コードをプッシュします。
# ローカルのターミナル
git remote add dokku [email protected]:api-service
git push dokku main
ターミナルの出力に注目してください。Dokkuが言語を検出し、npm packages などの依存関係をインストールし、コンテナを起動する様子が表示されます。数秒以内に、アプリは http://api-service.yourdomain.com で公開されます。
ステップ5:データベース(PostgreSQL)の追加
ほとんどのアプリケーションは単なる静的ファイルではなく、データストアを必要とします。Dokkuは、Postgres、Redis、MariaDBなどのサービスを管理するための堅牢なプラグインシステムを備えています。
# Postgresプラグインをインストール
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
# データベースインスタンスを作成
dokku postgres:create production-db
# アプリにリンクさせる
dokku postgres:link production-db api-service
「リンク」が非常に賢い部分です。これにより DATABASE_URL 環境変数がアプリに直接注入されます。コードはこの変数を読み取って接続するだけで済むため、ソースコードにパスワードをハードコードする必要は一切ありません。
ステップ6:SSL(Let’s Encrypt)による保護
今日、HTTPSは贅沢品ではなく必須条件です。Dokkuは Let’s Encrypt プラグインを介して、SSL証明書の発行と90日ごとの更新を自動的に処理します。
# プラグインをインストール
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
# ACME通知用のメールアドレスを設定
dokku config:set --no-restart api-service [email protected]
# SSLを有効化
dokku letsencrypt:enable api-service
環境変数の管理
セキュリティのベストプラクティスとして、APIキーやシークレットはリポジトリに含めないべきです。Dokkuはこれらを config コマンドで管理します。これは、ディスク上に .env ファイルを置いておくよりもはるかに安全です。
# シークレットキーを設定
dokku config:set api-service STRIPE_KEY=sk_test_51Mz...
# すべてのアクティブな変数を表示
dokku config:show api-service
設定変数を更新するたびに、Dokkuはダウンタイムなしの再起動を実行します。古いコンテナを停止する前に、新しい設定で新しいコンテナを立ち上げます。
なぜこれがワークフローを変えるのか
手動のサーバー管理からプライベートPaaSへ移行することは、生産性を大幅に向上させます。単に月に20ドル節約するだけでなく、デプロイが退屈で再現可能な「当たり前の作業」になる、予測可能な環境を構築しているのです。
私はクライアントのプロトタイプから社内の監視ツールまで、あらゆるものにこの構成を使用しています。プロジェクトが失敗したり不要になったりした場合でも、 dokku apps:destroy api-service を実行すれば30秒で綺麗に消去できます。ゴーストプロセスも、煩雑な設定ファイルも残りません。次の素晴らしいアイデアのために準備されたクリーンなサーバーが手元に残るだけです。
まとめ
Dokkuの導入は、サイドプロジェクトの扱い方を根本から変えてくれます. Kubernetesのような複雑さを伴わずに、DockerのパワーとGitベースのワークフローのシンプルさを手に入れることができます。一度Ubuntuサーバーを設定してしまえば、システム管理者の役割を終えて、開発者に戻ることができます。機能の開発に専念し、インフラの配管作業はDokkuに任せましょう。

