如何使用 Docker Compose 在 VPS 架設 Dify
本文教學使用 Docker Compose 在 VPS 上部署 Dify。運行此平台需準備至少 4 GB RAM 以支撐六個 containers。部署前請務必修改 .env 中的所有 secret 密碼,並在啟動後立即前往 /install 建立管理員帳號以確保安全。
Dify 是什麼,以及你將運行什麼
Dify 是一個可自行架設的平台,用於在大型語言模型之上構建應用程式。你可以透過 Web 介面設計聊天應用、Agent 與檢索流程,並透過 API 從自有程式碼中呼叫它們,同時在單一位置管理 Prompt、資料集與模型金鑰。這類工具適合小型團隊使用,讓每個人都在同一個共享的私有基礎上進行開發,而不是將 API 金鑰分散在各個腳本中。
自行架設意味著需要運行多個組件。Dify 以 Docker containers 形式發行:包含一個 API server、一個背景 worker、一個 Web frontend、一個 Postgres 資料庫、一個 Redis 快取以及一個向量資料庫,全部透過 Docker Compose 串接。這比單一 binary 複雜,但 Compose 會處理串接工作,一台擁有數 GB 剩餘 RAM 的 VPS 即可輕鬆運行。
由於 Dify 會存放你的模型 API 金鑰,且通常包含你為了檢索而載入的私有文件,請從第一分鐘起就將運行該服務的機器視為敏感設備。本指南將教你如何安裝,並像強化任何持有機密資訊的服務一樣來強化它。
Prerequisites
你需要一台運行 Ubuntu 24.04 的 VPS,並已安裝 Docker 與 Docker Compose plugin,且使用者需具備 sudo 權限或屬於 docker 群組。如果你是 Docker 初學者,the basics of Docker Compose on a VPS 涵蓋了本指南所假設的安裝步驟與核心指令。建議準備一個指向該伺服器的網域名稱,因為你將需要為 Dify 配置 TLS,而非直接使用 IP 地址。
Step 1: Get Dify and its Compose files
Dify 的 Docker 設定位於主儲存庫中。請 clone 它並進入 docker 目錄:
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env.env 檔案即為完整的配置。在開始任何操作前請先閱讀。最關鍵的數值是設定密碼與機密資訊的部分:SECRET_KEY、Postgres 密碼以及 Redis 密碼。範例檔案內含預設值,若直接使用預設值,是導致自行架設的 Dify 被入侵的最常見原因。請生成一個真實的 secret key:
openssl rand -base64 42將其貼入 SECRET_KEY,並為檔案中的每個密碼欄位設定強大且唯一的數值。
Step 2: Start it
啟動服務堆疊:
docker compose up -d首次運行會下載多個 images 並初始化資料庫,請稍候片刻。檢查 containers 是否狀態正常:
docker compose ps每個服務都應讀取 running。預設情況下,Dify 透過內建的 nginx container 在 port 80 提供 Web 介面。當你首次訪問 http://YOUR_SERVER/install 時,需建立管理員帳號。請在任何其他服務存取該 port 之前立即完成此操作,因為在該帳號建立前,任何載入頁面的人都可以搶佔並擁有你的實例。
Step 3: Do not expose it raw. Put TLS and a firewall in front
這是大多數快速安裝流程結束,也是大多數安全事件開始的地方。Dify 內建的 nginx 會在所有介面上監聽 port 80 並以明文傳輸。你不希望管理員登入資訊與模型金鑰透過 plain HTTP 傳輸,也不希望內部服務從外部存取。
使用 default-deny 防火牆來鎖定機器,僅允許 SSH 與 Web 流量:
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable請記住,僅涵蓋 IPv4 的防火牆可能會在 IPv6 開放相同的 port,這就是導致許多自行架設者遭遇 IPv6 firewall gap 的原因。請確認兩個堆疊都已受到過濾。
關於 TLS,最乾淨的做法是將 Dify 的 web port 綁定到 loopback,並在前端運行一個帶有 Let's Encrypt 憑證的反向代理,這樣在公開網際網路中,唯一的對外介面就是使用 HTTPS 的代理伺服器。Dify 的 .env 允許你更改暴露的 port;請將其設定為綁定在 127.0.0.1,並將你的代理指向該位置。running an AI agent safely on a VPS 中的 Agent 加固概念也適用於此:將運作組件保留在 loopback,僅暴露必須公開的部分,並讓一個經過強化的入口負責 TLS 通訊。
Step 4: Keep it patched
Dify 的更新速度很快,更新內容包含安全性修復。更新方式是在 docker 目錄下執行 pull 與 restart:
git pull
docker compose pull
docker compose up -d在大版本升級前請閱讀 release notes,因為 Dify 有時會在版本之間更改 .env schema,若未設定新的變數可能會導致 container 無法啟動。
Step 5: Back up what you cannot regenerate
Dify 機器上有兩樣東西是無法重新生成的:一是存放應用程式、使用者與設定的 Postgres 資料庫,二是存放上傳文件與向量索引的 volume。兩者都位於 docker 目錄下的 Docker volumes 中。請安排定期進行快照,並將快照複製到伺服器之外。模型 API key 可以重新核發,但你花了一週建立的應用程式卻不行。
若要了解更具自主性的程式碼執行型 Agent,請參閱 self-hosting Agent Zero;building your own AI agent on a VPS 則涵蓋了所有基礎技術。
FAQ
What are the system requirements to self-host Dify?
Dify 以約半打 containers 組成的 Docker Compose stack 運行,因此請規劃一台至少有 2 GB 剩餘 RAM 的 VPS,理想情況為 4 GB,此外還需要數個 CPU cores 以及足以存放上傳文件與向量索引的磁碟空間。記憶體壓力主要來自資料庫與向量儲存,而非 Dify 本身。
Is it safe to expose Dify directly on port 80?
不安全。Dify 內建的 Web server 使用 plain HTTP 監聽,且它負責處理你的管理員登入與模型 API key。請在前端放置一個帶有 Let's Encrypt 憑證的反向代理,將 Dify 自身的 port 綁定到 loopback,並僅讓 HTTPS 代理面對網際網路。同時配合涵蓋 IPv4 與 IPv6 的 default-deny 防火牆。
How do I update a self-hosted Dify?
在 docker 目錄下,執行 git pull,接著執行 docker compose pull 與 docker compose up -d 來獲取新 images 並重啟。請先閱讀 release notes,因為 Dify 有時會在版本之間新增 .env 變數,若缺少變數會導致 container 無法啟動。
What is the first thing to do after installing Dify?
立即訪問 /install 並建立管理員帳號。在該帳號建立前,任何能存取該頁面的人都可以搶佔它。請在 containers 狀態正常後立即完成設定,並在對外開放防火牆之前完成。