🤖

【vultr×Dify】でプライベートなAI環境構築

2024/10/16に公開

参考記事

今回参考にさせていただいた有益な記事は以下。

前提

  • vultr(ヴァルチャー?)でVPSを契約している。
  • vultrサーバーのSSHの設定を済ませている。

環境

vultr:ubuntu 24.0.0 LTS

Dockerを使えるようにする

sudo apt update

sudo apt install -y docker.io

sudo systemctl start docker

sudo systemctl enable docker

sudo apt install -y curl

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo docker --version

sudo docker-compose --version

Dify構築

mkdir services

Difyのソースコードをローカルにクローンします

git clone https://github.com/langgenius/dify.git

基本的には以下の公式の手順を参考に進めていきます。
ちょっとだけ変えないとうまく動かないという感じ。
https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose#difyno

Difyの起動

  1. difyソースコードのdockerディレクトリに移動し、次のコマンドを実行してdifyを起動する
cd service/dify/docker
  1. docker-compose.override.yamlのオーバーライド

dify/dockerディレクトリにdocker-compose.override.yamlを作成する。
内容は以下の通り。

services:
  api:
    environment:
      CONSOLE_WEB_URL: 'http://localhost:8080'
      CONSOLE_API_URL: 'http://vultrのパブリックIP'
      MAIL_TYPE: 'smtp'
      MAIL_DEFAULT_SEND_FROM: 'hoge@gmail.com'
      SMTP_SERVER: 'smtp.gmail.com'
      SMTP_PORT: 587
      SMTP_USERNAME: 'hoge@gmail.com'
      SMTP_PASSWORD: 'hogepass' # Gmailのアプリパスワード
      SMTP_USE_TLS: 'true'
  worker:
    environment:
      CONSOLE_WEB_URL: 'http://localhost:8080'
      CONSOLE_API_URL: 'http://vultrのパブリックIP'
      MAIL_TYPE: 'smtp'
      MAIL_DEFAULT_SEND_FROM: 'hoge@gmail.com'
      SMTP_SERVER: 'smtp.gmail.com'
      SMTP_PORT: 587
      SMTP_USERNAME: 'hoge@gmail.com'
      SMTP_PASSWORD: 'hogepass'
      SMTP_USE_TLS: 'true'
  nginx:
    ports:
      - "8080:80" # Difyを公開するポート
  1. 環境ファイルをコピーする
    dify/api/.env
    dify/web/.env
    dify/docker/.env
    の3つがあるので、それぞれ以下のコマンドでコピーしておく。
    cp .env.example .env

この時dify/dokcer/.envの中身は以下の2点を書き換える。

  • apiのパス
  • database(任意)

apiのパスはvultrのパブリックIPを明示的に記述しておく。

CONSOLE_API_URL=http://vultrのパブリックIP
CONSOLE_WEB_URL=http://vultrのパブリックIP
SERVICE_API_URL=http://vultrのパブリックIP

databaseは任意で使いたいpostgresがあればその情報に書き換える。

DB_USERNAME=mydbuser
DB_PASSWORD=mydbpass
DB_HOST=mydbhost
DB_PORT=5432
DB_DATABASE=mydb

Difyの公式が作ってくれてる図は以下。

Docker内のnginxが吸収してくれていることによって、コンテナ間のネットワークはすべてDocker環境の中に閉じ込められている。
つまり、使う人はローカルでDocker環境を立ち上げるだけでよく、外部からはlocalhost(デフォルトである`80番)だけ意識すればいいような作りになっている。(美しい、かっけぇ...)

なので今回のvultr環境では、
dockerのlocalhost:8080→
vultr(ホスト)の80番→
パブリックのIP(インターネット)といった具合に繋がっている。

上記で述べた「apiのパスはvultrのパブリックIPを明示的に記述しておく」というのもこれによるもの。

  1. Docker コンテナを起動する
docker-compose up -d
  1. 確認する
docker compose ps

Dockerをsudoなしで使えるようにする

sudo usermod -aG docker $USER

newgrp docker

nginxの502エラーが出る場合

以下のコマンドを実行して、それぞれのコンテナのIPを確認する

docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

dify/docker/nginx/conf.d/default.confを編集して上記コマンドで確認したIPを明示的に指定する。

詳しくは公式のリファレンスに記載がある。
https://docs.dify.ai/ja-jp/learn-more/faq/install-faq

firewallの設定を忘れずに

とりあえずdifyが使える状態になったので、AIに与えた情報が流出するかもとか気にせずに好きに使えます。
自分アプリに連携するなり想像が広がりますね。
あとはvultr側でのfirewallとかの設定を忘れないように気をつけてくださいね。

Discussion