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