メインコンテンツまでスキップ

DifyをUbuntuにインストールする

※このDifyのインストールは少し特殊です。

既にNginxがインストールされているサーバーに複数のウェブアプリケーションを共存させる目的の手法です。

今回、DockerのNginxとCertbotは無効化します。

OracleにNextcloudをいれたついでいにインストールしてみました。
今回インストールしたサイト https://dify.momijiina.tech

Dockerをインストールする

パッケージの更新をする

sudo apt -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release

Docker公式のGPG鍵を追加する

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

最新の安定版(stable)を取得する。 最新版(nightly)が欲しい場合はstableの文字をnightlyへ変更する。

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

インストールする

sudo apt -y update
sudo apt -y install docker-ce docker-ce-cli containerd.io

Dockerのversion確認

可能なら Docker EOLなどで調べてサポートがしてないか新しいのが本当に入っているかみるといいかも

docker --version

証明書取得

certbotのインストール

sudo apt -y install certbot

証明書を取得する

既にポート80が使われている場合はそのソフトウェアの動作を止める必要があります。(Nginx等)

sudo certbot certonly --standalone -d dify.momijiina.tech

VPS等の逆引きホスト名でも実は取得できます。(テストの際ぜひ)
ConoHaの例(xxxは数値(ipだったもの)ですわざとつぶしています)

sudo certbot certonly --standalone -d vxxx-251-xxx-137.vapy.static.cnode.jp

Nginxをインストールする

最新のNginx取得に必要なものをインストール

sudo apt -y install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

Nginxの署名鍵をインポート

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

最新のNginx安定板を取得する

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Nginxのインストール

sudo apt update
sudo apt -y install nginx

Nginxの起動と有効化

sudo systemctl enable nginx --now

起動状況とバージョン確認

sudo nginx -v
sudo systemctl status nginx

Difyをインストールする

optに入れますがお気に入り場所があるならいじってください

Difyのダウンロード

cd /opt
sudo git clone https://github.com/langgenius/dify.git
cd dify

Difyのenvファイルの作成(コピー)

cd /opt/dify/docker
sudo cp .env.example .env

.envの編集

必要に応じて設定(例: DBやDBパスワード, ポートなど)
今回は不要

sudo vi .env

一応,日本語に変えてみる(必要があるかは不明の為ととばしていいです)

LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8

docker-compose.yamlの編集

今回の場合はポート番号を指定しないとうまく動作しません

sudo vi docker-compose.yaml

Webアプリのポート番号を指定

650行目くらい

  # worker service
# The Celery worker for processing the queue.
worker:
image: langgenius/dify-api:1.7.1
restart: always
ports:
- "3000:3000"

apiポートを指定

580行目くらい 何個かあるので気を付けて(最初のやつに# API serviceを目印にしてください)

services:
# API service
api:
image: langgenius/dify-api:1.7.1
restart: always
ports:
- "5001:5001"
environment:

通信設定の追加

更に最下部のnetworksもbridgeを追加編集する(1290行らへん) これがないと外部APIを使えません

networks:
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
ssrf_proxy_network:
driver: bridge
internal: true
milvus:
driver: bridge
opensearch-net:
driver: bridge
internal: true
bridge:
external: true
name: bridge

DockerのNginx,Certbotの無効化

Dockerのnginxとcertbotを使わないのでコメントアウトしておく(810行くらいでした)

 # Certbot service
# use `docker-compose --profile certbot up` to start the certbot service.
# certbot:
# image: certbot/certbot
# profiles:
# - certbot
# volumes:
# - ./volumes/certbot/conf:/etc/letsencrypt
# - ./volumes/certbot/www:/var/www/html
# - ./volumes/certbot/logs:/var/log/letsencrypt
# - ./volumes/certbot/conf/live:/etc/letsencrypt/live
# - ./certbot/update-cert.template.txt:/update-cert.template.txt
# - ./certbot/docker-entrypoint.sh:/docker-entrypoint.sh
# environment:
# - CERTBOT_EMAIL=${CERTBOT_EMAIL}
# - CERTBOT_DOMAIN=${CERTBOT_DOMAIN}
# - CERTBOT_OPTIONS=${CERTBOT_OPTIONS:-}
# entrypoint: [ '/docker-entrypoint.sh' ]
# command: [ 'tail', '-f', '/dev/null' ]

# The nginx reverse proxy.
# used for reverse proxying the API service and Web service.
#nginx:
# image: nginx:latest
# restart: always
# volumes:
# - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template
# - ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template
# - ./nginx/https.conf.template:/etc/nginx/https.conf.template
# - ./nginx/conf.d:/etc/nginx/conf.d
# - ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh
# - ./nginx/ssl:/etc/ssl # cert dir (legacy)
# - ./volumes/certbot/conf/live:/etc/letsencrypt/live # cert dir (with certbot container)
# - ./volumes/certbot/conf:/etc/letsencrypt
# - ./volumes/certbot/www:/var/www/html
# entrypoint: [ 'sh', '-c', "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ]
# environment:
# NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}
# NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}
# NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}
# NGINX_PORT: ${NGINX_PORT:-80}
# # You're required to add your own SSL certificates/keys to the `./nginx/ssl` directory
# # and modify the env vars below in .env if HTTPS_ENABLED is true.
# NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt}
# NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key}
# NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3}
# NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto}
# NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M}
# NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65}
# NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s}
# NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s}
# NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false}
# CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-}
# depends_on:
# - api
# - web
# ports:
# - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
# - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'

起動する

sudo docker compose up -d

起動コンテナの確認(ポート確認など)

sudo docker ps

nginxの設定

cd /etc/nginx/conf.d
sudo vi dify.conf
server {
listen 80;
listen [::]:80;

server_name dify.momijiina.tech;
server_tokens off;

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

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name dify.momijiina.tech;

ssl_certificate "/etc/letsencrypt/live/dify.momijiina.tech/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/dify.momijiina.tech/privkey.pem";

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

client_max_body_size 2G;
client_body_timeout 300;
client_body_buffer_size 512M;

#証明書更新用
location ^~ /.well-known/acme-challenge {
root /var/www/html;
}

location = /.well-known/acme-challenge/ {
return 404;
}

# APIリクエスト(/api/ および /console/api/ もAPIコンテナに)
location ~ ^/(console/)?api/ {
proxy_pass http://127.0.0.1:5001;
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;
}

# Webコンテナ
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}

Nginxのリロード

リロードしても問題ないか確認

sudo nginx -t

失敗しなければリロード

sudo systemctl reload nginx

WebからDifyを設定する

メールアドレスとユーザー名とパスワードを入力するだけで終わりです

詳細設定をする

アプリのURLを指定する

大事です。

この設定をしないと招待メールが来てもうまく動作しません。

cd /opt/dify/docker/
sudo vi .env

19行目くらい(httpsから絶対いれてください)

CONSOLE_WEB_URL=https://dify.momijiina.tech

設定を反映する

sudo docker compose up -d

SMTPメールサーバーを設定する

やる前に上のアプリのURLを指定するを読んでください。
パスワードのリセットや招待メールを送れるようにします。

cd /opt/dify/docker/
sudo vi .env

755行目ごろから(以下は例です。)
私はConoHaのやつ使ってるのでgmailではためしてないです。

# ------------------------------
# Mail related configuration
# ------------------------------

# Mail type, support: resend, smtp, sendgrid
MAIL_TYPE=smtp

# Default send from email address, if not specified
# If using SendGrid, use the 'from' field for authentication if necessary.
MAIL_DEFAULT_SEND_FROM=your_email@gmail.com

# API-Key for the Resend email provider, used when MAIL_TYPE is `resend`.
#RESEND_API_URL=https://api.resend.com
#RESEND_API_KEY=your-resend-api-key


# SMTP server configuration, used when MAIL_TYPE is `smtp`
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=465
SMTP_USERNAME=your_email@gmail.com
SMTP_PASSWORD=your_app_gmail_password
SMTP_USE_TLS=true
SMTP_OPPORTUNISTIC_TLS=false

設定を反映する

sudo docker compose up -d