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.com
→your-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 應用程式。記得定期備份資料、監控系統效能,並保持軟體更新以確保最佳的安全性和穩定性。