![見出し画像](https://assets.st-note.com/production/uploads/images/141989378/rectangle_large_type_2_be5f06303663257128532039ce7e367a.png?width=1200)
Heroku,Netlify,Vercelを再現できるDokployの使い方を解説
Dokployとは?
Dokployは、HerokuやNetlify、VercelのようなホスティングサービスをVPS上に構築できるOSSです。2024年4月に最初のリリースがされたばかりの新しいOSSになります。
このようなOSSは他にもあり、それらとの比較表を見ると、Docker composeやマルチノードをサポートしていなかったり、課金によるクラウドでの使用バージョンがないという欠点がありますが、GithubのIssueで将来的にDocker composeやマルチノードは対応するとあるので、期待できるOSSだと感じました。
![](https://assets.st-note.com/img/1716776214327-tCPBPNRGM7.png?width=1200)
今回は、このDokployでホスティングサービスの環境を再現し、簡単なAPIを動作させたいと思います。
システム環境
今回は、DigitalOceanでVPSを借り、その上にDokployの環境を構築しました。
今回使用した環境やフレームワークを以下に記載します。
DigitalOcean: Droplets
CPU: Regular, 2GB/1CPU, 50GB SSD Disk, 2TB transfer
OS: Ubuntu 20.04 (LTS)
![](https://assets.st-note.com/img/1716777052844-Qu2FIJtn2K.png)
Github
API: Python FastAPI
Docker
ドメイン(お名前ドットコム)
1. コード準備
今回は、APIのコードをPythonのFastAPIで実装します。これをDockerでデプロイするためにDockerfileも準備します。最終的なファイル構成とファイルの中身は以下の通りです。
![](https://assets.st-note.com/img/1716788101891-ZAuQNlxmon.png)
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を選択
![](https://assets.st-note.com/img/1716777773995-a8dNtFJ2XS.png?width=1200)
Reagionは、初期値のNew Yorkにしました。
![](https://assets.st-note.com/img/1716777900690-XMADSC7ZwZ.png?width=1200)
OSは、Ubuntuの20.04(LTS)を選択します。
Dokployでテスト済みのOSとバージョンは、2024年5月27日現在で以下になるため、今回はUbuntu 20.04(LTS)を選択しました。
Ubuntu 20.04
Debian 11
Fedora 40
Centos 9
![](https://assets.st-note.com/img/1716777922010-JkCHPm6627.png?width=1200)
CPUは、月12ドルの「Regular, 2GB/1CPU, 50GB SSD Disk, 2TB transfer」を選択します。
Dokployのドキュメントに記載されている必要環境には、RAM 2GB、ディスク容量30GBとなっているため、その要件を満たすスペックの中で最も安いプランを選択しました。
![](https://assets.st-note.com/img/1716778058887-xEa8VfiI53.png?width=1200)
認証方法はSSHを選択。パスワードでも動作確認できますが、より安全な方を選択しました。SSHの設定方法は、以下の記事をご参照ください。
![](https://assets.st-note.com/img/1716778218223-Uslj02pgTl.png?width=1200)
好きなHostnameを入力し、[Create Droplet]を押下します。
![](https://assets.st-note.com/img/1716778306871-jUgpLVFRPN.png?width=1200)
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を以下のように修正しました。修正点は次の通りです。
docker swarm initコマンドに--advertise-addrオプションを追加する。
docker network rm -f dokploy-networkの-fオプションを削除する。
docker networkがなかった場合、新規作成する
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」という形でアクセス先が表示されるので、ブラウザでアクセスします。
最初にユーザー登録画面が表示されるので、メールアドレスとパスワードを設定してください。
![](https://assets.st-note.com/img/1716780222485-7xeD9FjviS.png?width=1200)
ドメイン設定
ログインしましたら、Settingsタブを選択し、Server Domainに先ほどAレコードを設定した管理画面用のドメイン(web.example.com)を設定します。
その他にLetsencrypt Emailに適当なメールアドレス(ユーザー登録したメールアドレスで問題ない)を入力し、CertificateにLetsencryptを選択し、Saveを押下します。
しばらくすると、SSL証明書の自動取得が完了し、https://web.example.com
で管理画面にアクセスできるようになります。
![](https://assets.st-note.com/img/1716780525074-yXoIIPLTcH.png?width=1200)
6. プロジェクト/アプリケーションの作成・設定
プロジェクト作成
次にProjectsタブを選択し、Create Projectを押下します。
![](https://assets.st-note.com/img/1716787871415-AMG6qXW2GM.png?width=1200)
表示されたダイアログにプロジェクト名を入力し、Createを押下します。
![](https://assets.st-note.com/img/1716787908956-hspVrPITAd.png?width=1200)
アプリケーション作成
作成されたプロジェクトに入り、Create Serviceを押下すると、Actionsが表示されるので、Applicationを選択します。
![](https://assets.st-note.com/img/1716788340169-D5RUx0m8Hv.png?width=1200)
表示されたダイアログからサービス名を入力し、Createを押下します。
![](https://assets.st-note.com/img/1716788444424-taDCsraEog.png?width=1200)
ドメイン設定
サーバーのドメイン設定と同様に、アプリケーションのドメイン設定を行います。Domainsタブを選択し、Add Domainを押下します。
![](https://assets.st-note.com/img/1716789268743-igZLE6UiDs.png?width=1200)
表示されたダイアログから必要な情報を入力します。今回は、Hostにapi.example.com、PathとContainer Portは初期のまま、CertificateにLetsencrypt、HTTPSをONにしています。完了したら、Createを押下します。
![](https://assets.st-note.com/img/1716789302379-ek68nn1A7t.png?width=1200)
デプロイ設定
Generalタブを選択し、Providerの設定をします。今回はGithub経由でデプロイするので、Githubを選択し、コードが格納されているリポジトリーとブランチを選択し、Saveを押下します。
![](https://assets.st-note.com/img/1716788827995-A8Rh0Uwq7c.png?width=1200)
次にBuild TypeからDockerfileを選択し、Docker Fileの配置場所を記載します。今回は、ルートディレクトリにDockerfileを配置しているので、そのままDockerfileとだけ入力します。最後にSaveを押下します。
![](https://assets.st-note.com/img/1716789081193-8WcV6Qarxm.png?width=1200)
7. デプロイ
最後にGeneralタブのDeploy SettingsからDeployを押下し、デプロイを実行します。しばらくすると、デプロイが完了するので、ドメイン設定で設定したドメインにアクセスすると、しっかりHello Worldと表示されることが確認できました。
![](https://assets.st-note.com/img/1716789734138-ygZgqJpykj.png)
簡単にホスティングサービスと同じ環境を構築できる
今回は、APIを作成しただけですが、Dokployでは各種データベースもサポートしているので、しっかりしたWebアプリを構築することができます。
VPS環境さえ用意すれば、Dokployをインストールするだけで実現できるので、コストを抑えつつHerokuやNetlifyのような環境を用意したい人にお勧めです。
まだリリースしたばかりで、バージョンも0.0.4なので、これからの発展が楽しみですね。
![](https://assets.st-note.com/img/1718422654914-vcdGuseX1c.png?width=1200)
弊社では、システム開発および導入支援を専門としています。最新の技術と豊富な経験を活かし、お客様のニーズに合わせた最適なソリューションを提供いたします。効率的なシステム導入や業務の自動化をお考えの方は、ぜひ弊社にご相談ください。お客様のビジネスの成長を全力でサポートいたします。
サービス内容
システム開発: オーダーメイドのシステム開発で、ビジネスの効率化を実現します。
導入支援: 新システムの導入から運用サポートまで、トータルでサポートいたします。
コンサルティング: ビジネスプロセスの最適化やDX(デジタルトランスフォーメーション)、生成AIの活用を支援します。
お問い合わせは、以下のリンクからどうぞ。
無料相談も受け付けております。
この記事が気に入ったらサポートをしてみませんか?