🐳

なんでも1つのVPS上でデプロイできるOSS「Dokploy」を推したい

に公開

DokployでNext.jsアプリをセルフホスティング ~独自ドメイン・HTTPS・Basic認証も簡単デプロイ~

TL;DR


Dokployとは?

リンクをクリックしてアプリをデプロイする。VercelやHerokuでは当たり前のこの体験を、自前のVPSで実現できないか?

Dokployは、そんな要望に応えるオープンソースのセルフホスティング型PaaSです[1]。自分で用意したサーバー上に、HerokuやVercelのようなアプリケーションプラットフォーム環境を構築できます。

Dokployを使うと、Node.jsやPythonなどさまざまな言語のアプリケーションやデータベースをDockerコンテナで簡単にデプロイ・管理できます[2]。インフラの専門知識がなくても、Web GUIからデプロイやスケール、ドメイン設定、監視などが可能です。

Nixpacksとは?

Nixpacksは、ソースコードから必要なランタイムや依存パッケージを解析し、自動的にコンテナイメージを作成してくれるオープンソースのビルドツールです[3]。Railway社が開発し公開したもので、言語ごとのビルド手順が組み込まれているため、多くの場合は設定ファイルなしで「とりあえずデプロイが動く」ことを目指しています。

例えばNode.jsプロジェクトであれば、Nixpacksが自動でpackage.jsonを検出し、Nodeのバージョンやビルドコマンド(npm run buildなど)を推測してDockerイメージをビルドしてくれます。


アーキテクチャ概要

Dokployは内部でDockerとTraefik(トラフィック)というリバースプロキシを活用しています[4]

TraefikがアプリのルーティングやHTTPS化を自動化してくれるため、独自ドメインの設定やSSL証明書の取得がとても簡単になっています。


インストールと初期セットアップ

サーバー要件

Dokployを動かすには、UbuntuやDebian系のLinuxサーバーが必要です。公式ドキュメントでは最低2GBのRAMと30GB程度のストレージを推奨しています[5]。Docker未導入でもスクリプトが自動でセットアップしてくれます。

インストール

ターミナルで以下のコマンドを実行するだけで完了します。

curl -sSL https://dokploy.com/install.sh | sh

インストール後、DokployのWeb管理画面はデフォルトでサーバーのポート3000で立ち上がります。

# 動作確認
curl http://localhost:3000

ブラウザで http://<あなたのサーバーIP>:3000 にアクセスすると、初期セットアップ画面が表示されます。管理者ユーザーの作成を求められるので、指示に従ってユーザー名・パスワードを設定しましょう。


Next.jsアプリをデプロイしてみる

デプロイの流れ

実際の手順は以下のとおりです。

1. プロジェクトの作成

Dokployダッシュボードで「Create Project」をクリックし、プロジェクト(例:「Nextjs-App」など)を新規作成します。プロジェクトとはアプリやデータベースなど関連するサービスをまとめるグループのようなものです。

2. サービス(アプリケーション)の作成

作成したプロジェクト内で「+ Create Service」をクリックし、サービスの種類として「Application」を選択します[6]

3. リポジトリの連携

アプリケーションの設定画面で、デプロイ元となるGitリポジトリを指定します。「Provider」としてGitHubを選択し、リポジトリのURLとブランチ名(例:main)を入力します[7]。プライベートリポジトリの場合はDokployにSSHキーを登録し、GitHub側にその公開鍵を追加する必要があります。

4. デプロイの実行

リポジトリを設定したら、「Deploy」を実行します。Dokployが自動的にソースコードをクローンし、Nixpacksを用いてビルドを開始します。

# Dokployが内部で実行するイメージ(実際はGUIから操作)
# nixpacks build . --name my-nextjs-app
# docker run -d my-nextjs-app

ビルドログはリアルタイムでGUI上に表示され、エラーがあればログから原因を確認できます。無事ビルドとデプロイが完了すると、アプリケーションがDokployサーバー上で起動します。


Auto Deploy(自動デプロイ)を設定する

GitHubにプッシュしたら自動で再デプロイしてほしい。その要望に応えるのがAuto Deploy機能です[8]

設定方法は以下のとおりです。

1. DokployでAuto Deployを有効化

アプリケーション設定画面でAuto Deployをオンにすると、Webhook用のURLが発行されます[9]

2. GitHubにWebhookを登録

GitHubリポジトリの「Settings」→「Webhooks」→「Add webhook」から、Dokployで発行されたURLを登録します。

Payload URL: https://your-dokploy-domain.com/api/webhook/xxxxx
Content type: application/json

これで以後、該当ブランチへコミットをプッシュするたびに自動で最新コードがデプロイされます。


独自ドメインの設定とHTTPS化

ドメイン設定の流れ

具体的な手順は以下のとおりです。

1. ドメインのDNS設定

お名前.comやCloudflareなど、お使いのドメイン管理サービスで、DokployサーバーのIPアドレスにAレコードをポイントします。

DNSレコード設定例
タイプ: A
名前: app
値: 123.456.789.012(VPSのIPアドレス)
TTL: 300

2. Dokploy側でドメイン追加

対象アプリケーション設定画面の「Domains」セクションで「Add Domain」をクリックし、独自ドメイン(例:app.example.com)を入力します[11]。ルーティング先のコンテナ内部ポートも指定します。Next.jsのBuildタイプがStaticやNixpacksの場合はポート80を指定してください[12]

3. HTTPSの有効化

ドメイン設定で「HTTPS」を有効にします。DokployはLet’s Encryptによる無料のSSL証明書発行を自動で行うため、チェックボックスをオンにするだけでHTTPS化できます[13]

# 設定後、動作確認
curl -I https://app.example.com
# HTTP/2 200 が返ってくればOK

証明書は自動更新されるため、一度設定してしまえばメンテナンスフリーです。

traefik.meドメインを使った動作確認

独自ドメインがまだ用意できていない場合でも、Dokployにはデフォルトで *.traefik.me ドメインの利用機能があります[14]。Dokploy画面から「Generate Domain」を押すと、一時的なURLが自動生成されます。ただしこのドメインはHTTPのみで、HTTPSを有効にするには証明書を別途用意する必要があります[15]


Basic認証をかける

ステージング環境なので認証をかけたい、といったケースに便利なのがBasic認証機能です。

対象のアプリケーション設定画面で「Advanced」タブ内の「Security」セクションを開きます。ユーザー名とパスワードを設定して保存するだけで即座に反映されます[16]

# 設定後のアクセス時
curl https://app.example.com
# → 401 Unauthorized

curl -u username:password https://app.example.com
# → 200 OK

この機能もTraefikのリバースプロキシで実現されており、アプリ側の実装変更なしに簡易認証を追加できます。


テンプレート機能でSupabaseを一発デプロイ

Dokployには、自分のアプリ以外にも便利なテンプレート(ひな形)が多数用意されています[17]。WordPressやGhost、Plausible、Supabaseといったオープンソースソフトウェアをワンクリックでデプロイできる機能です。

私もテンプレート機能からSupabaseをデプロイしてみました。SupabaseはFirebaseのオープンソース代替となるBaaSで、PostgreSQLデータベースと認証・ストレージ機能がセットになったものです。通常、公式Docker Composeなどで複数コンテナを立ち上げる必要がありますが、Dokployならテンプレート経由で数分で完了しました。

コンテナ同士のネットワークや依存関係もDokployが適切に配置してくれるため、Supabaseをデプロイするだけでpostgres、kong、gotrue、studio等の必要なコンポーネントがまとめて起動します。


もうちょっと深掘ってみた

ここからは、Dokployの内部実装やTraefikの仕組みについて掘り下げていきます。

TraefikによるHTTPS自動化の仕組み

TraefikはDokployが採用しているリバースプロキシで、Let’s Encryptとの連携によるHTTPS自動化を実現しています[19]

TraefikはACME(Automatic Certificate Management Environment)プロトコルを使用してLet’s Encryptから証明書を自動取得します[20]。HTTP-01チャレンジという方式で、ドメインの所有権を確認した後に証明書が発行されます。

証明書の有効期限は90日ですが、Traefikは有効期限の30日前から自動更新を試みるため、手動での更新作業は不要です。

NixpacksによるDockerイメージ自動生成

Nixpacksは以下の流れでソースコードからDockerイメージを生成します[21]

Next.jsプロジェクトの場合、Nixpacksは以下のように動作します。

# Nixpacksが内部で検出する内容(イメージ)
# 
# 1. package.json を発見 → Node.jsプロジェクトと判定
# 2. package.json の "scripts.build" を確認 → "next build" を検出
# 3. .node-version や package.json の engines を確認 → Nodeバージョン決定
# 4. 自動生成されるDockerfile(概念):
#
#    FROM node:20-alpine
#    WORKDIR /app
#    COPY package*.json ./
#    RUN npm ci
#    COPY . .
#    RUN npm run build
#    CMD ["npm", "start"]

Nixpacksは nixpacks.toml ファイルでカスタマイズも可能です。

nixpacks.toml
[phases.setup]
nixPkgs = ["nodejs-18_x"]

[phases.build]
cmds = ["npm ci", "npm run build"]

[start]
cmd = "npm start"

Docker Swarmによるマルチノード構成

DokployはDocker Swarmによるマルチノード・クラスタ構成もサポートしています[22]。複数のサーバーをクラスタとして束ね、負荷分散や可用性を高めることができます。

Swarmモードを有効にすると、アプリケーションのレプリカ数を指定して複数のワーカーノードに分散配置できます。Traefikが自動的にロードバランシングを行うため、追加の設定は最小限で済みます。


まとめ

Dokployの理解チェック

以下の質問に答えられますか?

Q1: DokployがDockerfileなしでアプリをデプロイできるのはなぜ?

答えを見る

Nixpacksが、ソースコードから言語やフレームワークを自動検出し、適切なDockerイメージを生成してくれるためです。package.jsonrequirements.txtなどのファイルを解析し、必要なランタイムや依存関係を自動で設定します。

Q2: Dokployで独自ドメインのHTTPS化が簡単にできる理由は?

答えを見る

内部でTraefikリバースプロキシを使用しており、TraefikがACMEプロトコルを通じてLet’s Encryptから自動的にSSL証明書を取得・更新してくれるためです。ユーザーはチェックボックスをオンにするだけで済みます。

Q3: Auto Deploy機能を使うには何を設定する必要がある?

答えを見る

DokployでAuto Deployを有効化して発行されたWebhook URLを、GitHubリポジトリの「Settings」→「Webhooks」に登録します。これにより、指定したブランチへのプッシュ時に自動でデプロイが実行されます。

実際に試してみよう

この記事の内容を理解するには、実際に手を動かすのが一番です。

# 1. VPSにDokployをインストール
curl -sSL https://dokploy.com/install.sh | sh

# 2. ブラウザでアクセス
# http://<VPSのIP>:3000

# 3. 管理者アカウントを作成

# 4. Create Project → Create Service → Application

# 5. GitHubリポジトリを連携してDeploy!

参考文献

脚注
  1. GitHub - Dokploy/dokploy: Open Source Alternative to Vercel, Netlify and Heroku. ↩︎

  2. Dokploy公式ドキュメント - Database Management ↩︎

  3. Nixpacks公式ドキュメント - Introduction ↩︎

  4. Dokploy公式サイト - Traefik Integration ↩︎

  5. Dokploy公式ドキュメント - Requirements ↩︎

  6. Dokploy公式ドキュメント - Applications ↩︎

  7. Dokploy公式ドキュメント - Git Provider ↩︎

  8. Dokploy公式ドキュメント - Auto Deploy ↩︎

  9. Dokploy公式ドキュメント - Webhook Configuration ↩︎

  10. Dokploy公式ドキュメント - Troubleshooting Auto Deploy ↩︎

  11. Dokploy公式ドキュメント - Domains ↩︎

  12. Dokploy公式ドキュメント - Port Configuration ↩︎

  13. Dokploy公式ドキュメント - HTTPS / SSL ↩︎

  14. Dokploy公式ドキュメント - Generated Domains ↩︎

  15. Dokploy公式ドキュメント - traefik.me Limitations ↩︎

  16. Dokploy公式ドキュメント - Security Settings ↩︎

  17. Dokploy公式ドキュメント - Templates ↩︎

  18. Dokploy公式ドキュメント - Available Templates ↩︎

  19. Traefik公式ドキュメント - HTTPS & TLS ↩︎

  20. Traefik公式ドキュメント - ACME (Let’s Encrypt) ↩︎

  21. Nixpacks公式ドキュメント - How It Works ↩︎

  22. Dokploy公式ドキュメント - Docker Swarm ↩︎

Discussion