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 官网](https://huggingface.co/) 并登录您的账户。如果您没有账户,请先注册。
2. **创建新的 Space**:
* 点击页面右上角的个人头像,选择 "New Space"。
* 填写 Space 名称 (例如: `your-username/qsss-app`)。
* 选择一个许可证 (例如: `MIT License`)。
* 选择 Space 类型: 推荐选择 `Docker`,因为我们将使用 Docker 容器进行部署。
* 选择可见性: `Public` (公开) 或 `Private` (私有),根据您的需求选择。
* 点击 "Create Space"。
3. **克隆 Space 仓库**: 创建 Space 后,您将看到一个页面,其中包含克隆仓库的 Git 命令。复制该命令并在本地终端执行,将 Space 仓库克隆到您的本地机器。
```bash
git clone https://huggingface.co/spaces/your-username/your-space-name
```
## 2. Docker 容器配置说明 (多阶段构建)
为了优化镜像体积并整合前后端服务,我们采用了多阶段 Dockerfile 构建。这个 `Dockerfile` 将负责构建前端应用、后端应用,并最终将它们以及 Nginx 和 Supervisor 整合到一个轻量级的运行时镜像中。
以下是新的 `Dockerfile` 结构:
```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 作为反向代理服务器,负责将外部请求路由到正确的前端或后端服务。
```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、前端和后端服务的进程,确保它们在容器内同时运行并自动重启。
```ini
[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.conf``supervisord.conf` 文件放置在您的项目根目录。
* 确保 `qsss-web/package.json` 中的 `start` 脚本配置正确 (通常为 `next start`)。
2. **提交并推送**: 将所有更改提交到您的 Git 仓库并推送到 Hugging Face Space 远程仓库。
```bash
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` 来下载大文件。