wangdongxu

jira:NYJ-1460 desc:调整结构

# Git
.git
.gitignore
# IDE
.idea
.vscode
*.swp
*.swo
# Python
__pycache__
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
.venv
*.egg-info/
dist/
build/
# Virtual environments
.venv/
venv/
# Cache
.ruff_cache
.mypy_cache
.pytest_cache
.cache
# IDE
.idea/
.vscode/
*.swp
*.swo
# Logs
logs/
*.log
# Git
.git/
.gitignore
# Docker
dockerfiles/
Dockerfile
.dockerignore
# Logs
*.log
# Local configs
cfg/config.local.yaml
... ...
FROM python:3.12-slim
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai PROJECT_ROOT=/app ENV=docker APP_LOG_TYPE=file,console
# 使用 Debian 的阿里云镜像
RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list
# 安装系统依赖
RUN apt update && apt install -y --no-install-recommends gcc curl vim && rm -rf /var/lib/apt/lists/*
# 安装uv工具
RUN pip install --no-cache-dir uv
WORKDIR /app
COPY . .
RUN uv pip install --system --no-cache ".[es,postgres]"
EXPOSE 8000
CMD ["python", "main.py"]
\ No newline at end of file
# ============================================================================
# embedding-server Dockerfile
# ============================================================================
# 构建命令:
# docker build -f Dockerfile.embedding -t embedding-server:latest .
#
# 运行命令:
# docker run -d -p 8000:8000 --name embedding-server embedding-server:latest
# ============================================================================
ARG PYTHON_VERSION=3.12
#ARG UV_VERSION=0.6.0
# ----------------------------------------------------------------------------
# 构建阶段
# ----------------------------------------------------------------------------
FROM python:${PYTHON_VERSION}-slim AS builder
# 使用 Debian 的阿里云镜像
RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list
# 安装编译依赖和 uv
RUN apt-get update \
&& apt-get install -y --no-install-recommends gcc curl vim \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir uv
WORKDIR /app
# 复制项目文件(仅 embedding-server 所需)
COPY pyproject.toml uv.lock ./
COPY src/embedding_sever/ ./src/embedding_sever/
# 安装依赖:核心依赖 + embedding 专用依赖
RUN uv sync --no-dev --no-editable --extra embedding
# ----------------------------------------------------------------------------
# 运行阶段
# ----------------------------------------------------------------------------
FROM python:${PYTHON_VERSION}-slim
WORKDIR /app
# 从构建阶段复制虚拟环境和源码
COPY --from=builder /app/.venv /app/.venv
COPY --from=builder /app/src/embedding_sever /app/src/embedding_sever
# 环境变量
ENV PATH="/app/.venv/bin:$PATH"
ENV PYTHONPATH="/app/src"
ENV PROJECT_ROOT="/app/src"
ENV PYTHONUNBUFFERED=1
ENV ENV=prod
ENV APP_LOG_TYPE=file,console
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/')" || exit 1
CMD ["embedding-server"]
... ...
FROM baselib/aigc-embedding-service:base26402
ENV PROJECT_ROOT=/app ENV=docker APP_LOG_TYPE=file,console
WORKDIR /app
# 复制代码文件
COPY . .
EXPOSE 8000
CMD ["python", "main.py"]
# 基础镜像 - 安装依赖
FROM python:3.12-slim
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 使用 Debian 的阿里云镜像
RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends gcc curl vim && rm -rf /var/lib/apt/lists/*
# 安装uv工具
RUN pip install --no-cache-dir uv
WORKDIR /app
# 复制依赖文件(从构建上下文根目录复制)
COPY pyproject.toml uv.lock ./
RUN uv pip install --system --no-cache ".[es,postgres]"
\ No newline at end of file
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "aigc-embedding-service"
name = "ai_server"
version = "0.1.0"
description = "基于向量的CRUD服务,支持多种Embedding场景"
description = "Add your description here"
requires-python = ">=3.12"
dependencies = [
"fastapi==0.135.3",
"uvicorn[standard]==0.42.0",
"pydantic==2.12.5",
"numpy>=1.24.0",
"aiohttp>=3.8.0",
"aabd==0.4.3",
"path==17.1.1",
"omegaconf==2.3.0",
"elasticsearch>=9.3.0",
"packaging==26.0",
"aiohttp==3.13.5",
]
[project.optional-dependencies]
dev = [
"pytest>=8.3.0",
"pytest-asyncio>=0.24.0",
"black>=24.10.0",
"ruff>=0.7.0",
"mypy>=1.13.0",
]
es = [
# embedding-server 专用依赖
embedding = [
"elasticsearch==9.3.0",
]
postgres = [
"psycopg[binary,pool]==3.3.3",
"psycopg-pool==3.3.0",
]
# task-server 专用依赖
task = [
[tool.black]
line-length = 100
target-version = ['py312']
[tool.ruff]
line-length = 100
select = ["E", "F", "I", "N", "W", "UP", "B", "C4", "SIM"]
ignore = ["E501"]
]
[tool.mypy]
python_version = "3.12"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
[tool.uv]
package = true
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
[tool.hatch.build.targets.wheel]
packages = ["src/embedding_sever"]
[tool.setuptools]
packages = []
[project.scripts]
embedding-server = "embedding_sever.main:main"
#task-server = "task_server.main:main"
\ No newline at end of file
... ...
from typing import List, Optional, Literal, Union, Dict, Any, Annotated
from typing import List, Optional, Literal, Union, Dict, Any
from fastapi import APIRouter, Depends
import numpy
from pydantic import BaseModel, Field, TypeAdapter
from api.resp_bean import RespBean, success
from embedding_sever.api.resp_bean import RespBean, success
router = APIRouter()
... ... @@ -89,8 +89,8 @@ class SearchResponseData(BaseModel):
# ============== 接口定义 ==============
from service.data_service import DataService
from service import get_data_service
from embedding_sever.service.data_service import DataService
from embedding_sever.service import get_data_service
@router.put("/{type}/put", response_model=RespBean, tags=["数据服务"], summary="写入数据")
... ...
from fastapi.middleware.cors import CORSMiddleware
from starlette.responses import JSONResponse
from api.http_log import LoggingMiddleware
from embedding_sever.api.http_log import LoggingMiddleware
from fastapi import FastAPI
from api.router import api_router
from config import settings
from embedding_sever.api.router import api_router
from embedding_sever.config import settings
def config_fastapi(fastapi_app: FastAPI):
... ...
... ... @@ -6,7 +6,7 @@ logger = logging.getLogger(__name__)
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import StreamingResponse
from config import settings
from embedding_sever.config import settings
class LoggingMiddleware(BaseHTTPMiddleware):
... ...
from fastapi import APIRouter
from config import settings
from api.data_router import router as data_router
from embedding_sever.config import settings
from embedding_sever.api.data_router import router as data_router
api_router = APIRouter(prefix=settings.url_prefix)
... ...
app_name: "Embedding Service"
app_version: "1.0.0"
port: 8000
debug: false
url_prefix: "/aigc-embedding/api"
db_es_enable: true
db_es_url: "http://192.168.0.14:9200"
#db_postgres_enable: false
#db_postgres_url: "postgresql://postgres:postgres@localhost:5432/postgres"
\ No newline at end of file
... ...
app_name: "Embedding Service"
app_version: "1.0.0"
port: 8000
debug: false
url_prefix: "/aigc-embedding/api"
db_es_enable: true
db_es_url: "http://localhost:9200"
#db_postgres_enable: false
#db_postgres_url: "postgresql://postgres:postgres@localhost:5432/postgres"
\ No newline at end of file
... ...
... ... @@ -2,7 +2,7 @@ from functools import lru_cache
from elasticsearch import AsyncElasticsearch
from config import settings
from embedding_sever.config import settings
from .data_dao import DataDao
es_client = None
... ...
... ... @@ -2,8 +2,7 @@
from typing import Any, Optional
from config import settings
from db.base import VectorDBClient
from embedding_sever.db.base import VectorDBClient
class ElasticsearchClient(VectorDBClient):
... ...
... ... @@ -2,7 +2,7 @@
from typing import Any, Optional
from db.base import VectorDBClient
from embedding_sever.db.base import VectorDBClient
class PostgresClient(VectorDBClient):
... ...
... ... @@ -11,9 +11,9 @@ logger = get_logger(__name__)
from contextlib import asynccontextmanager
from typing import AsyncGenerator
from fastapi import FastAPI
from api.http_config import config_fastapi
from config import settings
from db import connect as db_client_connect, disconnect as db_client_disconnect
from embedding_sever.api.http_config import config_fastapi
from embedding_sever.config import settings
from embedding_sever.db import connect as db_client_connect, disconnect as db_client_disconnect
@asynccontextmanager
... ... @@ -48,7 +48,8 @@ app = FastAPI(
)
config_fastapi(app)
if __name__ == "__main__":
def main():
"""应用入口函数."""
import uvicorn
logger.info(f'docs_url: http://127.0.0.1:{settings.port}/docs')
... ... @@ -59,3 +60,7 @@ if __name__ == "__main__":
reload=settings.debug,
log_config=None
)
if __name__ == "__main__":
main()
... ...
from functools import lru_cache
from db import get_data_dao
from embedding_sever.db import get_data_dao
from .data_service import DataService
... ...
import logging
from db import DataDao
from embedding_sever.db import DataDao
logger = logging.getLogger(__name__)
... ...
This diff could not be displayed because it is too large.