Dokkuで自作PaaSを構築:Herokuのように素早くデプロイ

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

「手動設定」という苦行

新しいプロジェクトを始めるたびに、気が重くなることがあります。Dockerfileを書き、Nginxのリバースプロキシを設定し、SSL Certbotを手動でインストールするのは非常に時間がかかります。Herokuを使ったことがあるなら、git push heroku masterと打つだけで完了するあの「快適さ」をご存知でしょう。しかし、現在のHeroku of the costは決して安くありません。基本のdynoで月額7ドル、データベースやRedisを追加すれば、その費用はあっという間に膨らみます。

すべてのサイドプロジェクトをDokkuに移行して6ヶ月、もっと早く知っていればよかったと心から後悔しています。環境構築の時間を約70%削減できました。何より、サーバーでの手動設定中に入力ミスで起こるような、つまらないエラーに悩まされることがなくなりました。

Dokkuとは?なぜ使うべきなのか?

Dokkuは、自分のサーバー上で動作する「オープンソース版Heroku」です。アプリケーションをパッケージ化するDockerのパワーと、トラフィックを制御するNginxを組み合わせています。最大の魅力はBuildpacksにあります。DokkuはNode.js、Python、PHPなどのアプリケーションを自動的に判別し、手動で操作することなく適切な環境をインストールしてくれます。

実際、2GB RAMのVPS(月額約12ドル)で、5つの異なるアプリケーションを安定して動かしています。これをHerokuで運用する場合、月額料金は50ドルを超えるかもしれません。Dokkuの高度なコンテナ管理メカニズムにより、従来の個別にサービスをインストールする方法よりも、リソースをはるかに効率的に活用できます。

開始前の準備

スムーズに進めるために、以下が必要です:

  • Ubuntu 22.04 LTSが動作するVPS(最小1GB RAM)。
  • VPSのIPを指すAレコードが設定済みのドメイン。
  • セキュリティのためにローカルマシンに設定済みのSSHキー。

ステップ1:VPSにDokkuをインストールする

Dokkuの開発チームは、コマンド一行でインストールが完了するように最適化してくれています。サーバーにSSHでログインし、公式のブートストラップスクリプトを実行するだけです:

# 最新の安定版インストールスクリプトをダウンロードして実行
wget -qO- https://dokku.com/install/v0.34.x/bootstrap.sh | sudo DOKKU_TAG=v0.34.x bash

このプロセスには通常5〜10分かかります。スクリプトがDockerから必要な依存関係まで、すべてを自動で処理してくれます。待っている間にコーヒーでも淹れておきましょう。

ステップ2:SSHキーとドメインの設定

インストールが完了したら、コードをプッシュできるようにローカルマシンに権限を付与する必要があります。サーバー上ではなく、自分のPCから以下のコマンドを実行してください:

# 認証のために公開キーをサーバーにプッシュ
cat ~/.ssh/id_rsa.pub | ssh root@ip-server "dokku ssh-keys:add admin"

次に、メインドメインを設定します。これは、Dokkuが後で各アプリケーションのサブドメインを自動生成するために非常に重要です:

# このコマンドをサーバー上で直接実行
dokku domains:set-global yourdomain.com

ステップ3:アプリケーションとデータベースの作成

例えば、my-awesome-appという名前のNode.js APIを開発しているとします。複雑なディレクトリ作成やNginxの設定は不要で、数行のコマンドだけで済みます:

# 新しいアプリを作成
dokku apps:create my-awesome-app

# Postgresプラグインをインストール(初回のみ)
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git

# データベースを作成してリンク
dokku postgres:create my-db
dokku postgres:link my-db my-awesome-app

大きなメリットは、Dokkuが環境変数 DATABASE_URL をアプリケーションに自動的に注入してくれることです。コード内にデータベースのパスワードを保存する必要がないため、セキュリティリスクを最小限に抑えられます。

ステップ4:Git Pushだけでアプリケーションをデプロイ

ここで、これまでの苦労が報われる瞬間が訪れます。ローカルマシンのコードディレクトリで、リモートを追加してコードをプッシュしましょう:

git remote add dokku [email protected]:my-awesome-app
git push dokku master

ターミナル画面には、npm install から Dockerイメージのビルドまで、ログが次々と表示されます。完了すると、Dokkuは http://my-awesome-app.yourdomain.com のようなURLを表示し、すぐにアクセスできるようになります。

ステップ5:無料のSSLを有効化する

現在、HTTPS化されていないウェブサイトは大きな欠陥と言えます。Dokkuなら、Let’s Encryptによる無料のSSL設定も非常に簡単です。このプラグインには自動更新機能もあるため、完全に手間いらずです。

# Let's Encryptプラグインをインストール
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

# メールの設定と有効化
dokku config:set --no-restart my-awesome-app [email protected]
dokku letsencrypt:enable my-awesome-app

6ヶ月使用してわかった実戦でのアドバイス

Dokkuを本番環境で安定して運用するために、いくつかのアドバイスがあります:

  • リソースの監視: dokku stats コマンドを忘れずに。どのアプリが最もRAMを消費しているかを正確に把握し、適切なタイミングでVPS의 アップグレードを計画できます。
  • バックアップ戦略: データを過信しないでください。私は常に dokku postgres:exportcronジョブと組み合わせて、毎晩バックアップをS3にプッシュしています。
  • ゼロダウンタイム: Dokkuは標準でゼロダウンタイムデプロイをサポートしています。新しいコンテナがトラフィックを受け入れる準備が整ってから古いコンテナを停止するため、ユーザーに502エラーを見せることがありません。

Kubernetesのような複雑さに頭を悩ませることなく、プロフェッショナルなデプロイフローを構築したいなら、Dokkuは最良の選択肢です。シンプルで効率的、そして中小規模のプロジェクトにとって非常にコストパフォーマンスに優れています。

Share: