Google CloudでDifyをデプロイする完全ガイド
Google CloudでDifyをデプロイする方法
この記事では、DifyをGoogle Cloud上にデプロイする手順を解説します。この構成を採用することで、以下の利点を享受できます。
- インターネット上で外部公開: Cloud Runを使用してHTTPS通信を提供します。
- コスト削減: Spot VMを使用することで低価格運用を実現。
- 柔軟な運用: 必要に応じてVMを停止し、コストを最小限に抑えます(ディスク代は除く)。
デプロイ手順は以下の通りです。
手順概要
-
Spot VMを立ち上げる
Spot VM上でDockerを動作させ、DifyのDockerコンテナを起動します。 -
Cloud Runをリバースプロキシとして設定
Nginxを使用してSpot VMにリクエストを転送します。
1. Spot VMの作成とDifyのセットアップ
Step 1: Spot VMをデプロイする
以下のコマンドでSpot VMを作成し、VM内でDifyを起動させます。
gcloud compute instances create dify-spotvm \
--zone=asia-northeast1-c \
--machine-type=e2-medium \
--network-tier=STANDARD \
--provisioning-model=SPOT \
--no-restart-on-failure \
--metadata=startup-script='
sudo apt-get update
sudo apt-get install -y \
vim \
curl \
ca-certificates \
procps \
netcat-openbsd \
net-tools \
supervisor \
git \
pkg-config \
cron \
build-essential \
python-dev-is-python3 \
ufw
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
sudo mkdir /github
sudo git clone https://github.com/langgenius/dify.git /github/dify
sudo /usr/bin/cp /github/dify/docker/.env.example /github/dify/docker/.env
sudo docker-compose -f /github/dify/docker/docker-compose.yaml up -d
'
VMの起動確認はこちらで確認できます。
Step 2: Spot VMの内部IPアドレスを取得する
Spot VMの内部IPを取得します。内部IPはリバースプロキシの設定で使います。
gcloud compute instances describe "dify-spotvm" \
--zone=asia-northeast1-c \
--format='get(networkInterfaces[0].networkIP)'
これで1. Spot VMの作成とDifyのセットアップ
は完了です。
2. Cloud Runをリバースプロキシとしてデプロイ
Cloud Runを使って、Difyを外部に公開するリバースプロキシを作成します。
Step 1: 必要なファイルを作成
Dockerfile
以下のDockerfileを作成します。
FROM nginx:alpine
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
default.conf
内部IPを取得したら、そのIPをproxy_pass
に設定します。
[取得した内部IP]
の部分を置き換えてください。
server {
listen 0.0.0.0:8080;
server_name _;
client_max_body_size 100M;
location / {
proxy_pass http://[取得した内部IP];
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
Step 2: cloud_run.deploy.shを作成
以下のスクリプトファイルcloud_run.deploy.sh
を用意します。
#!/bin/bash
# エラーハンドリングとデバッグ情報の設定
set -euo pipefail
trap 'echo "エラーが発生しました。スクリプトを終了します。"' ERR
# プロジェクトIDの取得
PROJECT_ID=${1:-$(gcloud config get-value project 2>/dev/null)}
if [ -z "$PROJECT_ID" ];then
echo "プロジェクトIDが設定されていません。引数として指定するか、gcloud のデフォルトプロジェクトを設定してください。"
echo "usage: $0 [プロジェクトID]"
exit 1
fi
# タイムスタンプをタグに設定(ISO 8601形式)
TAG=$(date +%Y%m%d-%H%M%S)
echo "タグ: ${TAG}"
IMAGE_URI="asia-northeast1-docker.pkg.dev/${PROJECT_ID}/dify-repo/dify-proxy:${TAG}"
echo "イメージURI: ${IMAGE_URI}"
echo "Dockerイメージをビルドしています..."
docker build --platform linux/amd64 --no-cache -t "${IMAGE_URI}" .
echo "Artifact RegistryにPushしています..."
docker push "${IMAGE_URI}"
echo "Cloud Run にデプロイしています..."
gcloud run deploy dify-proxy \
--image ${IMAGE_URI} \
--platform managed \
--region asia-northeast1 \
--allow-unauthenticated \
--timeout=900s \
--port 8080 \
--network default \
--subnet default
echo "デプロイが完了しました。"
Step 3: スクリプトを実行してデプロイ
上記スクリプトを実行してCloud Runをデプロイします。
./cloud_run.deploy.sh
デプロイされたCloud Runはこちらで確認できます。
Step 4: Difyにブラウザからアクセスする
以下のコマンドでdeployされたCloud RunのURLを取得します。
gcloud run services describe dify-proxy \
--platform managed \
--region asia-northeast1 \
--format 'value(status.url)'
[取得したURL]/install
にアクセスしてセットアップを進めてください。
3. 必要がなくなった時の削除手順
Difyが必要なくなった場合、関連リソースを削除する方法を以下に記載します。
Spot VMの削除
gcloud compute instances delete dify-spotvm --zone=asia-northeast1-c
Cloud Runの削除
gcloud run services delete dify-proxy --region=asia-northeast1
Artifact Registryのイメージファイル削除
Artifact Registryのページこちらで不要なイメージを削除してください。
4. Spot VMの自動運用スクリプト
Spot VMは意図せず勝手に停止するので、稼働状況を監視して停止していたら起動させます。また、稼働させる時間を指定することでコストを抑えます。
次のPythonスクリプトをmacのcrontabに仕込んでおくと便利です。
cron_instance_check.py
以下のスクリプトを作成します。
[プロジェクトID]
は置き換えてください。
import subprocess
from datetime import datetime
current_hour = datetime.now().hour
zone = "asia-northeast1-c"
project = "[プロジェクトID]"
instance_name = "dify-spotvm"
def get_instance_status():
command = [
"gcloud", "compute", "instances", "describe", instance_name,
"--zone=" + zone, "--format=get(status)"
]
result = subprocess.run(command, capture_output=True, text=True)
output = result.stdout.strip()
return output if output else None
status = get_instance_status()
# 朝7時から夜2時まで動かす
if 7 <= current_hour < 2:
if status != "RUNNING":
subprocess.run(["gcloud", "compute", "instances", "start", instance_name, "--zone=" + zone])
else:
if status == "RUNNING":
subprocess.run(["gcloud", "compute", "instances", "stop", instance_name, "--zone=" + zone])
このスクリプトをmacのcrontabに登録します。
* * * * * python cron_instance_check.py > cron_instance_check.log 2>&1
以上でGoogle Cloudを活用したDifyのデプロイ方法の解説を終了します。
Spot VMを活用することでコストを抑えつつ、柔軟に運用できる構成を構築できます。
Discussion