commit 7de45e61bd870dc113a986cda4365cad52c5c479 Author: xieke Date: Sat Jun 6 06:25:50 2026 +0800 feat(M1): Docker部署配置 - docker-compose、环境变量模板、.gitignore、部署文档 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2e824e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# 环境变量(含密码和密钥) +docker/.env +.env +.env.local +.env.*.local + +# Docker 数据卷 +docker/data/ +docker/volumes/ + +# SSL 证书 +docker/nginx/ssl/*.pem +docker/nginx/ssl/*.key +docker/nginx/ssl/*.crt + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Python +__pycache__/ +*.py[cod] +*.egg-info/ +.venv/ +venv/ + +# Node +node_modules/ +dist/ +.next/ + +# Logs +*.log +logs/ + +# 临时文件 +*.tmp +*.bak diff --git a/docker/.env.docker b/docker/.env.docker new file mode 100644 index 0000000..7d1cc00 --- /dev/null +++ b/docker/.env.docker @@ -0,0 +1,32 @@ +# ============================================================ +# Dify Docker 内部服务通信环境变量 +# 此文件由 docker-compose.yml 的 env_file 引用 +# 请勿提交到 Git,已在 .gitignore 中排除 +# ============================================================ + +# 内部服务间通信不需要修改以下值 +# DB/Redis 等地址使用 docker-compose 中的服务名 + +EDITION=SELF_HOSTED +CONF_GIT_SYNC_ENABLED=false + +# 知识库检索配置 +INDEXING_MAX_SEGMENTATION_TOKENS=500 +INDEXING_MAX_SEGMENTATION_CHUNKS_PER_FILE=10 +INDEXING_SEGMENTATION_SEPARATOR=['\n','\n\n',' ','。','!','?',';',';'] + +# 批量处理配置 +BATCH_PROCESSING_ENABLED=true + +# 多模态配置 +MULTIMODAL_ENABLED=true + +# 文件上传限制 +UPLOAD_FILE_SIZE_LIMIT=50 +UPLOAD_IMAGE_FILE_SIZE_LIMIT=20 + +# Celery 队列配置 +CELERY_QUEUES=dataset,generation,mail + +# 文档解析配置 +DOCUMENT_PARSERS=pdf,txt,md,csv,xlsx,pptx,docx diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 0000000..0743aa4 --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,84 @@ +# ============================================================ +# Dify 环境变量配置模板 +# 西安云美电子科技有限公司 - 企业知识库 +# +# 使用方法:cp .env.example .env && 编辑 .env 填写实际值 +# ============================================================ + +# ====================== 基础配置 ====================== + +# 运行模式:api(默认)/ worker +DIFY_MODE=api + +# 日志级别:DEBUG / INFO / WARNING / ERROR +LOG_LEVEL=INFO + +# 安全密钥(必须修改!用于加密 Token 等敏感数据) +# 生成方法:openssl rand -hex 32 +SECRET_KEY=请替换为随机生成的密钥 + +# 应用端口(API 服务内部端口) +HTTP_APP_PORT=5001 + +# ====================== 数据库配置 ====================== + +POSTGRES_USER=postgres +POSTGRES_PASSWORD=请替换为强密码 +POSTGRES_DB=dify + +# ====================== Redis 配置 ====================== + +REDIS_PASSWORD=请替换为强密码 +REDIS_DB=0 + +# ====================== 存储配置 ====================== + +# 存储类型:local / s3 +STORAGE_TYPE=local +STORAGE_LOCAL_PATH=/app/api/storage + +# ====================== 向量数据库配置 ====================== + +# 向量数据库类型:qdrant / weaviate / elasticsearch +VECTOR_STORE=qdrant + +# Qdrant 配置 +QDRANT_PORT=6333 +QDRANT_API_KEY= + +# ====================== DeepSeek 模型配置 ====================== + +# DeepSeek API 地址(国内可直连) +DEEPSEEK_API_BASE=https://api.deepseek.com +DEEPSEEK_API_KEY=请替换为你的DeepSeek API Key + +# ====================== Web 前端配置 ====================== + +# 如果使用 Nginx 反向代理且前后端同域名,留空即可 +NEXT_PUBLIC_API_BASE_URL= +NEXT_PUBLIC_DEPLOY_ENV=PRODUCTION + +# ====================== Nginx 配置 ====================== + +NGINX_PORT=80 +NGINX_SSL_PORT=443 + +# ====================== SSRF 代理配置 ====================== + +SSRF_PROXY_PORT=3128 + +# ====================== Sandbox 配置(可选)====================== + +SANDBOX_API_KEY= +SANDBOX_URL= +SANDBOX_WORKER_TIMEOUT=15 +SANDBOX_ENABLE_NETWORK=true + +# ====================== S3 存储配置(可选)====================== + +S3_USE_CUSTOM_DOMAIN=true +S3_ENDPOINT= +S3_BUCKET_NAME= +S3_ACCESS_KEY= +S3_SECRET_KEY= +S3_REGION= diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..82e67f4 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,147 @@ +# Dify 部署指南 + +> 西安云美电子科技有限公司 - 企业知识库 + +## 前置要求 + +| 项目 | 最低要求 | 推荐配置 | +|------|---------|---------| +| CPU | 4 核 | 8 核+ | +| 内存 | 8 GB | 16 GB+ | +| 磁盘 | 50 GB SSD | 100 GB+ SSD | +| Docker | ≥ 20.10 | 最新稳定版 | +| Docker Compose | ≥ 2.0 | 最新稳定版 | +| 操作系统 | Ubuntu 20.04+ | Ubuntu 22.04 LTS | + +## 快速部署 + +### 1. 克隆项目 + +```bash +git clone http://git.xayunmei.com/yunmei/dify-app.git +cd dify-app +git checkout feature/dev +``` + +### 2. 配置环境变量 + +```bash +cd docker +cp .env.example .env + +# 必须修改以下配置: +# - SECRET_KEY(安全密钥,用 openssl rand -hex 32 生成) +# - POSTGRES_PASSWORD(数据库密码) +# - REDIS_PASSWORD(Redis 密码) +# - DEEPSEEK_API_KEY(DeepSeek API 密钥) +``` + +### 3. 配置 Nginx(可选) + +如果使用自定义域名,编辑 `nginx/nginx.conf`: + +```bash +mkdir -p nginx +# 将 SSL 证书放入 nginx/ssl/ 目录 +``` + +### 4. 启动服务 + +```bash +# 拉取镜像 +docker compose pull + +# 后台启动所有服务 +docker compose up -d + +# 查看服务状态 +docker compose ps + +# 查看日志 +docker compose logs -f +``` + +### 5. 初始化 + +启动完成后,打开浏览器访问: + +``` +http://<服务器IP>:80 +``` + +首次访问会要求设置管理员账号和密码。 + +## 服务端口说明 + +| 服务 | 容器端口 | 映射端口 | 说明 | +|------|---------|---------|------| +| Nginx | 80/443 | 80/443 | 主入口 | +| Dify API | 5001 | 内部 | API 服务 | +| Dify Web | 3000 | 内部 | 前端 | +| PostgreSQL | 5432 | 内部 | 数据库 | +| Redis | 6379 | 内部 | 缓存 | +| Qdrant | 6333 | 6333 | 向量数据库 | + +## 常用命令 + +```bash +# 停止所有服务 +docker compose down + +# 停止并清除数据卷(危险!) +docker compose down -v + +# 重启单个服务 +docker compose restart api +docker compose restart worker + +# 查看单个服务日志 +docker compose logs -f api +docker compose logs -f worker + +# 更新镜像 +docker compose pull +docker compose up -d +``` + +## 备份与恢复 + +### 数据库备份 + +```bash +docker compose exec db pg_dump -U postgres dify > backup_$(date +%Y%m%d).sql +``` + +### 数据库恢复 + +```bash +docker compose exec -T db psql -U postgres dify < backup_20260606.sql +``` + +### 数据卷备份 + +```bash +docker run --rm -v dify-app_api_storage:/data -v $(pwd):/backup alpine tar czf /backup/api_storage_$(date +%Y%m%d).tar.gz -C /data . +``` + +## 故障排查 + +| 问题 | 排查方法 | +|------|---------| +| 服务启动失败 | `docker compose logs ` | +| 数据库连接失败 | 检查 `.env` 中密码是否一致 | +| 知识库索引失败 | 检查 Worker 日志,确认 Celery 队列正常 | +| 模型调用失败 | 检查 DeepSeek API Key 是否有效 | +| 端口冲突 | 修改 `.env` 中对应端口号 | + +## 安全注意事项 + +1. **SECRET_KEY 必须使用随机值**,不要使用默认值 +2. **生产环境关闭 Qdrant 外部端口**(注释掉 ports 映射) +3. **定期更换数据库密码** +4. **配置 Nginx SSL 证书**,不要在公网裸跑 HTTP +5. **.env 文件不要提交到 Git** + +--- + +_最后更新: 2026-06-06_ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..b55eb0a --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,271 @@ +# Docker Compose for Dify Self-Hosted +# 西安云美电子科技有限公司 - 企业知识库 +# 版本:基于 Dify v1.x 社区版 +# +# 使用方法: +# cp .env.example .env +# 编辑 .env 填写实际值 +# docker compose up -d + +services: + + ### ======================== 基础设施 ======================== + + # PostgreSQL 数据库 + db: + image: postgres:15-alpine + restart: always + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB:-dify} + volumes: + - db_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - dify-network + + # Redis 缓存 + redis: + image: redis:7-alpine + restart: always + command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes + volumes: + - redis_data:/data + healthcheck: + test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - dify-network + + ### ======================== Dify 核心服务 ======================== + + # Dify API 后端 + api: + image: langgenius/dify-api:latest + restart: always + env_file: + - .env.docker + environment: + # 基础配置 + - MODE=${DIFY_MODE:-api} + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - LOG_FILE=${LOG_FILE:-} + - SECRET_KEY=${SECRET_KEY} + # 数据库配置 + - DB_USERNAME=${POSTGRES_USER:-postgres} + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_HOST=db + - DB_PORT=5432 + - DB_DATABASE=${POSTGRES_DB:-dify} + # Redis 配置 + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_PASSWORD=${REDIS_PASSWORD} + - REDIS_DB=${REDIS_DB:-0} + # 存储配置 + - STORAGE_TYPE=${STORAGE_TYPE:-local} + - STORAGE_LOCAL_PATH=/app/api/storage + # 向量数据库 + - VECTOR_STORE=${VECTOR_STORE:-qdrant} + - QDRANT_URL=http://qdrant:6333 + - QDRANT_API_KEY=${QDRANT_API_KEY:-} + # S3 配置(可选) + - S3_USE_CUSTOM_DOMAIN=${S3_USE_CUSTOM_DOMAIN:-true} + - S3_ENDPOINT=${S3_ENDPOINT:-} + - S3_BUCKET_NAME=${S3_BUCKET_NAME:-} + - S3_ACCESS_KEY=${S3_ACCESS_KEY:-} + - S3_SECRET_KEY=${S3_SECRET_KEY:-} + - S3_REGION=${S3_REGION:-} + # SandBox 配置 + - CODE_EXECUTION_API_KEY=${SANDBOX_API_KEY:-} + - CODE_EXECUTION_API_URL=${SANDBOX_URL:-} + # 模型配置(DeepSeek) + - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.deepseek.com} + - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} + # 其他 + - HTTP_APP_PORT=5001 + - CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/1 + - CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis:6379/1 + volumes: + - api_storage:/app/api/storage + - app_data:/app/data + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + networks: + - dify-network + + # Dify Web 前端 + web: + image: langgenius/dify-web:latest + restart: always + environment: + - NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL:-} + - NEXT_PUBLIC_DEPLOY_ENV=${NEXT_PUBLIC_DEPLOY_ENV:-PRODUCTION} + volumes: + - web_config:/app/config + depends_on: + - api + networks: + - dify-network + + # Dify Worker(异步任务处理) + worker: + image: langgenius/dify-api:latest + restart: always + env_file: + - .env.docker + environment: + # 基础配置 + - MODE=${DIFY_MODE:-worker} + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - SECRET_KEY=${SECRET_KEY} + # 数据库配置 + - DB_USERNAME=${POSTGRES_USER:-postgres} + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_HOST=db + - DB_PORT=5432 + - DB_DATABASE=${POSTGRES_DB:-dify} + # Redis 配置 + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_PASSWORD=${REDIS_PASSWORD} + - REDIS_DB=${REDIS_DB:-0} + # 存储配置 + - STORAGE_TYPE=${STORAGE_TYPE:-local} + - STORAGE_LOCAL_PATH=/app/api/storage + # 向量数据库 + - VECTOR_STORE=${VECTOR_STORE:-qdrant} + - QDRANT_URL=http://qdrant:6333 + - QDRANT_API_KEY=${QDRANT_API_KEY:-} + # 模型配置(DeepSeek) + - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.deepseek.com} + - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} + # Celery + - CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/1 + - CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis:6379/1 + volumes: + - api_storage:/app/api/storage + - app_data:/app/data + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + networks: + - dify-network + + ### ======================== 向量数据库 ======================== + + # Qdrant 向量数据库(默认) + qdrant: + image: qdrant/qdrant:latest + restart: always + volumes: + - qdrant_data:/qdrant/storage + environment: + - QDRANT_API_KEY=${QDRANT_API_KEY:-} + ports: + - "${QDRANT_PORT:-6333}:6333" + networks: + - dify-network + + ### ======================== 安全与代理 ======================== + + # Nginx 反向代理 + nginx: + image: nginx:alpine + restart: always + ports: + - "${NGINX_PORT:-80}:80" + - "${NGINX_SSL_PORT:-443}:443" + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro + - ./nginx/ssl:/etc/nginx/ssl:ro + - nginx_logs:/var/log/nginx + depends_on: + - api + - web + networks: + - dify-network + + # SSRF 代理(安全防护) + ssrf-proxy: + image: ubuntu/squid:latest + restart: always + volumes: + - ./ssrf-proxy/squid.conf.template:/etc/squid/squid.conf.template:ro + environment: + - HTTP_PROXY_PORT=${SSRF_PROXY_PORT:-3128} + ports: + - "${SSRF_PROXY_PORT:-3128}:3128" + networks: + - dify-network + + ### ======================== 可选服务 ======================== + + # Sandbox 代码执行环境(可选,按需启用) + # sandbox: + # image: langgenius/dify-sandbox:latest + # restart: always + # environment: + # - API_KEY=${SANDBOX_API_KEY} + # - GIN_MODE=release + # - WORKER_TIMEOUT=${SANDBOX_WORKER_TIMEOUT:-15} + # - ENABLE_NETWORK=${SANDBOX_ENABLE_NETWORK:-true} + # volumes: + # - sandbox_data:/data + # networks: + # - dify-network + + # Elasticsearch(可选,替代 Qdrant) + # elasticsearch: + # image: elasticsearch:8.11.0 + # restart: always + # volumes: + # - es_data:/usr/share/elasticsearch/data + # environment: + # - discovery.type=single-node + # - xpack.security.enabled=false + # - ES_JAVA_OPTS=-Xms512m -Xmx512m + # networks: + # - dify-network + + # Weaviate(可选,替代 Qdrant) + # weaviate: + # image: semitechnologies/weaviate:latest + # restart: always + # volumes: + # - weaviate_data:/var/lib/weaviate + # environment: + # - QUERY_DEFAULTS_LIMIT=25 + # - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true + # - PERSISTENCE_DATA_PATH=/var/lib/weaviate + # ports: + # - "8080:8080" + # networks: + # - dify-network + +volumes: + db_data: + redis_data: + api_storage: + app_data: + qdrant_data: + nginx_logs: + # sandbox_data: + # es_data: + # weaviate_data: + +networks: + dify-network: + driver: bridge diff --git a/tasks.md b/tasks.md new file mode 100644 index 0000000..55df61a --- /dev/null +++ b/tasks.md @@ -0,0 +1,59 @@ +# 企业知识库项目 - 任务清单 + +> 项目:西安云美电子科技有限公司 企业知识库 +> 技术栈:Dify 社区版(Docker)+ DeepSeek 模型 +> 分支:feature/dev + +--- + +## M1: 环境搭建与 Docker 部署配置 + +- [x] M1.1.1 创建 `docker/` 目录结构 +- [x] M1.1.2 编写 `docker/docker-compose.yml`(Dify 完整服务编排:api、web、worker、db、redis、nginx、ssrf-proxy 等) +- [x] M1.1.3 编写 `docker/.env.example`(所有环境变量模板,含数据库密码、Secret Key、API 端口等占位符) +- [x] M1.1.4 编写 `docker/.env.docker`(Docker 内部服务通信专用变量) +- [x] M1.1.5 编写 `docker/README.md`(部署步骤说明) +- [x] M1.2.1 编写 `.gitignore`(排除 .env、node_modules、data 卷等) + +--- + +## M2: 知识库结构设计与文档编写 + +- [ ] M2.1.1 调研云美电子科技典型知识库分类(产品手册、技术规范、管理制度、培训资料等) +- [ ] M2.1.2 编写 `docs/knowledge-base-structure.md`(知识库分类结构设计) +- [ ] M2.1.3 设计知识库分段策略(文档分块大小、重叠策略) + +--- + +## M3: 系统提示词设计 + +- [ ] M3.1.1 编写 `prompts/system-prompt.md`(Dify 知识库助手的系统提示词) +- [ ] M3.1.2 设计开场白与推荐问题 +- [ ] M3.1.3 设计下一步问题建议策略 + +--- + +## M4: 测试用例与性能基线 + +- [ ] M4.1.1 编写 `tests/test-cases.md`(功能测试用例:知识检索、问答质量、多轮对话等) +- [ ] M4.1.2 编写 `docs/performance-baseline.md`(性能基线指标:响应时间、准确率等) + +--- + +## M5: API 集成文档 + +- [ ] M5.1.1 编写 `docs/api-integration.md`(Dify API 集成指南:对话、知识库管理接口) + +--- + +## M6: 应用配置导出与最终整理 + +- [ ] M6.1.1 编写 `dsl/app-config.yaml`(Dify 应用 DSL 配置模板) +- [ ] M6.1.2 编写 `docs/deployment-guide.md`(完整部署指南) +- [ ] M6.1.3 创建项目 README.md +- [ ] M6.1.4 整理最终目录结构,确保所有文件就绪 +- [ ] M6.1.5 创建最终 Tag(v1.0.0) + +--- + +_创建时间: 2026-06-06_