見出し画像

Heroku,Netlify,Vercelを再現できるDokployの使い方を解説


Dokployとは?

Dokployは、HerokuやNetlify、VercelのようなホスティングサービスをVPS上に構築できるOSSです。2024年4月に最初のリリースがされたばかりの新しいOSSになります。

このようなOSSは他にもあり、それらとの比較表を見ると、Docker composeやマルチノードをサポートしていなかったり、課金によるクラウドでの使用バージョンがないという欠点がありますが、GithubのIssueで将来的にDocker composeやマルチノードは対応するとあるので、期待できるOSSだと感じました。

競合OSSとの機能比較表

今回は、このDokployでホスティングサービスの環境を再現し、簡単なAPIを動作させたいと思います。

システム環境

今回は、DigitalOceanでVPSを借り、その上にDokployの環境を構築しました。
今回使用した環境やフレームワークを以下に記載します。

  • DigitalOcean: Droplets

    • CPU: Regular, 2GB/1CPU, 50GB SSD Disk, 2TB transfer

    • OS: Ubuntu 20.04 (LTS)

レンタルしたサーバースペック
  • Github

  • Dokploy

  • API: Python FastAPI

  • Docker

  • ドメイン(お名前ドットコム)

1. コード準備

今回は、APIのコードをPythonのFastAPIで実装します。これをDockerでデプロイするためにDockerfileも準備します。最終的なファイル構成とファイルの中身は以下の通りです。

ファイル構成

main.py

// main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

requirements.txt

fastapi
uvicorn

Dockerfile

# ベースイメージとして公式のPythonイメージを使用
FROM python:3.10.4-slim

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのソースコードをコピー
COPY . .

# アプリケーションを起動するためのコマンド
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "3000"]

これらのコードをGithubのレポジトリーにプッシュしておきます。今回は、Github経由でコードをデプロイします。

2. VPS環境構築

Droplets->Create Dropletを選択

Reagionは、初期値のNew Yorkにしました。

OSは、Ubuntuの20.04(LTS)を選択します。
Dokployでテスト済みのOSとバージョンは、2024年5月27日現在で以下になるため、今回はUbuntu 20.04(LTS)を選択しました。

  • Ubuntu 20.04

  • Debian 11

  • Fedora 40

  • Centos 9

CPUは、月12ドルの「Regular, 2GB/1CPU, 50GB SSD Disk, 2TB transfer」を選択します。
Dokployのドキュメントに記載されている必要環境には、RAM 2GB、ディスク容量30GBとなっているため、その要件を満たすスペックの中で最も安いプランを選択しました。

認証方法はSSHを選択。パスワードでも動作確認できますが、より安全な方を選択しました。SSHの設定方法は、以下の記事をご参照ください。

好きなHostnameを入力し、[Create Droplet]を押下します。

3. Dokployのインストール

作成したDropletにSSHでログインし、コンソールで以下のコマンドを入力すると、自動でDokployのインストールを行なってくれます。(Dockerも一緒にインストールしてくれます)

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

ここで、私の場合は、以下の2つのエラーが発生し、インストールが上手くいきませんでした。

Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on interface eth0 (157.230.0.234 and 10.10.0.5) - specify one with --advertise-addr
Error response from daemon: network dokploy-network not found

そこで、install.shを以下のように修正しました。修正点は次の通りです。

  1. docker swarm initコマンドに--advertise-addrオプションを追加する。

  2. docker network rm -f dokploy-network-fオプションを削除する。

  3. docker networkがなかった場合、新規作成する

  4. docker service createコマンドの前に、Swarmが初期化されていることを確認する。

#!/bin/bash

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" >&2
    exit 1
fi

# check if is Mac OS
if [ "$(uname)" = "Darwin" ]; then
    echo "This script must be run on Linux" >&2
    exit 1
fi

# check if is running inside a container
if [ -f /.dockerenv ]; then
    echo "This script must be run on Linux" >&2
    exit 1
fi

# check if something is running on port 80
if ss -tulnp | grep ':80 ' >/dev/null; then
    echo "Error: something is already running on port 80" >&2
    exit 1
fi

# check if something is running on port 443
if ss -tulnp | grep ':443 ' >/dev/null; then
    echo "Error: something is already running on port 443" >&2
    exit 1
fi

command_exists() {
  command -v "$@" > /dev/null 2>&1
}

if command_exists docker; then
  echo "Docker already installed"
else
  curl -sSL https://get.docker.com | sh
fi

docker swarm leave --force 2>/dev/null
docker swarm init --advertise-addr 157.230.0.234

echo "Swarm initialized"

# Check if dokploy-network exists, if not, create it
if ! docker network ls | grep -q dokploy-network; then
  docker network create --driver overlay --attachable dokploy-network
  echo "Network created"
else
  echo "Network dokploy-network already exists"
fi

mkdir -p /etc/dokploy

chmod -R 777 /etc/dokploy

docker pull dokploy/dokploy:latest

# Installation
docker service create \
  --name dokploy \
  --replicas 1 \
  --network dokploy-network \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  --mount type=bind,source=/etc/dokploy,target=/etc/dokploy \
  --publish published=3000,target=3000,mode=host \
  --update-parallelism 1 \
  --update-order stop-first \
  dokploy/dokploy:latest

public_ip=$(hostname -I | awk '{print $1}')

GREEN="\033[0;32m"
YELLOW="\033[1;33m"
BLUE="\033[0;34m"
NC="\033[0m" # No Color

echo ""
printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n"
printf "${BLUE}Wait 15 seconds for the server to start${NC}\n"
printf "${YELLOW}Please go to http://${public_ip}:3000${NC}\n\n"
echo ""

修正後のinstall.shを実行することで、インストールが成功しました。

4. DNSレコードの設定

Dokployを運用するには、ドメインが必要になります。私は、お名前ドットコムで取得済みで未使用のドメインがあったので、そのドメインを利用しました。

ドメイン取得したサイトで、Aレコードの設定をします。Aレコードは、Dokployの管理画面用のドメイン(サブドメイン)と、API用のドメイン(サブドメイン)に対して設定が必要です。管理画面用のドメインがweb.example.com、API用のドメインがapi.example.com、サーバーのIPアドレスが1.2.3.4だとした場合、以下のような設定になります。

  • Aレコード | web.example.com | 1.2.3.4

  • Aレコード | api.example.com | 1.2.3.4

5. Dokployの環境設定

ユーザー登録

インストールに成功すると、コンソールに「http://[サーバーのIPアドレス]:3000」という形でアクセス先が表示されるので、ブラウザでアクセスします。
最初にユーザー登録画面が表示されるので、メールアドレスとパスワードを設定してください。

ドメイン設定

ログインしましたら、Settingsタブを選択し、Server Domainに先ほどAレコードを設定した管理画面用のドメイン(web.example.com)を設定します。
その他にLetsencrypt Emailに適当なメールアドレス(ユーザー登録したメールアドレスで問題ない)を入力し、CertificateにLetsencryptを選択し、Saveを押下します。
しばらくすると、SSL証明書の自動取得が完了し、https://web.example.com
で管理画面にアクセスできるようになります。

6. プロジェクト/アプリケーションの作成・設定

プロジェクト作成

次にProjectsタブを選択し、Create Projectを押下します。

表示されたダイアログにプロジェクト名を入力し、Createを押下します。

アプリケーション作成

作成されたプロジェクトに入り、Create Serviceを押下すると、Actionsが表示されるので、Applicationを選択します。

表示されたダイアログからサービス名を入力し、Createを押下します。

ドメイン設定

サーバーのドメイン設定と同様に、アプリケーションのドメイン設定を行います。Domainsタブを選択し、Add Domainを押下します。

表示されたダイアログから必要な情報を入力します。今回は、Hostにapi.example.com、PathとContainer Portは初期のまま、CertificateにLetsencrypt、HTTPSをONにしています。完了したら、Createを押下します。

デプロイ設定

Generalタブを選択し、Providerの設定をします。今回はGithub経由でデプロイするので、Githubを選択し、コードが格納されているリポジトリーとブランチを選択し、Saveを押下します。

次にBuild TypeからDockerfileを選択し、Docker Fileの配置場所を記載します。今回は、ルートディレクトリにDockerfileを配置しているので、そのままDockerfileとだけ入力します。最後にSaveを押下します。

7. デプロイ

最後にGeneralタブのDeploy SettingsからDeployを押下し、デプロイを実行します。しばらくすると、デプロイが完了するので、ドメイン設定で設定したドメインにアクセスすると、しっかりHello Worldと表示されることが確認できました。

簡単にホスティングサービスと同じ環境を構築できる

今回は、APIを作成しただけですが、Dokployでは各種データベースもサポートしているので、しっかりしたWebアプリを構築することができます。
VPS環境さえ用意すれば、Dokployをインストールするだけで実現できるので、コストを抑えつつHerokuやNetlifyのような環境を用意したい人にお勧めです。
まだリリースしたばかりで、バージョンも0.0.4なので、これからの発展が楽しみですね。


弊社では、システム開発および導入支援を専門としています。最新の技術と豊富な経験を活かし、お客様のニーズに合わせた最適なソリューションを提供いたします。効率的なシステム導入や業務の自動化をお考えの方は、ぜひ弊社にご相談ください。お客様のビジネスの成長を全力でサポートいたします。

サービス内容

  • システム開発: オーダーメイドのシステム開発で、ビジネスの効率化を実現します。

  • 導入支援: 新システムの導入から運用サポートまで、トータルでサポートいたします。

  • コンサルティング: ビジネスプロセスの最適化やDX(デジタルトランスフォーメーション)、生成AIの活用を支援します。

お問い合わせは、以下のリンクからどうぞ。
無料相談も受け付けております。


この記事が気に入ったらサポートをしてみませんか?