From 16f3e227d5d573d75ab7377adf95fdcea2cce38e Mon Sep 17 00:00:00 2001 From: zstar <65890619+zstar1003@users.noreply.github.com> Date: Tue, 10 Jun 2025 00:20:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(env):=20=E9=87=8D=E6=9E=84=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E5=8A=A0=E8=BD=BD=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=8E=B7=E5=8F=96=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 Dockerfile 中的额外依赖安装 - 更新环境变量加载路径,使用统一的 get_root_folder() 函数 - 调整数据库连接、MinIO 访问等配置方式 - 移除 pyproject.toml 和 requirements.txt 中的冗余依赖 - 优化前端 MinIO 访问方式,通过后端 API 获取 MinIO URL --- Dockerfile | 4 ---- api/apps/minio_app.py | 10 ++++++++++ api/db/services/database.py | 9 ++++++--- api/ragflow_server.py | 20 +++++++++++++------- api/root_path.py | 5 +++++ api/settings.py | 24 ++++++++++-------------- management/server/database.py | 15 +++++++++------ management/server/root_path.py | 5 +++++ pyproject.toml | 4 +--- requirements.txt | 4 +--- web/src/components/chunk_image/index.tsx | 24 ++++++++++++++++-------- web/src/utils/api.ts | 3 +++ 12 files changed, 79 insertions(+), 48 deletions(-) create mode 100644 api/apps/minio_app.py create mode 100644 api/root_path.py create mode 100644 management/server/root_path.py diff --git a/Dockerfile b/Dockerfile index e556cc6..843ab53 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,10 +11,6 @@ COPY rag ./rag COPY graphrag ./graphrag COPY agentic_reasoning ./agentic_reasoning -# 安装额外依赖 -RUN uv pip install --no-cache-dir mysql-connector-python==9.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN uv pip install --no-cache-dir redis==6.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple - # 复制前端源代码目录 COPY web ./web diff --git a/api/apps/minio_app.py b/api/apps/minio_app.py new file mode 100644 index 0000000..f5c15f1 --- /dev/null +++ b/api/apps/minio_app.py @@ -0,0 +1,10 @@ +import os + + +@manager.route("/endpoint", methods=["GET"]) # noqa: F821 +# @login_required +def minio(): + """ + Constructs the MinIO endpoint URL based on environment variables. + """ + return os.getenv("MINIO_VISIT_HOST", "localhost") + ":" + os.getenv("MINIO_PORT", "9000") + "/" diff --git a/api/db/services/database.py b/api/db/services/database.py index 29cdee0..ddfcf0c 100644 --- a/api/db/services/database.py +++ b/api/db/services/database.py @@ -1,10 +1,13 @@ import os -from minio import Minio -from dotenv import load_dotenv from pathlib import Path +from dotenv import load_dotenv +from minio import Minio + +from api.root_path import get_root_folder + # 加载环境变量 -env_path = Path(__file__).parent.parent.parent / "docker" / ".env" +env_path = Path(get_root_folder()) / "docker" / ".env" load_dotenv(env_path) diff --git a/api/ragflow_server.py b/api/ragflow_server.py index b6a7e47..9bc217f 100644 --- a/api/ragflow_server.py +++ b/api/ragflow_server.py @@ -2,24 +2,30 @@ import logging import os import signal import sys +import threading import time import traceback from concurrent.futures import ThreadPoolExecutor -import threading +from pathlib import Path + +from dotenv import load_dotenv from werkzeug.serving import run_simple -from api import settings + +from api import settings, utils from api.apps import app +from api.db.db_models import init_database_tables as init_web_db from api.db.runtime_config import RuntimeConfig from api.db.services.document_service import DocumentService -from api import utils -from api.db.db_models import init_database_tables as init_web_db -from api.db.init_data import init_web_data -from api.versions import get_ragflow_version +from api.root_path import get_root_folder from api.utils import show_configs +from api.utils.log_utils import initRootLogger +from api.versions import get_ragflow_version from rag.settings import print_rag_settings from rag.utils.redis_conn import RedisDistributedLock -from api.utils.log_utils import initRootLogger +# 加载环境变量 +env_path = Path(get_root_folder()) / "docker" / ".env" +load_dotenv(env_path) initRootLogger("ragflow_server") diff --git a/api/root_path.py b/api/root_path.py new file mode 100644 index 0000000..708b261 --- /dev/null +++ b/api/root_path.py @@ -0,0 +1,5 @@ +import os + + +def get_root_folder(): + return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/api/settings.py b/api/settings.py index 3aa7bf8..dbac22a 100644 --- a/api/settings.py +++ b/api/settings.py @@ -25,7 +25,7 @@ from graphrag import search as kg_search from api.utils import get_base_config, decrypt_database_config from api.constants import RAG_FLOW_SERVICE_NAME -LIGHTEN = int(os.environ.get('LIGHTEN', "0")) +LIGHTEN = int(os.environ.get("LIGHTEN", "0")) LLM = None LLM_FACTORY = None @@ -41,7 +41,7 @@ HOST_IP = None HOST_PORT = None SECRET_KEY = None -DATABASE_TYPE = os.getenv("DB_TYPE", 'mysql') +DATABASE_TYPE = os.getenv("DB_TYPE", "mysql") DATABASE = decrypt_database_config(name=DATABASE_TYPE) # authentication @@ -62,8 +62,8 @@ kg_retrievaler = None def init_settings(): global LLM, LLM_FACTORY, LLM_BASE_URL, LIGHTEN, DATABASE_TYPE, DATABASE - LIGHTEN = int(os.environ.get('LIGHTEN', "0")) - DATABASE_TYPE = os.getenv("DB_TYPE", 'mysql') + LIGHTEN = int(os.environ.get("LIGHTEN", "0")) + DATABASE_TYPE = os.getenv("DB_TYPE", "mysql") DATABASE = decrypt_database_config(name=DATABASE_TYPE) LLM = get_base_config("user_default_llm", {}) LLM_DEFAULT_MODELS = LLM.get("default_models", {}) @@ -86,36 +86,32 @@ def init_settings(): EMBEDDING_MDL = EMBEDDING_MDL + (f"@{LLM_FACTORY}" if "@" not in EMBEDDING_MDL and EMBEDDING_MDL != "" else "") RERANK_MDL = RERANK_MDL + (f"@{LLM_FACTORY}" if "@" not in RERANK_MDL and RERANK_MDL != "" else "") ASR_MDL = ASR_MDL + (f"@{LLM_FACTORY}" if "@" not in ASR_MDL and ASR_MDL != "" else "") - IMAGE2TEXT_MDL = IMAGE2TEXT_MDL + ( - f"@{LLM_FACTORY}" if "@" not in IMAGE2TEXT_MDL and IMAGE2TEXT_MDL != "" else "") + IMAGE2TEXT_MDL = IMAGE2TEXT_MDL + (f"@{LLM_FACTORY}" if "@" not in IMAGE2TEXT_MDL and IMAGE2TEXT_MDL != "" else "") global API_KEY, PARSERS, HOST_IP, HOST_PORT, SECRET_KEY API_KEY = LLM.get("api_key", "") PARSERS = LLM.get( "parsers", - "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,knowledge_graph:Knowledge Graph,email:Email,tag:Tag") + "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,knowledge_graph:Knowledge Graph,email:Email,tag:Tag", + ) HOST_IP = get_base_config(RAG_FLOW_SERVICE_NAME, {}).get("host", "127.0.0.1") HOST_PORT = get_base_config(RAG_FLOW_SERVICE_NAME, {}).get("http_port") - SECRET_KEY = get_base_config( - RAG_FLOW_SERVICE_NAME, - {}).get("secret_key", str(date.today())) + SECRET_KEY = get_base_config(RAG_FLOW_SERVICE_NAME, {}).get("secret_key", str(date.today())) global AUTHENTICATION_CONF, CLIENT_AUTHENTICATION, HTTP_APP_KEY, GITHUB_OAUTH, FEISHU_OAUTH # authentication AUTHENTICATION_CONF = get_base_config("authentication", {}) # client - CLIENT_AUTHENTICATION = AUTHENTICATION_CONF.get( - "client", {}).get( - "switch", False) + CLIENT_AUTHENTICATION = AUTHENTICATION_CONF.get("client", {}).get("switch", False) HTTP_APP_KEY = AUTHENTICATION_CONF.get("client", {}).get("http_app_key") GITHUB_OAUTH = get_base_config("oauth", {}).get("github") FEISHU_OAUTH = get_base_config("oauth", {}).get("feishu") global DOC_ENGINE, docStoreConn, retrievaler, kg_retrievaler - DOC_ENGINE = os.environ.get('DOC_ENGINE', "elasticsearch") + DOC_ENGINE = os.environ.get("DOC_ENGINE", "elasticsearch") lower_case_doc_engine = DOC_ENGINE.lower() if lower_case_doc_engine == "elasticsearch": docStoreConn = rag.utils.es_conn.ESConnection() diff --git a/management/server/database.py b/management/server/database.py index a069358..2a45267 100644 --- a/management/server/database.py +++ b/management/server/database.py @@ -1,13 +1,16 @@ -import mysql.connector import os -import redis -from minio import Minio -from dotenv import load_dotenv -from elasticsearch import Elasticsearch from pathlib import Path +import mysql.connector +import redis +from dotenv import load_dotenv +from elasticsearch import Elasticsearch +from minio import Minio + +from .root_path import get_root_folder + # 加载环境变量 -env_path = Path(__file__).parent.parent.parent / "docker" / ".env" +env_path = Path(get_root_folder()) / "docker" / ".env" load_dotenv(env_path) diff --git a/management/server/root_path.py b/management/server/root_path.py new file mode 100644 index 0000000..7942fd1 --- /dev/null +++ b/management/server/root_path.py @@ -0,0 +1,5 @@ +import os + + +def get_root_folder(): + return os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/pyproject.toml b/pyproject.toml index 9412269..d1e3530 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,9 +126,7 @@ dependencies = [ "trio>=0.29.0", "langfuse>=2.60.0", "debugpy>=1.8.13", - "mcp>=1.6.0", - "mysql-connector-python==9.2.0", - "redis==6.2.0" + "mcp>=1.6.0" ] [project.optional-dependencies] diff --git a/requirements.txt b/requirements.txt index e545a51..c394067 100644 --- a/requirements.txt +++ b/requirements.txt @@ -111,6 +111,4 @@ mini-racer>=0.12.4,<0.13.0 pyodbc>=5.2.0,<6.0.0 flasgger>=0.9.7.1,<0.10.0 xxhash>=3.5.0,<4.0.0 -trio>=0.29.0 -mysql-connector-python==9.2.0 -redis==6.2.0 \ No newline at end of file +trio>=0.29.0 \ No newline at end of file diff --git a/web/src/components/chunk_image/index.tsx b/web/src/components/chunk_image/index.tsx index 4b48e22..f490807 100644 --- a/web/src/components/chunk_image/index.tsx +++ b/web/src/components/chunk_image/index.tsx @@ -1,6 +1,8 @@ import { Popover } from 'antd'; import classNames from 'classnames'; +import api from '@/utils/api'; +import { useEffect, useState } from 'react'; import styles from './index.less'; interface IImage { @@ -9,14 +11,20 @@ interface IImage { } const ChunkImage = ({ id, className, ...props }: IImage) => { - const host = process.env.MINIO_VISIT_HOST || 'localhost'; - const port = process.env.MINIO_PORT || '9000'; - const imgSrc = `http://${host}:${port}/${id}`; - // 检查环境变量是否被正确读取 - console.log('MinIO Config:', { - host: process.env.MINIO_VISIT_HOST, - port: process.env.MINIO_PORT, - }); + // const host = process.env.MINIO_VISIT_HOST || 'localhost'; + // const port = process.env.MINIO_PORT || '9000'; + // const imgSrc = `http://${host}:${port}/${id}`; + const [imgSrc, setImgSrc] = useState(''); + + useEffect(() => { + fetch(api.minio_endpoint) + .then((res) => res.text()) + .catch(() => 'http://localhost:9000') + .then((minioUrl) => { + console.log('Minio URL:', minioUrl); + setImgSrc(`${minioUrl}/${id}`); + }); + }, [setImgSrc, id]); return (