🚀

Google CloudでDifyをデプロイする完全ガイド

2025/02/17に公開

Google CloudでDifyをデプロイする方法

この記事では、DifyをGoogle Cloud上にデプロイする手順を解説します。この構成を採用することで、以下の利点を享受できます。

  • インターネット上で外部公開: Cloud Runを使用してHTTPS通信を提供します。
  • コスト削減: Spot VMを使用することで低価格運用を実現。
  • 柔軟な運用: 必要に応じてVMを停止し、コストを最小限に抑えます(ディスク代は除く)。

デプロイ手順は以下の通りです。


手順概要

  1. Spot VMを立ち上げる
    Spot VM上でDockerを動作させ、DifyのDockerコンテナを起動します。
  2. 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