在 Ubuntu 24 上安裝 Dify:完整 Nginx 反向代理和公共網域配置指南

How to Install Dify on Ubuntu 24 with Nginx as reverse proxy for public domain

這是一份詳盡的技術指南,將協助您在 Ubuntu 24.04 系統上建立一個完整的 Dify 生產環境,包含 Nginx 反向代理設定、SSL 憑證配置以及公共網域存取。

系統需求與前置作業

在開始部署前,請確認您的系統符合以下基本要求:

硬體需求

  • CPU:最少 2 核心,建議 4 核心以上用於生產環境
  • 記憶體:最少 4GB RAM,生產環境建議 8GB 以上
  • 儲存空間:最少 50GB,生產環境建議 100GB 以上
  • 網路:需要公開 IP 位址和已註冊的網域名稱

軟體需求

  • Ubuntu 24.04 LTS (Noble Numbat)
  • 具備 root 或 sudo 權限的使用者帳戶
  • 已指向伺服器 IP 的網域名稱

核心元件架構解析

Dify 採用微服務架構,包含七個主要服務元件:

  • API 服務 (dify-api):處理後端 API 和業務邏輯
  • Worker 服務 (dify-worker):負責非同步任務處理
  • Web 服務 (dify-web):前端應用程式介面
  • PostgreSQL 資料庫:資料持久化儲存
  • Redis:快取和會話管理
  • Weaviate 向量資料庫:知識庫儲存
  • Nginx:反向代理和網頁伺服器

第一階段:系統環境準備

首先進行系統更新並安裝必要的基礎套件:

# 更新系統套件
sudo apt update && sudo apt upgrade -y

# 安裝必要的工具
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release git

第二階段:Docker 容器環境建置

安裝 Docker Engine

# 新增 Docker 官方 GPG 金鑰
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 新增 Docker 套件庫
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安裝 Docker 和相關元件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 設定 Docker 服務
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
newgrp docker

驗證安裝

# 檢查版本
docker --version
docker compose version

# 測試 Docker 運行
docker run hello-world

第三階段:Dify 應用程式部署

下載並設定 Dify

# 複製 Dify 儲存庫
git clone https://github.com/langgenius/dify.git
cd dify/docker

# 建立環境設定檔
cp .env.example .env

# 產生安全金鑰
openssl rand -base64 42

環境變數配置

編輯 .env 檔案進行關鍵設定:

nano .env

設定以下重要參數:

# 基本設定
SECRET_KEY=your-generated-secret-key-here
DEPLOY_ENV=PRODUCTION

# 資料庫設定
DB_USERNAME=postgres
DB_PASSWORD=your-secure-database-password
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify

# Redis 設定
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password
REDIS_DB=0

# 網域設定 (替換為您的實際網域)
CONSOLE_API_URL=https://your-domain.com/console/api
CONSOLE_WEB_URL=https://your-domain.com
SERVICE_API_URL=https://your-domain.com/api
APP_API_URL=https://your-domain.com/api
APP_WEB_URL=https://your-domain.com

# 檔案上傳設定
UPLOAD_FILE_SIZE_LIMIT=100M
NGINX_CLIENT_MAX_BODY_SIZE=100M

啟動 Dify 服務

# 啟動所有容器服務
docker compose up -d

# 檢查服務狀態
docker compose ps

# 查看服務日誌
docker compose logs -f

第四階段:Nginx 反向代理設定

安裝 Nginx

sudo apt update
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

建立 Nginx 站點配置

建立專用的 Nginx 設定檔:

sudo nano /etc/nginx/sites-available/dify.conf

加入以下完整配置:

# HTTP 重新導向配置
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS 主要配置
server {
    listen 443 ssl http2;
    server_name your-domain.com www.your-domain.com;

    # SSL 憑證設定 (由 Certbot 自動新增)
    
    # 安全標頭設定
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 主要代理設定
    location / {
        proxy_pass http://localhost:80;
        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_set_header X-Forwarded-Host $server_name;
        proxy_buffering off;
        proxy_request_buffering off;
    }

    # API 端點代理
    location /api {
        proxy_pass http://localhost:80;
        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_buffering off;
        proxy_request_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    # WebSocket 支援
    location /ws {
        proxy_pass http://localhost:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_cache_bypass $http_upgrade;
    }

    # 檔案上傳限制
    client_max_body_size 100M;
    client_body_timeout 120s;
    client_header_timeout 120s;
}

啟用站點配置

# 建立符號連結
sudo ln -s /etc/nginx/sites-available/dify.conf /etc/nginx/sites-enabled/

# 測試配置語法
sudo nginx -t

# 重新載入 Nginx
sudo systemctl restart nginx

第五階段:網域 DNS 和 SSL 憑證設定

DNS 記錄配置

在您的網域註冊商或 DNS 服務商設定以下記錄:

  • A 記錄your-domain.com → 您的伺服器 IP 位址
  • CNAME 記錄www.your-domain.comyour-domain.com

等待 DNS 傳播完成(通常需要 5-30 分鐘)。

安裝 Certbot 和取得 SSL 憑證

# 安裝 Certbot 和 Nginx 擴充套件
sudo apt install -y certbot python3-certbot-nginx

# 測試設定(乾跑模式)
sudo certbot --nginx --dry-run -d your-domain.com -d www.your-domain.com

# 取得正式 SSL 憑證
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

Certbot 會自動:

  • 取得 Let’s Encrypt 免費 SSL 憑證
  • 修改 Nginx 配置以包含 SSL 設定
  • 設定 HTTP 到 HTTPS 的自動重新導向

設定自動更新

# 測試憑證自動更新
sudo certbot renew --dry-run

# 檢查系統定時任務
sudo systemctl status snap.certbot.renew.timer

第六階段:安全性強化措施

防火牆設定

# 設定 UFW 防火牆
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# 驗證防火牆規則
sudo ufw status verbose

環境變數安全性

# 限制 .env 檔案權限
cd ~/dify/docker
chmod 600 .env

# 產生強密碼
DB_PASSWORD=$(openssl rand -base64 32)
REDIS_PASSWORD=$(openssl rand -base64 32)
SECRET_KEY=$(openssl rand -base64 42)

第七階段:系統驗證和效能最佳化

服務狀態檢查

# 檢查 Docker 容器狀態
docker compose ps

# 檢查 Nginx 狀態
sudo systemctl status nginx

# 測試 API 健康狀態
curl https://your-domain.com/health

# 檢查 SSL 憑證
curl -I https://your-domain.com

效能監控

# 即時監控容器資源使用
docker stats

# 查看應用程式日誌
docker compose logs -f api
docker compose logs -f worker

# 監控 Nginx 存取日誌
sudo tail -f /var/log/nginx/access.log

常見問題排除

連接埠衝突問題

如果遇到連接埠 80 或 443 被佔用:

# 檢查連接埠使用情況
sudo netstat -tulpn | grep :80
sudo netstat -tulpn | grep :443

# 停用可能衝突的服務
sudo systemctl stop apache2
sudo systemctl disable apache2

CORS 錯誤解決

確保 .env 檔案中的 URL 設定正確對應您的網域名稱:

CONSOLE_API_URL=https://your-domain.com/console/api
CONSOLE_WEB_URL=https://your-domain.com
SERVICE_API_URL=https://your-domain.com/api
APP_API_URL=https://your-domain.com/api
APP_WEB_URL=https://your-domain.com

檔案上傳失敗處理

調整上傳大小限制:

# 更新 .env 設定
UPLOAD_FILE_SIZE_LIMIT=100M
NGINX_CLIENT_MAX_BODY_SIZE=100M

# 重新啟動服務
docker compose restart
sudo systemctl restart nginx

備份和維護策略

自動化備份腳本

# 建立備份腳本
cat > ~/backup-dify.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/home/backup/dify"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR
cd ~/dify/docker

# 備份資料庫
docker exec docker-db-1 pg_dump -U postgres dify > $BACKUP_DIR/dify-db-$DATE.sql

# 備份設定檔和資料卷
tar -czf $BACKUP_DIR/dify-config-$DATE.tar.gz .env ./volumes/

echo "備份完成:$BACKUP_DIR"
EOF

chmod +x ~/backup-dify.sh

系統更新流程

# Dify 更新
cd ~/dify
git pull origin main
cd docker
docker compose down
docker compose pull
docker compose up -d

# 系統更新
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y

結論

完成以上所有步驟後,您將擁有一個完整且安全的 Dify 生產環境,具備以下特點:

  • 安全的 HTTPS 存取:透過 Let’s Encrypt 提供的免費 SSL 憑證
  • 穩定的反向代理:Nginx 提供負載平衡和快取功能
  • 自動化維護:SSL 憑證自動更新和系統監控
  • 生產級安全性:防火牆、安全標頭和權限控制

現在您可以透過 https://your-domain.com 存取您的 Dify 實例,開始建立和部署 AI 應用程式。記得定期備份資料、監控系統效能,並保持軟體更新以確保最佳的安全性和穩定性。