QSSS_new / docs /hf_deployment_guide.md
misonL's picture
特性:实现对话框、表单、输入框、标签、下拉菜单、分隔线、骨架屏、滑块、表格、文本区域的 UI 组件
c78ce9e
|
Raw
History Blame Contribute Delete
9.62 kB

Hugging Face Space 部署指南

本指南将详细介绍如何将 QSSS 应用部署到 Hugging Face Space。

1. Hugging Face Space 创建步骤

  1. 登录 Hugging Face: 访问 Hugging Face 官网 并登录您的账户。如果您没有账户,请先注册。

  2. 创建新的 Space:

    • 点击页面右上角的个人头像,选择 "New Space"。
    • 填写 Space 名称 (例如: your-username/qsss-app)。
    • 选择一个许可证 (例如: MIT License)。
    • 选择 Space 类型: 推荐选择 Docker,因为我们将使用 Docker 容器进行部署。
    • 选择可见性: Public (公开) 或 Private (私有),根据您的需求选择。
    • 点击 "Create Space"。
  3. 克隆 Space 仓库: 创建 Space 后,您将看到一个页面,其中包含克隆仓库的 Git 命令。复制该命令并在本地终端执行,将 Space 仓库克隆到您的本地机器。

    git clone https://huggingface.co/spaces/your-username/your-space-name
    

2. Docker 容器配置说明 (多阶段构建)

为了优化镜像体积并整合前后端服务,我们采用了多阶段 Dockerfile 构建。这个 Dockerfile 将负责构建前端应用、后端应用,并最终将它们以及 Nginx 和 Supervisor 整合到一个轻量级的运行时镜像中。

以下是新的 Dockerfile 结构:

# 阶段1: Node镜像构建前端 (qsss-web)
FROM node:20-alpine AS frontend_builder

WORKDIR /app/qsss-web

# 复制前端依赖文件并安装
COPY qsss-web/package.json qsss-web/package-lock.json ./
RUN npm install --frozen-lockfile

# 复制前端所有代码
COPY qsss-web/ .

# 构建前端应用
RUN npm run build

# 阶段2: Python镜像构建后端
FROM python:3.9-slim-bookworm AS backend_builder

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    gcc \
    gfortran \
    wget \
    libssl-dev \
    ninja-build \
    libopenblas-dev \
    liblapack-dev \
    pkg-config \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 安装TA-Lib
RUN mkdir -p /ta-lib-build && cd /ta-lib-build && \
    wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \
    tar -xzf ta-lib-0.4.0-src.tar.gz && \
    cd ta-lib/ && \
    ./configure --prefix=/usr && \
    make && \
    make install && \
    # 创建兼容性符号链接解决库名称问题
    ln -s /usr/lib/libta_lib.so /usr/lib/libta-lib.so && \
    ln -s /usr/lib/libta_lib.so.0 /usr/lib/libta-lib.so.0 && \
    ldconfig && \
    cd / && \
    rm -rf /ta-lib-build

# 创建Python虚拟环境
ENV VIRTUAL_ENV=/app/backend_venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# 复制后端依赖文件并安装
COPY requirements.txt backend/requirements.txt ./
RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \
    pip install --no-cache-dir \
    Cython==0.29.36 \
    numpy==1.26.4 \
    pythran \
    pybind11 \
    versioneer \
    importlib-metadata==6.0.0 \
    zipp==3.15.0 && \
    pip install --no-cache-dir --no-build-isolation -r requirements.txt && \
    pip install --no-cache-dir --no-build-isolation -r backend/requirements.txt

# 复制后端代码
COPY backend/ backend/

# 阶段3: 运行时镜像整合前后端
FROM debian:bookworm-slim AS final

# 安装Nginx和Supervisor
RUN apt-get update && apt-get install -y \
    nginx \
    supervisor \
    ca-certificates \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 创建必要的目录
RUN mkdir -p /app/qsss-web/out \
           /app/backend \
           /app/backend_venv \
           /etc/nginx/sites-enabled \
           /var/log/supervisor

# 从前端构建阶段复制前端静态文件
COPY --from=frontend_builder /app/qsss-web/out /app/qsss-web/out

# 从后端构建阶段复制Python虚拟环境
COPY --from=backend_builder /app/backend_venv /app/backend_venv

# 从后端构建阶段复制后端代码
COPY --from=backend_builder /app/backend /app/backend

# 复制Nginx配置
COPY nginx.conf /etc/nginx/sites-enabled/default

# 复制Supervisor配置
COPY supervisord.conf /etc/supervisord.conf

# 设置环境变量
ENV DATABASE_URL=sqlite:///:memory: \
    REDIS_MODE=memory \
    SECRET_KEY=your_secret_key_here \
    ENVIRONMENT=production \
    MEMORY_MODE=true \
    PYTHONPATH=/app/backend:$PYTHONPATH

# 暴露端口
EXPOSE 7860

# 启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

Nginx 配置 (nginx.conf): Nginx 作为反向代理服务器,负责将外部请求路由到正确的前端或后端服务。

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name localhost;

        # 前端服务 (Next.js 构建输出)
        location / {
            root /app/qsss-web/out;
            try_files $uri $uri/ /index.html;
        }

        # 后端API服务
        location /api/ {
            proxy_pass http://127.0.0.1:7860/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Supervisor 配置 (supervisord.conf): Supervisor 用于管理 Nginx、前端和后端服务的进程,确保它们在容器内同时运行并自动重启。

[supervisord]
nodaemon=true

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
startretries=3
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:backend]
command=/app/backend_venv/bin/uvicorn backend.app.main:app --host 0.0.0.0 --port 7860
directory=/app/backend
autostart=true
autorestart=true
startretries=3
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:frontend]
command=npm run start --prefix /app/qsss-web
directory=/app/qsss-web
autostart=true
autorestart=true
startretries=3
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

重要提示:

  • 端口暴露: 容器内部的 Nginx 监听 80 端口,后端服务监听 7860 端口。Dockerfile 暴露 7860 端口,但 Hugging Face Space 会将外部请求路由到 80 端口,Nginx 会处理这些请求。
  • Hugging Face Space 兼容性: 这种单容器多服务部署方式兼容 Hugging Face Space 的单容器部署模型,同时实现了前后端和 Nginx 的整合。

3. 部署步骤

  1. 更新项目文件:

    • 将上述新的 Dockerfile 替换您项目根目录下的旧文件。
    • nginx.confsupervisord.conf 文件放置在您的项目根目录。
    • 确保 qsss-web/package.json 中的 start 脚本配置正确 (通常为 next start)。
  2. 提交并推送: 将所有更改提交到您的 Git 仓库并推送到 Hugging Face Space 远程仓库。

    git add .
    git commit -m "feat: Update Dockerfile for multi-stage build with Nginx and Supervisor"
    git push
    
  3. Hugging Face Space 自动构建: Hugging Face Space 会自动检测到您的仓库更新,并根据新的 Dockerfile 重新构建和部署您的应用。您可以在 Space 页面查看构建和运行日志。

4. 环境变量设置建议

在 Hugging Face Space 中,您可以通过 "Settings" -> "Space secrets" 来设置环境变量。这些变量在您的 Docker 容器中是可用的。

建议设置的环境变量包括:

  • DATABASE_URL: 数据库连接字符串 (如果使用外部数据库)。
  • SECRET_KEY: 用于 JWT 认证的密钥。
  • HF_TOKEN: 如果您的应用需要访问 Hugging Face Hub 上的私有模型或数据集,则需要设置此令牌。
  • 其他任何您的应用所需的配置参数。

示例:

变量名 建议值 说明
SECRET_KEY your_super_secret_key_here 用于认证和加密,请生成一个强随机字符串。
DATABASE_URL sqlite:///./sql_app.db 或您的外部数据库连接 数据库连接字符串。
HF_TOKEN hf_YOUR_TOKEN 访问 Hugging Face Hub 的令牌。

5. 常见问题排查

  • 应用无法启动:
    • 检查 Dockerfile 中的路径是否正确。
    • 查看 Hugging Face Space 的日志 (Logs 选项卡),查找错误信息。
    • 确保所有依赖都已正确安装。
    • 检查端口是否正确暴露 (通常是 7860,由 Nginx 代理)。
  • 环境变量未生效:
    • 确保您在 Hugging Face Space 的 "Settings" -> "Space secrets" 中正确设置了环境变量。
    • 检查您的应用代码是否正确读取了这些环境变量。
  • 内存或 CPU 不足:
    • Hugging Face Space 提供不同大小的硬件配置。如果您的应用需要更多资源,请考虑升级 Space 的硬件。
    • 优化您的代码,减少内存和 CPU 使用。
  • Git LFS 问题:
    • 如果您的仓库包含大文件 (例如模型权重),请确保您已正确配置 Git LFS。
    • 在克隆仓库后,运行 git lfs pull 来下载大文件。