XServer VPSでDifyをセルフホストする実践ガイド

ノーコードで生成AIアプリを開発できる『Dify(ディフィー)』。

VPSにセルフホストすることで、データの機密性を高められるなど、SaaS版よりセキュアなDify環境を構築可能です。

本記事では、VPSでDifyを「手軽にセルフホストする方法」と「セキュアにセルフホストする方法」それぞれの実践的な手順を解説します。

本記事で分かること
  • Difyをセルフホストするメリット
  • 手軽にDifyをセルフホストする手順
  • セキュアなDify環境を構築する手順

本記事を参考にして、目的や用途に合った方法でVPS上にDifyをセルフホストしてみてください。

VPSでDifyをセルフホストするメリット

VPSでDifyをセルフホストするメリットは、主に以下の3つです。

VPS上でデータを管理できる

VPSでセルフホストすれば、AIアプリの開発や運用にあたって、データがDifyの運営会社(LangGenius社)に送信されることはありません。

VPS上でデータを管理できるため、「LangGenius社」に委ねることなく、主体的に情報漏洩などのリスクへの対策ができます。

画像:SaaS版とセルフホスト版のデータ管理の違い

以下は、SaaS版の利用にあたり、「LangGenius社」のクラウドに送信されるデータの一例です。

外部に送信されるデータの一例
  • 生成AIに学習させるドキュメント(ナレッジ)
  • 生成AIへの指示内容(プロンプト)
  • 生成AIからの返答内容
  • LLM(ChatGPTやGeminiなど)のAPIキー
  • Difyのアカウント情報(ユーザー名やパスワードなど)

たとえば、特定の用途に特化したAIアプリの開発では、個人情報や内部データなどの機密情報を読み込ませることもあります。

とくに「ISMS」や「プライバシーマーク」を取得しているなど、厳格なセキュリティポリシーを定めている企業の場合は、SaaS版のDifyだと社内規定に抵触するかもしれません。

一方、VPSでのセルフホストなら、SaaS版のような仕様や制約に縛られず、条件やルールに基づいて自由にデータを管理できます。

厳しいセキュリティポリシーに準拠すべきケースでも機密情報が扱いやすくなる点は、VPSでDifyをセルフホストする大きなメリットです。

カスタマイズの自由度が高い

VPSでDifyをセルフホストすると、SaaS版よりもカスタマイズの幅を広げられます。

以下は、SaaS版では難しいカスタマイズの一例と、その効果です。

カスタマイズの一例と効果
  • AIアプリの公開範囲を限定して、セキュリティを強化できる
  • 既存のシステムと連携して、AIアプリの機能を拡張できる
  • 任意の独自ドメインを設定して、AIアプリの信頼性を高められる
  • 複数のDify環境を構築して、可用性を高められる

VPSでのセルフホストでは、指定したIPアドレスからのアクセスに絞れるなど、AIアプリの公開範囲を限定できます。

公開範囲を身内に限定すれば、AIアプリとの会話から不特定多数の利用者に情報漏洩を起こしてしまったり、悪意を持ってAPIの利用枠を浪費されたりする心配がなくなります。

さらに、既存のシステムやデータベースにDifyを組み込める点も非常に有効です。

たとえば、内部の動的データベースと連携させて、最新のデータを反映したチャットボットを開発することも可能。
静的ファイルを読み込ませるだけでは実現できない、高機能なAIアプリを開発できます。

コストパフォーマンスが高い

VPSでのセルフホストは、SaaS版のDifyを利用するよりもコストパフォーマンスに優れています。

以下は、SaaS版で用意されている3つのプランと、それぞれの料金です。

SaaS版のプラン表SandboxProfessionalTeam
料金(月額)無料59ドル
(約9,000円 ※)
159ドル
(約25,000円 ※)
メッセージクレジット2005,000/月10,000/月
AIアプリの保有数5個50個200個
共同開発できる人数1人3人50人
アップロードできる
ドキュメント数
50個500個1,000個
(参考:Dify「あなたのAIの旅に最適な価格」)
※2025年12月時点の為替レート

SaaS版には「メッセージクレジット」「AIアプリの保有数」「共同開発できる人数」など、利用量や機能に制限があります。

本格的にDifyを運用するなら、「Professional」プランや「Team」プランへの加入が必要です。

一方で、セルフホストならDifyのソフトウェア自体は無料で利用可能。
それでいて、利用量や機能に制限はありません。

実際はVPSのスペックに依存するものの、サーバーとドメインの費用だけで実質的に制限なくDifyを利用できます。

画像:Difyとサーバー・ドメインの関係性

サーバーは「月額1,500円~3,000円」ほど。
ドメインは「年額2,000円~2,500円」ほどで、月額に換算すると「約150円~200円」です。

なお、LLM(ChatGPTやGeminiなど)のAPI料金は、別途発生するので注意してください。

補足

SaaS版の場合は、各プラン規定の「メッセージクレジット」を消費すると、追加のAPI費用が生じます。

XServer VPSでDifyをセルフホストする方法

以下は、『XServer VPS』でDifyをセルフホストする主な方法2つです。

セルフホストの方法
  • アプリイメージを利用する
  • Docker Composeで構築する

アプリイメージを利用する

『XServer VPS』では、Difyを簡単に導入できる「アプリイメージ」機能を提供しています。

アプリイメージとは

指定のアプリケーションをインストールし、自動で環境を構築するテンプレート機能のこと。

以下、アプリイメージを利用する方法のメリットとデメリットです。

メリット
  • 専門知識が必要ない
  • 手軽に環境を構築できる
デメリット
  • rootユーザーでの運用や管理が前提になる
  • 細かなカスタマイズに対応しづらい

アプリイメージを使えばコマンド操作は必要なく、クリックやテキスト入力によって手軽にDify環境を構築できます。

VPS(Linux)の利用に不安がある方でも、環境の構築に苦戦することなく、すぐにDifyを使い始められる点が魅力です。

ただ、アプリイメージを利用する方法では、VPSのrootユーザーでDifyを運用、管理することに配慮する必要があります。

rootとは

サーバー全体のシステムをコントロールできる管理者権限のこと。

rootユーザーはあらゆる操作が可能なため、常用すると不意に重要なファイルを削除してしまうなどのヒューマンエラーを引き起こすおそれがあります。

たとえば、機密情報を扱ったり、複数人でAIアプリを開発したりするケースでは、過剰な権限では作業しない「最小権限の原則」を意識した運用が理想的です。

アプリイメージの利用とVPSのrootユーザーでの運用には、向き不向きがあります。

手軽にDifyをセルフホストしたい」「スピード重視で環境を用意したい」という場合は、アプリイメージの利用がおすすめ。
一方で機密情報を扱うなどの実運用を想定している方は、次に紹介する「Docker Composeで構築する方法」をご検討ください。

\ アプリイメージを利用する方法の /手順を確認する

Docker Composeで構築する

「Docker Compose」を使用することでも、VPS上にDifyをセルフホストできます。

Docker Composeとは

複数のプログラム(Dockerコンテナ)を一括で起動、管理するツールのこと。

以下は、「Docker Compose」で構築する方法のメリットとデメリットです。

メリット
  • セキュアな運用や管理に向いている
  • 細かなカスタマイズにも対応しやすい
デメリット
  • コマンド操作で環境を構築する
  • DockerやWebサーバーに関する基礎知識が必要になる

「Docker Compose」で構築する方法なら、任意の構成でDify環境をセットアップできます。

たとえば、rootユーザーではなく、必要最小限の権限のみを与えた一般ユーザーでDifyを管理することも可能。
「最小権限の原則」に則った、セキュアな管理環境を構築しやすいです。

環境構築に一定の手間や知識は必要なものの、「機密情報を扱いたい」「チームで本格的に運用したい」場合は、「Docker Compose」でDifyをセルフホストしましょう。

\ Docker Composeで構築する方法の /手順を確認する

アプリイメージでDifyをセルフホストする手順

ここでは、『XServer VPS』のアプリイメージ機能を使い、手軽にDify環境を構築する手順を解説します。

以下は、アプリイメージでDifyをセルフホストする手順です。

アプリイメージでDifyをセルフホストする手順
注意

本手順は、迅速かつ手間なくDifyをセルフホストすることに重きを置いています。
セキュリティ設定を省略しているなど、実運用を想定した手順にはなっていません。
本格的にDifyを運用したい方は、「Docker ComposeでDifyをセルフホストする手順」を参考にしてください。

1. XServer VPSに申し込む

STEP1
お申し込みページにアクセスする

はじめに、『XServer VPS』の申し込みを進めます。

XServer VPSを契約済みの場合は

「OS再インストール」でDifyのアプリイメージを選択してください。
詳しい手順は、以下のマニュアルで解説しています。
※「OS再インストール」を実行すると、現在のデータは削除されます。

『XServer VPS』の申し込みフォームにアクセスしたら、すぐにスタート!新規お申込みをクリックしましょう。

画像:『XServer VPS』お申込みフォーム
STEP2
アカウント情報を入力する

以下のとおり、「XServerアカウント」の登録画面に遷移します。

画像:「XServerアカウント」登録画面

登録情報を入力後、「利用規約」と「個人情報の取り扱いについて」にチェックを入れ、次へ進むをクリックしてください。

画像:「利用規約」「個人情報の取り扱いについて」にチェックを入れる
STEP3
確認コードを入力する

入力したメールアドレス宛に6桁の確認コードが届きます。
そちらを入力して、次へ進むをクリックしましょう。

画像:メールに届いた確認コードを入力する
STEP4
入力内容を確認する

入力内容を確認のうえ、電話認証へ進むをクリックしてください。

画像:「XServerアカウント」登録内容の確認
補足

「電話認証」のステップは、省略されることもあります。

STEP5
電話認証を行う

任意の電話番号を入力してから、認証コードを取得するをクリックしましょう。

画像:任意の電話番号を入力する

5桁の認証コードを入力して、認証してサーバー申し込みに進むをクリックしてください。

画像:認証コードを入力する
STEP6
VPSの申し込み情報を入力する

電話認証が完了すると、「VPSのお申し込み」画面に遷移します。

画像:「VPSのお申し込み」画面(入力前)

以下の表を参考にしながら、申し込み情報を入力してください。

項目説明
サーバー名そのままで問題ありません。
プランDifyのイメージは「6GB」以上のプランからご利用いただけます。
6GB以上のプランを選択してください。
サーバーの契約期間任意の契約期間を選択してください。
「3ヶ月以上」でご契約いただくと、月額料金が割引されるためお得です。
イメージタイプ「アプリケーション」のタブをクリックして、「Dify」を選択してください。
ドメイン・SSLクイック設定「利用する」にチェックを入れ、「XServerのサブドメイン(無料)」を選択してください。
「ドメイン名」には、任意の文字列を入力しましょう。
rootパスワード任意のパスワードを入力してください。
忘れないようにメモしておきましょう。
SSH Key「設定しない」を選択してください。
※セキュリティを強化したい場合は、公開鍵認証の有効化を推奨します。
デフォルトポート開放「利用する」にチェックを入れてください。
XServerのサブドメインについて

『XServer VPS』では、1契約につき1つ無料でサブドメインを利用できます。
サブドメインを利用すれば、独自ドメインを事前に準備する手間がかかりません。

本手順はスピードと手軽さを重視するため、「XServerのサブドメイン」で環境を構築します。

なお、独自ドメインを利用する場合は、ネームサーバーの設定が必要です。
詳しくは、以下のマニュアルを参照してください。

それぞれ入力したあと、「XServer VPS利用規約」「個人情報の取り扱いについて」にチェックを入れ、お申し込み内容を確認するをクリックしましょう。

画像:「VPSのお申し込み」画面(入力後)
STEP7
お申し込み内容を確認する

お申し込み内容に誤りがなければ、お支払いへ進むをクリックします。

画像:お申し込み内容を確認する
STEP8
お支払い方法を選択する

お支払い方法は、「クレジットカード」「あと払い(ペイディ)」「プリペイド決済」の3種類です。

任意のお支払い方法を選択して、決済画面へ進むをクリックしてください。
※本記事では、「クレジットカード」で支払いを進めます。

画像:お支払い方法を選択する
STEP9
お支払いを進める

クレジットカード情報を入力後、確認画面へ進むをクリックしましょう。

画像:クレジットカード情報を入力する

プランや合計金額を最終確認して、支払いをするをクリックしてください。

画像:支払いをする

以下の画面が表示されれば、『XServer VPS』の申し込みは完了です。

画像:申し込み完了画面
STEP10
サーバーの稼働を確認する

お支払いから15分ほど待ったあと、サーバーの稼働状況を確認しましょう。

ログインページにアクセスして、ご契約時に設定した「メールアドレス」と「パスワード」を入力してください。

画像:『XServer VPS』ログインページ

ステータスが「構築中」から「稼働中」に変わっていればOKです。

画像:「構築中」になっていればOK

2. Difyにアクセスする

それでは、Difyにアクセスしてみましょう。

ブラウザを開いて、以下のURLを入力してください。

https://「XServerのサブドメイン」で設定した文字列.xvps.ne.jp
画像:ブラウザにURLを入力する

問題なく構築できていれば、管理者アカウントの設定画面が開きます。

「メールアドレス」「ユーザー名」「パスワード」を入力して、セットアップをクリックしましょう。

画像:Difyの管理者アカウントを設定する

ダッシュボードにアクセスできれば、アプリイメージによるDify環境の構築は完了です。

画像:Difyのダッシュボード
Difyをアップデートする方法

アプリイメージでDifyを構築した場合のアップデート手順については、以下のマニュアルで詳しく解説しています。

Docker ComposeでDifyをセルフホストする手順

続いて、「Docker Compose」を使用して、一般ユーザー配下にDify環境を構築する手順を解説します。

なお、本手順の環境は以下のとおりです。

本記事の手順環境
クライアントOS

Windows

サーバーOS

Linux

サーバースペック

vCPU4コア、メモリ6GB

ディストリビューション

Ubuntu22.04 LTS

SSHクライアント

Tera Term

注意1

本手順では、『XServer VPS』の申し込み手順は割愛します。

注意2

本手順は、VPS契約直後の初期セキュリティ対策が完了していることを前提としています。
まだの方は、以下の記事を参考に初期セキュリティ対策を済ませてから、本手順に進んでください。

1. 独自ドメインを準備する

STEP1
独自ドメインを取得する

まずは、独自ドメインを取得しましょう。
※すでに独自ドメインを所有している場合は、こちらのステップは飛ばして問題ありません。

なお、独自ドメインの詳しい取得手順は割愛します。

STEP2
ドメインのネームサーバーを確認する

続いて、『XServer VPS』と独自ドメインを紐づける、「ネームサーバー」の設定状況を確認しましょう。

補足

本手順では、『XServerドメイン』を前提にネームサーバーの確認方法を解説します。
他のサービスをご利用の場合は、各社の公式マニュアルを参照してください。

『XServerドメイン』のログインページにアクセス後、ご契約時に設定した「メールアドレス」と「パスワード」を入力してログインするをクリックします。

画像:『XServerドメイン』ログインページ

管理画面にアクセスしたら、左メニューのネームサーバー設定をクリックしましょう。

画像:「ネームサーバー設定」をクリックする

以下のとおり、「XServer VPS」にチェックが入っていればOKです。

画像:「ネームサーバー設定」一覧画面

一方で「XServer VPS」が選択されていない場合は、チェックを入れて確認画面へ進むをクリックしてください。

画像:「確認画面へ進む」をクリック

設定を変更するをクリックすれば、ネームサーバーの設定は完了です。

画像:「設定を変更する」をクリック

なお、「XServer VPS」の表示がない場合は、その他のサービスで利用するをクリックします。

画像:「その他のサービスで利用する」をクリックする

「ネームサーバー1」「ネームサーバー2」「ネームサーバー3」に以下を入力しましょう。

ネームサーバー1ns1.xvps.ne.jp
ネームサーバー2ns2.xvps.ne.jp
ネームサーバー3ns3.xvps.ne.jp

それぞれ入力したあと、確認画面へ進むをクリックしてください。

画像:ネームサーバーを入力する

あとは同様に設定を変更するをクリックすればOKです。

画像:「設定を変更する」をクリックする

2. GitとDockerをインストールする

続いて、VPSに「Git」と「Docker」をインストールしていきます。

Gitとは

ファイルやプログラムコードの変更履歴を記録、管理するためのツールのこと。
「Git」で記録した履歴を『GitHub』というWebサービスにアップロードすれば、簡単にファイルやプログラムコードを共有可能です。

本手順では、Dify公式の「GitHubリポジトリ(保管庫)」から設計図などのファイル一式をダウンロードし、「Docker Compose」で複数のプログラムを連携、実行していきます。

画像:Docker ComposeでDifyを構築する仕組み

SSHクライアント(本記事では『Tera Term』)を起動したら、VPSに接続しましょう。

画像:『Tera Term』接続画面
一般ユーザーの作成について

本記事では、VPS契約直後の初期セキュリティ対策で作成した「xserver」という一般ユーザーを使用します。
一般ユーザーの作成をはじめ、VPS契約直後の初期セキュリティ対策がまだの方は、以下の記事からご覧ください。

以下のコマンドを実行してください。

sudo apt install -y git docker.io docker-compose-v2
画像:Gitをインストールするコマンド

sudoコマンドを実行するには、一般ユーザーのパスワードの入力が必要です。
入力後、Enterを押しましょう。

画像:一般ユーザーのパスワードを入力する
補足

本手順では、一般ユーザーを「Dockerグループ」には追加しません。

Dockerグループに追加すれば、「sudo」なしで「docker」や「docker compose」コマンドを実行できるようになり便利です。

その反面、一般ユーザーが不正利用の被害に遭うと、攻撃者はサーバーの全ファイルにアクセスできるようになり、VPSが乗っ取られるおそれがあります。
セキュリティリスクが上がるため、基本的にDockerグループには追加しないようにしましょう。

3. Difyをインストールする

次に、公式の「GitHubリポジトリ」からDifyのソースコードをインストール(クローン)します。

以下のコマンドを実行してください。

git clone https://github.com/langgenius/dify.git
画像:Difyのソースコードをクローンする

4. 設定(環境変数)ファイルを作成する

Difyのソースコードをクローンしたら、重要な設定値をまとめる「環境変数ファイル」を用意します。

まずは、以下のコマンドでDifyのソースコードを格納する「docker」ディレクトリに移動しましょう。

cd dify/docker
画像:「docker」ディレクトリに移動する

以下のコマンドで、環境変数ファイルのテンプレートをコピーし、Difyが読み込む本番用のファイルを作成します。

cp .env.example .env
画像:環境変数ファイルのテンプレートをコピーする

ファイルの作成後、以下のコマンドを実行して編集画面を開いてください。

nano .env
画像:「.env」ファイルを開く

以下のとおり、ズラッと設定項目が表示されます。

画像:「.env」ファイル

「Ctrl + W」で検索欄を出したら、以下をコピペしましょう。

NGINX_SSL_CERT_FILENAME
画像:設定項目を検索する(NGINX_SSL_CERT_FILENAME)

該当の設定項目にジャンプするので、以下3つの値を書き換えてください。

NGINX_SSL_CERT_FILENAME=fullchain.pem
NGINX_SSL_CERT_KEY_FILENAME=privkey.pem
NGINX_ENABLE_CERTBOT_CHALLENGE=true
画像:3つの設定項目を書き換える

再度、「Ctrl + W」で検索欄を開いて以下をコピペします。

CERTBOT_EMAIL
画像:設定項目を検索する(CERTBOT_EMAIL)

「CERTBOT_EMAIL」には、普段使用しているメールアドレスを入力してください。

CERTBOT_EMAIL=任意のメールアドレスを入力

「CERTBOT_DOMAIN」には、「1. 独自ドメインを準備する」で用意したドメイン名を入力しましょう。

CERTBOT_DOMAIN=「1. 独自ドメインを準備する」で用意したドメイン名を入力
画像:2つの設定項目を書き換える

それぞれ入力したら、Ctrl + Xを押してください。

「変更されたバッファを保存しますか?」と表示されるので、「Y」のあとEnterを押せば環境変数ファイルの編集は完了です。

画像:「.env」ファイルを保存する

5. Docker Composeを起動する

環境変数ファイルを編集したあと、一度「Docker Compose」と「Certbot」を起動します。

Certbotとは

Difyの通信を暗号化(https化)するために必要な「SSL証明書」を無料で発行、更新してくれるツールのこと。

以下のコマンドを実行して、「Docker Compose」と「Certbot」を起動してください。

sudo docker compose --profile certbot up --force-recreate -d
画像:「Docker Compose」と「Certbot」を起動する

6. SSL証明書を取得する

続いて、「SSL証明書」を取得しましょう。

以下のコマンドを実行してください。

sudo docker compose exec -it certbot /bin/sh /update-cert.sh
画像:SSL証明書を取得する

以下のとおり、「Certificate operation successful」と表示されれば、SSL証明書の取得は完了です。

画像:SSL証明書の取得完了

反対に、「Certbot failed to authenticate some domains」と表示された場合は、SSL証明書の取得に失敗しています。

エラーの原因は、主に以下の二つです。

  • 「HTTP(80/TCP)」ポートへのアクセスを拒否している

「Certbot」は、デフォルトで「HTTP(80/TCP)」のポートを経由してSSL証明書を取得します。
SSL証明書の取得に失敗するときは、「パケットフィルター設定」で80番のポートが開放されているか確認しましょう。

  • DNS設定の反映に時間がかかっている

独自ドメインのネームサーバーを変更した場合は、設定が反映されるまでに数時間~24時間ほどかかることもあります。
80番のポートを開放していてエラーが生じるときは、少し時間を置いてから再度コマンドを実行してください。

7. https接続を有効化する

SSL証明書を取得できたら、環境変数ファイルで「https接続」を有効化します。

以下のコマンドで環境変数ファイルの編集画面を開きましょう。

nano .env
画像:「.env」ファイルの編集画面を開く

Ctrl + Wで検索欄を出して、以下をコピペしてください。

NGINX_HTTPS_ENABLED
画像:設定項目を検索する(NGINX_HTTPS_ENABLED)

「false」を「true」に書き換えます。

NGINX_HTTPS_ENABLED=true
画像:「true」に書き換える

編集後、Ctrl + Xでファイルを保存してください。

8. httpsへの転送設定(リダイレクト)を追加する

現在の設定のままでは、Webブラウザに「http://」から始まるURLを直接打ち込むと、暗号化されていない通信でDifyにアクセスできてしまいます。

Difyのログイン情報やLLMのAPIキーなど、機密情報を第三者に盗み見られるリスクがあり、セキュリティの観点で好ましくありません。

そこで、「http://」のURLにアクセスしても、自動的に安全な「https://」へと転送(リダイレクト)されるよう、Webサーバーの設定を追加します。

まずは以下のコマンドで、80番(http)ポートの通信を制御する設定ファイルを作成しましょう。

nano my_default.conf.template
画像:設定ファイル(my_default.conf.template)を作成する

空のファイルが開いたら、以下の内容をすべてコピペしてください。

# ------------------------------------------------------------
# 80番ポート(HTTP)
# ------------------------------------------------------------
server {
    listen 80;
    server_name _;


    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }


    location / {
        return 301 https://$host$request_uri;
    }
}


# ------------------------------------------------------------
# 443番ポート(HTTPS)
# ------------------------------------------------------------
server {
    listen 443 ssl;
    server_name _;


    ssl_certificate /etc/letsencrypt/live/${CERTBOT_DOMAIN}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${CERTBOT_DOMAIN}/privkey.pem;


    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;


    include proxy.conf;


    location /console/api {
        proxy_pass http://api:5001;
        include proxy.conf;
    }


    location /api {
        proxy_pass http://api:5001;
        include proxy.conf;
    }


    location /v1 {
        proxy_pass http://api:5001;
        include proxy.conf;
    }


    location /files {
        proxy_pass http://api:5001;
        include proxy.conf;
    }


    location /explore {
        proxy_pass http://web:3000;
        include proxy.conf;
    }


    location /e/ {
        proxy_pass http://plugin_daemon:5002;
        proxy_set_header Dify-Hook-Url $scheme://$host$request_uri;
        include proxy.conf;
    }


    location /mcp {
        proxy_pass http://api:5001;
        include proxy.conf;
    }


    location / {
        proxy_pass http://web:3000;
        include proxy.conf;
    }
}
画像:my_default.conf.templateの内容

Ctrl + Xでファイルを保存しましょう。

次に、上記の設定をDifyに読み込むよう指示する、「Docker Compose」の上書きファイルを作成します。

以下のコマンドを実行してください。

nano docker-compose.override.yaml
画像:上書きファイル(docker-compose.override.yaml)を作成する

空のファイルが開くので、以下の内容をコピペしましょう。

services:
  nginx:
    volumes:
      - ./my_default.conf.template:/etc/nginx/conf.d/default.conf.template
画像:docker-compose.override.yamlの内容

ペースト後、Ctrl + Xでファイルを保存してください。

9. Docker Composeを再起動する

ここまでの設定を適用するため、以下のコマンドで「Docker Compose」を再起動しましょう。

sudo docker compose up -d
画像:Docker Composeを再起動する

再起動が完了すればOKです。

画像:再起動が完了すればOK

10. SSL証明書の自動更新を設定する

通常、SSL証明書(Let's Encrypt)の有効期限は、発行から90日間です。

万が一SSL証明書が失効すると、https接続でDifyにアクセスできなくなってしまいます。

そうならないよう、SSL証明書の有効期限を定期的にチェックし、残り30日未満になれば自動で更新する設定ファイルを作成しましょう。

STEP1
スクリプトファイルを作成する

まずは、以下のコマンドで自動更新の指示をまとめるスクリプトファイルを作成します。

nano renew_ssl.sh
画像:スクリプトファイルを作成する

以下のコマンドをすべてコピペしてください。

#!/bin/bash

cd /home/xserver/dify/docker

sudo docker compose --profile certbot run --rm certbot certbot renew

sudo docker compose exec nginx nginx -s reload
画像:SSL証明書を更新するスクリプト

Ctrl + Xでファイルを保存しましょう。

ファイルを保存後、以下のコマンドで実行権限を変更してください。

chmod +x renew_ssl.sh
画像:スクリプトファイルの権限を編集する
STEP2
自動更新のスケジュールを設定する

次に、作成したスクリプトを定期的に実行するよう、スケジュール機能(Cron)を設定します。

Cronとは

指定した日時にプログラムを自動で実行するスケジュール機能のことです。
あらかじめ日時とコマンドを登録しておくことで、定期的なタスクを自動化できます。

以下のコマンドを実行してください。

sudo crontab -e
画像:Cronを編集する

以下のとおり、初回のみエディタの選択肢が表示されます。
1(nanoエディタ)」と入力してEnterを押しましょう。

画像:エディタを選択する

末尾に以下のコードをペーストしてください。

0 3 * * * /home/xserver/dify/docker/renew_ssl.sh >> /var/log/dify_ssl_renew.log 2>&1
画像:スケジュールを登録する

上記のコードは、「毎日午前3時に自動更新のスクリプトを実行する」設定です。

ペーストしたら、Ctrl + Xでファイルを保存しましょう。

11. Difyにアクセスする

最後にDifyにアクセスします。

以下のURLをブラウザに貼り付けて、Enterを押してください。

https://「1. 独自ドメインを準備する」で用意したドメイン
画像:ブラウザにURLを貼り付ける
補足

「Docker Compose」の再起動が正常に完了していないと、Difyにアクセスできなかったり、「Internal Server Error」と表示されたりすることがあります。
これは、基本的にデータベースが上手く起動していないときに起きるエラーです。

Difyへのアクセス時にエラーなどが発生した場合は、以下のコマンドで再度「Docker Compose」を起動し直してみてください。

sudo docker compose up -d

管理者アカウントの設定画面が開いたら、任意の「メールアドレス」「ユーザー名」「パスワード」を入力しましょう。

画像:管理者アカウントを設定する

それぞれ入力したあと、セットアップをクリックしてください。

画像:「セットアップ」をクリックする

ダッシュボードにログインできれば、「Docker Compose」によるDify環境の構築は完了です。

画像:Difyのダッシュボード

(補足)Difyをアップデートする手順

Difyでは、新機能の追加やバグの修正など、頻繁にアップデートが提供されています。

また、古いバージョンのまま使い続けると、セキュリティリスクが高まるおそれもあるため、定期的にアップデートするようにしてください。

以下は、Docker Composeで構築したDify環境をアップデートする手順です。

注意

アップデート中に予期せぬエラーが発生し、データが破損する可能性もゼロではありません。
基本的にDifyのアップデートは、事前にバックアップを取得してから実施するのがおすすめです。

なお、本記事ではアップデートの手順のみを解説します。
バックアップも含めた手順については、別の記事で解説する予定です。

STEP1
Difyを格納するディレクトリに移動する

SSHでVPSに接続したら、以下のコマンドでDifyを格納するディレクトリに移動しましょう。

cd dify/docker
画像:「docker」ディレクトリに移動する
STEP2
Docker Composeを一時停止する

アップデートの途中でトラブルが起きないよう、一時的に「Docker Compose」を停止してください。

補足

「Docker Compose」を停止すると、Difyは利用できなくなります。

sudo docker compose down
画像:「Docker Compose」を一時的に停止する
STEP3
最新のアップデートを取得する

以下のコマンドを実行して、Difyの公式リポジトリから最新のアップデートを取得しましょう。

git pull origin main
画像:最新版のアップデートを取得する

続いて、以下のコマンドを実行してください。

sudo docker compose pull
画像:リポジトリからプルする
STEP4
アップデートを反映する

最後に、以下のコマンドを実行すれば、Difyのアップデートは完了です。

sudo docker compose up -d
画像:「Docker Compose」を起動する
補足

アップデートによっては、環境変数のテンプレートファイル(「.env.example」)が更新されることもあります。
そのため、アップデート後は「.env.example」ファイルと本番用の「.env」ファイルを見比べて、差異がないか確認するようにしてください。

また、アップデートの手順は、バージョンによって異なる可能性があります。
アップデートがあったときは、以下の公式ページも併せて確認するようにしてください。

【任意】AIアプリの公開範囲を制限する方法

特定のメンバーだけがAIアプリを利用する「クローズドな環境」を構築したい場合は、公開範囲を制限する設定が必要になります。

以下は、本記事で案内する制限方法です。

  • パケットフィルター設定を利用する

パケットフィルター設定とは、ポートを開閉することで通信を制御するセキュリティ設定のこと。
簡単に公開範囲を制限できるものの、固定IPアドレスからのアクセスのみを許可するため、利用シーンが限定されてしまいます。

  • IP制限とBasic認証を組み合わせる

Webサーバー(Nginx)で固定IPアドレスの通信を許可し、他からのアクセスは「Basic認証」で制御する方法です。
※Basic認証とは、指定のWebページへのアクセスに対し、ユーザー名とパスワードの入力を求める認証方法のこと。
少し手順は難しいものの、より実運用に適しています。

注意

Difyで開発したAIアプリを一般公開したい場合は、こちらのセクションは飛ばしてください。

パケットフィルター設定を利用する

社内からのアクセスに限定するなど、固定IPアドレスの通信のみを許可する場合は、『XServer VPS』で提供する「パケットフィルター設定」の活用が最適です。

許可していない通信を一律で遮断でき、手軽に強固なセキュリティを確保できます。

ただ、IPアドレスが定期的に変動したり、外出先からもアクセスしたりするケースには対応できません。

より柔軟にWebアプリの公開範囲を制御したい場合は、「IP制限とBasic認証を組み合わせる」方法を検討してください。

それでは、「パケットフィルター設定」でAIアプリの公開範囲を制限する方法を解説します。

STEP1
VPSパネルにアクセスする

『XServer VPS』のVPSパネルにアクセスしたら、左メニューのパケットフィルター設定をクリックしましょう。

画像:「パケットフィルター設定」をクリックする
STEP2
パケットフィルター設定を追加する

パケットフィルター設定を追加するをクリックしてください。

画像:「パケットフィルター設定を追加する」をクリックする

まずは、「Certbot」がSSL証明書を更新するために使用する80番ポートを開放しておきます。

手動で設定を選択してください。

画像:「手動で設定」をクリックする

「ポート番号」に「80」と入力して、下部の追加するをクリックしましょう。

画像:「80番」のポートを追加する

続いて、Difyがhttps通信に使用する443番ポートに対し、送信元のIPアドレスを限定するよう設定します。

再度、パケットフィルター設定を追加するをクリックして、「手動で設定」を選択してください。

「ポート番号」には「443」と入力します。

「許可する送信元IPアドレス」を「一部許可」に変更したあと、任意のIPアドレスを入力しましょう。
「/32」の数字は、そのままで問題ありません。

それぞれ入力したら、下部の追加するをクリックしてください。

画像:443番ポートへの通信を許可するIPアドレスを指定する

あとは、既存の「Webポート」を削除すれば、パケットフィルター設定による送信元IPアドレスの制限は完了です。

画像:既存のWebポートを削除する

IP制限とBasic認証を組み合わせる

実運用を想定し、AIアプリへのアクセスを柔軟に制御したい場合は、「IP制限」と「Basic認証」を組み合わせる方法がおすすめです。

Webサーバー(Nginx)の設定を変更することで、指定したIPアドレスの通信は許可し、それ以外のアクセスはBasic認証によって制御します。

画像:IP制限とBasic認証を組み合わせる仕組み

以下は、「Nginx」の設定を変更し、IP制限とBasic認証を有効化する手順です。

STEP1
認証用のパスワードファイルを作成する

まずは、Basic認証に使用する「ユーザー名」と「パスワード」を定義した「.htpasswd」ファイルを作成しましょう。

VPSにSSH接続したあと、以下のコマンドを実行します。

sudo apt update && sudo apt install -y apache2-utils
画像:apache2-utilsをインストールする

Difyを格納するディレクトリ以外で作業している場合は、以下のコマンドで移動してください。

cd dify/docker

続いて、以下のコマンドを実行します。
<ユーザー名>の部分には、Basic認証で使用する任意の英数字を入力しましょう。

htpasswd -c .htpasswd <ユーザー名>
画像:Basic認証のパスワードファイルを作成する

「New password」と表示され、Basic認証用のパスワードの入力が求められます。
任意の英数字を入力してください。

補足

パスワードは、入力しても画面に表示されません。

指示に従い、再度パスワードを入力しましょう。

画像:Basic認証用のパスワードを入力する

「Adding password for user <ユーザー名>」と表示されればOKです。

画像:「Adding password」と表示されればOK
STEP2
Nginxの設定ファイルを編集する

Basic認証用のパスワードファイルを作成したあと、「Nginx」の設定ファイル(my_default.conf.template)を編集してアクセス制御のルールを追加します。

ただ、既存のファイルを手動で編集すると、記述を間違えるかもしれません。

一つインデントがズレるだけでDifyが動かなくなることもあるため、今回は一度ファイルを削除して新規に作成します。

「dify/docker」のディレクトリで、以下のコマンドを実行してください。

rm my_default.conf.template
画像:「my_default.conf.template」ファイルを削除する

続いて、以下のコマンドで設定ファイルを新規作成しましょう。

nano my_default.conf.template
画像:「my_default.conf.template」ファイルを新規作成する

ファイルが開いたら、以下のコードをすべてコピペしてください。

# ------------------------------------------------------------
# 80番ポート(HTTP)
# ------------------------------------------------------------
server {
    listen 80;
    server_name _;




    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }




    location / {
        return 301 https://$host$request_uri;
    }
}




# ------------------------------------------------------------
# 443番ポート(HTTPS)
# ------------------------------------------------------------
server {
    listen 443 ssl;
    server_name _;




    ssl_certificate /etc/letsencrypt/live/${CERTBOT_DOMAIN}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${CERTBOT_DOMAIN}/privkey.pem;




    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;


    satisfy any;


    allow 127.0.0.1;
    allow <指定のIPアドレス>;


    deny all;


    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;




    include proxy.conf;




    location /console/api {
        proxy_pass http://api:5001;
        include proxy.conf;
    }




    location /api {
        proxy_pass http://api:5001;
        include proxy.conf;
    }




    location /v1 {
        proxy_pass http://api:5001;
        include proxy.conf;
    }




    location /files {
        proxy_pass http://api:5001;
        include proxy.conf;
    }




    location /explore {
        proxy_pass http://web:3000;
        include proxy.conf;
    }




    location /e/ {
        proxy_pass http://plugin_daemon:5002;
        proxy_set_header Dify-Hook-Url $scheme://$host$request_uri;
        include proxy.conf;
    }




    location /mcp {
        proxy_pass http://api:5001;
        include proxy.conf;
    }




    location / {
        proxy_pass http://web:3000;
        include proxy.conf;
    }
}

「指定のIPアドレス」の部分に、アクセスを許可したいグローバルIPアドレスを入力します。
複数のIPアドレスを許可したい場合は、改行して追記してください。

画像:「my_default.conf.template」ファイルの内容

編集後、Ctrl + Xでファイルを保存しましょう。

補足

本手順では、「Nginx」の設定を「my_default.conf.template」で上書きし、固定しています。
Difyのアップデートにより、公式テンプレートの通信設定(ルーティング)に変更が合った場合、新機能が動かなくなるなどの不整合が生じるかもしれません。

不具合が生じたときは、公式のテンプレートと「my_default.conf.template」ファイルの内容を見比べ、新しい記述があれば追記してください。

STEP3
Dockerの設定を上書きする

次に、追記したルールをDockerに読み込ませるため、「docker-compose.override.yaml」ファイルを編集します。

先ほどと同じく、以下のコマンドで一度ファイルを削除してください。

rm docker-compose.override.yaml
画像:「docker-compose.override.yaml」ファイルを削除する

以下のコマンドで、「docker-compose.override.yaml」ファイルを新規作成しましょう。

nano docker-compose.override.yaml
画像:「docker-compose.override.yaml」ファイルを新規作成する

以下の内容をコピペします。

services:
  nginx:
    volumes:
      - ./my_default.conf.template:/etc/nginx/conf.d/default.conf.template
      - ./.htpasswd:/etc/nginx/conf.d/.htpasswd
画像:「docker-compose.override.yaml」ファイルの内容

編集したあと、Ctrl + Xでファイルを保存しましょう。

STEP4
設定を適用する

「Nginx」のコンテナを再起動して設定を適用します。

以下のコマンドを実行してください。

sudo docker compose --profile certbot up -d --no-deps --force-recreate nginx
画像:「Nginx」を再起動する

Started」と表示されれば、IP制限とBasic認証の有効化は完了です。

画像:「Started」と表示されればOK
STEP5
設定が反映されているか確認する

最後に、IP制限とBasic認証が無事に有効化されているか確認しましょう。

許可したIPアドレスから、通常通りDifyにアクセスできればOKです。

また、許可していないIPアドレスからDifyにアクセスしてみて、以下のとおり「ユーザー名」と「パスワード」の入力が求められれば、Basic認証も正常に有効化されています。

画像:Basic認証の画面

さいごに

以上、VPSでDifyをセルフホストする実践ガイドでした。

テスト用途なら「アプリイメージ」、実運用なら「Docker Compose」で構築するのがおすすめです。

Difyを利用する目的や用途を踏まえ、どちらの方法が自分に合っているか判断してください。

最後までお読みいただき、ありがとうございました。

圧倒的なコスパで自由自在に

© 2025 XServer Inc.