Files
dify-docs/zh/self-host/advanced-deployments/local-source-code.mdx

296 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 使用源代码本地启动
---
<Note> ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考[英文原版](/en/self-host/advanced-deployments/local-source-code)。</Note>
## 前提条件
### 设置 Docker 和 Docker Compose
> 在安装 Dify 之前,请确保你的设备符合以下最低系统要求:
> - CPU >= 2 核
> - RAM >= 4 GiB
| 操作系统 | 软件 | 说明 |
| ------------------ | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| macOS 10.14 或更高版本 | Docker Desktop | 将 Docker 虚拟机(VM)设置为至少使用 2 个虚拟 CPU(vCPU)和 8 GB 的初始内存。否则,安装可能会失败。更多信息,请参考 [Docker Desktop for Mac 安装指南](https://docs.docker.com/desktop/mac/install/)。 |
| Linux 平台 | Docker 19.03 或更高版本 Docker Compose 1.25.1 或更高版本 | 请参考 [Docker 安装指南](https://docs.docker.com/engine/install/) 和 [Docker Compose 安装指南](https://docs.docker.com/compose/install/) 了解如何分别安装 Docker 和 Docker Compose。 |
| 启用 WSL 2 的 Windows | Docker Desktop | 我们建议将源代码和绑定到 Linux 容器的其他数据存储在 Linux 文件系统中,而不是 Windows 文件系统中。更多信息,请参考 [Windows 上使用 WSL 2 后端的 Docker Desktop 安装指南](https://docs.docker.com/desktop/windows/install/#wsl-2-backend)。 |
> 如果需要使用 OpenAI TTS系统必须安装 `FFmpeg` 才能正常运行。更多详情,请参考:[链接](https://docs.dify.ai/getting-started/install-self-hosted/install-faq#id-14.-what-to-do-if-this-error-occurs-in-text-to-speech)。
### 克隆 Dify 仓库
运行 git 命令克隆 [Dify 仓库](https://github.com/langgenius/dify)。
```bash
git clone https://github.com/langgenius/dify.git
```
### 使用 Docker Compose 启动中间件
Dify 后端服务需要一系列用于存储(如 PostgreSQL / Redis / Weaviate如果本地不可用和扩展能力如 Dify 的 [sandbox](https://github.com/langgenius/dify-sandbox) 和 [plugin-daemon](https://github.com/langgenius/dify-plugin-daemon) 服务)的中间件。通过运行以下命令使用 Docker Compose 启动中间件:
```bash
cd docker
cp middleware.env.example middleware.env
# 如果不使用 postgresql请将 profile 更改为 mysql
# 如果不使用 weaviate请将 profile 更改为其他向量数据库
docker compose -f docker-compose.middleware.yaml --profile postgresql --profile weaviate -p dify up -d
```
---
## 设置后端服务
后端服务包括:
1. API 服务:为前端服务和 API 访问提供 API 请求服务
2. Worker 服务:为数据集处理、工作区、清理等异步任务提供服务
### 启动 API 服务
1. 导航到 `api` 目录:
```
cd api
```
2. 准备环境变量配置文件:
```
cp .env.example .env
```
<Note>
当前端和后端运行在不同子域名时,需要在 `.env` 文件中将 `COOKIE_DOMAIN` 设置为站点的顶级域名(例如 `example.com`)。
前端和后端必须位于同一顶级域名下才能共享身份验证 cookie。
</Note>
3. 生成随机密钥并替换 `.env` 文件中的 SECRET_KEY 值:
```
awk -v key="$(openssl rand -base64 42)" '/^SECRET_KEY=/ {sub(/=.*/, "=" key)} 1' .env > temp_env && mv temp_env .env
```
4. 安装依赖:
使用 [uv](https://docs.astral.sh/uv/getting-started/installation/) 管理依赖。
通过运行以下命令使用 `uv` 安装所需依赖:
```
uv sync --dev
```
> 对于 macOS使用 `brew install libmagic` 安装 libmagic。
5. 执行数据库迁移:
执行数据库迁移到最新版本:
```
uv run flask db upgrade
```
6. 启动 API 服务:
```
uv run flask run --host 0.0.0.0 --port=5001 --debug
```
预期输出:
```
* Debug mode: on
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5001
INFO:werkzeug:Press CTRL+C to quit
INFO:werkzeug: * Restarting with stat
WARNING:werkzeug: * Debugger is active!
INFO:werkzeug: * Debugger PIN: 695-801-919
```
### 启动 Worker 服务
要从队列中消费异步任务,例如数据集文件导入和数据集文档更新,请按照以下步骤启动 Worker 服务:
- 对于 macOS 或 Linux
```
uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,dataset_summary,priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention,workflow_based_app_execution
```
如果你使用 Windows 系统启动 Worker 服务,请使用以下命令:
- 对于 Windows
```
uv run celery -A app.celery worker -P solo --without-gossip --without-mingle --loglevel INFO -Q dataset,dataset_summary,priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention,workflow_based_app_execution
```
预期输出:
```
-------------- celery@bwdeMacBook-Pro-2.local v5.4.0 (opalescent)
--- ***** -----
-- ******* ---- macOS-15.4.1-arm64-arm-64bit 2025-04-28 17:07:14
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: app_factory:0x1439e8590
- ** ---------- .> transport: redis://:**@localhost:6379/1
- ** ---------- .> results: postgresql://postgres:**@localhost:5432/dify
- *** --- * --- .> concurrency: 1 (gevent)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> dataset exchange=dataset(direct) key=dataset
.> generation exchange=generation(direct) key=generation
.> mail exchange=mail(direct) key=mail
.> ops_trace exchange=ops_trace(direct) key=ops_trace
[tasks]
. schedule.clean_embedding_cache_task.clean_embedding_cache_task
. schedule.clean_messages.clean_messages
. schedule.clean_unused_datasets_task.clean_unused_datasets_task
. schedule.create_tidb_serverless_task.create_tidb_serverless_task
. schedule.mail_clean_document_notify_task.mail_clean_document_notify_task
. schedule.update_tidb_serverless_status_task.update_tidb_serverless_status_task
. tasks.add_document_to_index_task.add_document_to_index_task
. tasks.annotation.add_annotation_to_index_task.add_annotation_to_index_task
. tasks.annotation.batch_import_annotations_task.batch_import_annotations_task
. tasks.annotation.delete_annotation_index_task.delete_annotation_index_task
. tasks.annotation.disable_annotation_reply_task.disable_annotation_reply_task
. tasks.annotation.enable_annotation_reply_task.enable_annotation_reply_task
. tasks.annotation.update_annotation_to_index_task.update_annotation_to_index_task
. tasks.batch_clean_document_task.batch_clean_document_task
. tasks.batch_create_segment_to_index_task.batch_create_segment_to_index_task
. tasks.clean_dataset_task.clean_dataset_task
. tasks.clean_document_task.clean_document_task
. tasks.clean_notion_document_task.clean_notion_document_task
. tasks.deal_dataset_vector_index_task.deal_dataset_vector_index_task
. tasks.delete_account_task.delete_account_task
. tasks.delete_segment_from_index_task.delete_segment_from_index_task
. tasks.disable_segment_from_index_task.disable_segment_from_index_task
. tasks.disable_segments_from_index_task.disable_segments_from_index_task
. tasks.document_indexing_sync_task.document_indexing_sync_task
. tasks.document_indexing_task.document_indexing_task
. tasks.document_indexing_update_task.document_indexing_update_task
. tasks.duplicate_document_indexing_task.duplicate_document_indexing_task
. tasks.enable_segments_to_index_task.enable_segments_to_index_task
. tasks.mail_account_deletion_task.send_account_deletion_verification_code
. tasks.mail_account_deletion_task.send_deletion_success_task
. tasks.mail_email_code_login.send_email_code_login_mail_task
. tasks.mail_invite_member_task.send_invite_member_mail_task
. tasks.mail_reset_password_task.send_reset_password_mail_task
. tasks.ops_trace_task.process_trace_tasks
. tasks.recover_document_indexing_task.recover_document_indexing_task
. tasks.remove_app_and_related_data_task.remove_app_and_related_data_task
. tasks.remove_document_from_index_task.remove_document_from_index_task
. tasks.retry_document_indexing_task.retry_document_indexing_task
. tasks.sync_website_document_indexing_task.sync_website_document_indexing_task
2025-04-28 17:07:14,681 INFO [connection.py:22] Connected to redis://:**@localhost:6379/1
2025-04-28 17:07:14,684 INFO [mingle.py:40] mingle: searching for neighbors
2025-04-28 17:07:15,704 INFO [mingle.py:49] mingle: all alone
2025-04-28 17:07:15,733 INFO [worker.py:175] celery@bwdeMacBook-Pro-2.local ready.
2025-04-28 17:07:15,742 INFO [pidbox.py:111] pidbox: Connected to redis://:**@localhost:6379/1.
```
### 启动 Beat 服务
如需调试 celery 定时任务或运行定时触发器节点,可以在另一个终端中运行以下命令启动 beat 服务:
```bash
uv run celery -A app.celery beat
```
---
## 设置 Web 服务
启动用于前端页面的 web 服务。
### 环境准备
要启动 web 前端服务,需要 [Node.js v22 (LTS)](http://nodejs.org/) 和 [PNPM v10](https://pnpm.io/)。
- 安装 NodeJS
请访问 [https://nodejs.org/en/download](https://nodejs.org/en/download) 并选择适合你操作系统的 v18.x 或更高版本的安装包。推荐使用 LTS 版本进行常规使用。
- 安装 PNPM
按照 [安装指南](https://pnpm.io/installation) 安装 PNPM。或者直接使用 `npm` 运行以下命令安装 `pnpm`。
```
npm i -g pnpm
```
### 启动 Web 服务
1. 进入 web 目录:
```
cd web
```
2. 安装依赖:
```
pnpm install --frozen-lockfile
```
3. 准备环境变量配置文件\
在当前目录中创建一个名为 `.env.local` 的文件,并从 `.env.example` 复制内容。根据你的需求修改这些环境变量的值:
```
# For production release, change this to PRODUCTION
NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
# The deployment edition, SELF_HOSTED or CLOUD
NEXT_PUBLIC_EDITION=SELF_HOSTED
# The base URL of console application, refers to the Console base URL of WEB service if console domain is different from api or web app domain.
# example: http://cloud.dify.ai/console/api
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from console or api domain.
# example: http://udify.app/api
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api
# When the frontend and backend run on different subdomains, set NEXT_PUBLIC_COOKIE_DOMAIN=1.
NEXT_PUBLIC_COOKIE_DOMAIN=
# SENTRY
NEXT_PUBLIC_SENTRY_DSN=
NEXT_PUBLIC_SENTRY_ORG=
NEXT_PUBLIC_SENTRY_PROJECT=
```
4. 构建 web 服务:
```
pnpm build
```
5. 启动 web 服务:
```
pnpm start
```
预期输出:
```
▲ Next.js 15
- Local: http://localhost:3000
- Network: http://0.0.0.0:3000
✓ Starting...
✓ Ready in 73ms
```
### 访问 Dify
通过浏览器访问 [http://localhost:3000](http://localhost:3000/) 即可享受 Dify 所有激动人心的功能。
干杯!🍻