OpenCode Deployer
commited on
Commit
·
ec2e14a
1
Parent(s):
853b993
feat: 初始化 HuggingFace Space Docker + FastAPI 项目
Browse files- 基于 Node.js 20 LTS + Python 3.12 的多阶段 Docker 构建
- 实现最简 FastAPI 服务(/, /health, /info 端点)
- 配置 HuggingFace Space 元数据(端口 7860)
- 添加项目管理和部署脚本
- 完整的生产配置(Gunicorn + UvicornWorker)
- .env.example +7 -0
- .gitignore +60 -0
- .sisyphus/plans/hfbase-fastapi-implementation.md +355 -0
- Dockerfile +54 -0
- Makefile +50 -0
- README copy.md +10 -0
- README.md +42 -5
- app.py +40 -0
- push.sh +23 -0
- requirements.txt +3 -0
- setup_hf.sh +29 -0
.env.example
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# HuggingFace 配置
|
| 2 |
+
HF_ENDPOINT=https://hf-mirror.com
|
| 3 |
+
HF_TOKEN=your_token_here
|
| 4 |
+
|
| 5 |
+
# 应用配置
|
| 6 |
+
APP_HOST=0.0.0.0
|
| 7 |
+
APP_PORT=7860
|
.gitignore
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
*$py.class
|
| 5 |
+
|
| 6 |
+
# macOS
|
| 7 |
+
.DS_Store
|
| 8 |
+
.AppleDouble
|
| 9 |
+
.LSOverride
|
| 10 |
+
Icon?
|
| 11 |
+
|
| 12 |
+
# Windows
|
| 13 |
+
Thumbs.db
|
| 14 |
+
ehthumbs.db
|
| 15 |
+
Desktop.ini
|
| 16 |
+
|
| 17 |
+
# Linux
|
| 18 |
+
*~
|
| 19 |
+
|
| 20 |
+
# Node.js
|
| 21 |
+
node_modules/
|
| 22 |
+
npm-debug.log*
|
| 23 |
+
yarn-debug.log*
|
| 24 |
+
yarn-error.log*
|
| 25 |
+
|
| 26 |
+
# IDE
|
| 27 |
+
.vscode/
|
| 28 |
+
.idea/
|
| 29 |
+
*.swp
|
| 30 |
+
*.swo
|
| 31 |
+
*~
|
| 32 |
+
|
| 33 |
+
# Logs
|
| 34 |
+
logs/
|
| 35 |
+
*.log
|
| 36 |
+
|
| 37 |
+
# Runtime data
|
| 38 |
+
pids/
|
| 39 |
+
*.pid
|
| 40 |
+
*.seed
|
| 41 |
+
*.pid.lock
|
| 42 |
+
|
| 43 |
+
# Coverage directory used by tools like istanbul
|
| 44 |
+
coverage/
|
| 45 |
+
|
| 46 |
+
# Docker
|
| 47 |
+
.dockerignore
|
| 48 |
+
|
| 49 |
+
# Environment variables
|
| 50 |
+
.env
|
| 51 |
+
.env.local
|
| 52 |
+
.env.development.local
|
| 53 |
+
.env.test.local
|
| 54 |
+
.env.production.local
|
| 55 |
+
|
| 56 |
+
# Temporary files
|
| 57 |
+
tmp/
|
| 58 |
+
temp/
|
| 59 |
+
*.tmp
|
| 60 |
+
*.temp
|
.sisyphus/plans/hfbase-fastapi-implementation.md
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# HuggingFace Space Docker + FastAPI 项目实施计划
|
| 2 |
+
|
| 3 |
+
## 项目概述
|
| 4 |
+
|
| 5 |
+
### 目标
|
| 6 |
+
构建基于 Node.js 20 LTS + Python 3.12 的多阶段 Docker 镜像,部署 FastAPI 最简 API 服务到 HuggingFace Spaces,使用 HuggingFace CLI 进行项目管理。
|
| 7 |
+
|
| 8 |
+
### 技术栈
|
| 9 |
+
- **Node.js**: 20 LTS(用于构建阶段)
|
| 10 |
+
- **Python**: 3.12(运行时)
|
| 11 |
+
- **Web框架**: FastAPI + Uvicorn
|
| 12 |
+
- **生产服务器**: Gunicorn + UvicornWorker
|
| 13 |
+
- **部署平台**: HuggingFace Spaces (Docker SDK)
|
| 14 |
+
- **端口**: 7860(HuggingFace 标准)
|
| 15 |
+
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
## 工作目标
|
| 19 |
+
|
| 20 |
+
### 核心目标
|
| 21 |
+
创建一个可在 HuggingFace Spaces 上运行的 FastAPI 服务,具备基础的 API 功能和完整的部署流程。
|
| 22 |
+
|
| 23 |
+
### 具体交付物
|
| 24 |
+
- `Dockerfile` - 多阶段构建配置
|
| 25 |
+
- `app.py` - FastAPI 应用入口
|
| 26 |
+
- `requirements.txt` - Python 依赖管理
|
| 27 |
+
- `README.md` - 更新 HuggingFace Space 元数据
|
| 28 |
+
- `package.json` - Node.js 构建配置(如需要)
|
| 29 |
+
- `.dockerignore` - Docker 构建优化
|
| 30 |
+
|
| 31 |
+
### 完成标准
|
| 32 |
+
- [ ] Docker 镜像成功构建且大小合理
|
| 33 |
+
- [ ] FastAPI 服务在本地可正常运行
|
| 34 |
+
- [ ] HuggingFace CLI 可成功部署到 Spaces
|
| 35 |
+
- [ ] API 响应正常,文档页面可访问
|
| 36 |
+
|
| 37 |
+
### 必须包含
|
| 38 |
+
- 非 root 用户安全配置
|
| 39 |
+
- 多阶段构建优化
|
| 40 |
+
- 健康检查端点 `/health`
|
| 41 |
+
- 基础错误处理
|
| 42 |
+
- HuggingFace Space 配置
|
| 43 |
+
|
| 44 |
+
### 明确排除(Guardrails)
|
| 45 |
+
- 数据库集成(第一步不包含)
|
| 46 |
+
- 复杂的身份验证系统
|
| 47 |
+
- 文件上传功能
|
| 48 |
+
- HuggingFace 模型集成
|
| 49 |
+
- 前端界面构建
|
| 50 |
+
|
| 51 |
+
---
|
| 52 |
+
|
| 53 |
+
## 验证策略
|
| 54 |
+
|
| 55 |
+
### 测试基础设施
|
| 56 |
+
- **基础设施存在**: 否
|
| 57 |
+
- **用户测试选择**: 手动验证
|
| 58 |
+
- **框架**: 基础 curl/httpie 验证
|
| 59 |
+
|
| 60 |
+
### 手动 QA 程序
|
| 61 |
+
每个任务包含详细的验证步骤:
|
| 62 |
+
- Docker 构建验证
|
| 63 |
+
- 本地服务启动验证
|
| 64 |
+
- API 端点响应验证
|
| 65 |
+
- HuggingFace 部署验证
|
| 66 |
+
|
| 67 |
+
---
|
| 68 |
+
|
| 69 |
+
## 任务流程
|
| 70 |
+
|
| 71 |
+
```
|
| 72 |
+
准备阶段 → 构建配置 → 应用开发 → 本地测试 → 部署配置 → 部署验证
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
---
|
| 76 |
+
|
| 77 |
+
## 并行化能力
|
| 78 |
+
|
| 79 |
+
| 组 | 任务 | 原因 |
|
| 80 |
+
|---|---|---|
|
| 81 |
+
| A | 2, 3 | 独立配置文件 |
|
| 82 |
+
|
| 83 |
+
---
|
| 84 |
+
|
| 85 |
+
## TODOs
|
| 86 |
+
|
| 87 |
+
- [ ] 1. 创建项目基础结构和配置文件
|
| 88 |
+
|
| 89 |
+
**做什么**:
|
| 90 |
+
- 创建 `requirements.txt` 包含 FastAPI 和 Uvicorn
|
| 91 |
+
- 创建 `.dockerignore` 优化构建
|
| 92 |
+
- 准备基础项目目录结构
|
| 93 |
+
|
| 94 |
+
**禁止做**:
|
| 95 |
+
- 不要添加不必要的 Python 库
|
| 96 |
+
- 不要包含前端构建文件(除非明确需要)
|
| 97 |
+
|
| 98 |
+
**可并行**: 否
|
| 99 |
+
|
| 100 |
+
**参考文件**:
|
| 101 |
+
**模式引用**:
|
| 102 |
+
- 无现有模式(新项目)
|
| 103 |
+
|
| 104 |
+
**API/类型引用**:
|
| 105 |
+
- FastAPI 标准应用结构: `from fastapi import FastAPI`
|
| 106 |
+
- Uvicorn 启动模式: `uvicorn.run(app, host="0.0.0.0", port=7860)`
|
| 107 |
+
|
| 108 |
+
**文档引用**:
|
| 109 |
+
- HuggingFace Spaces Docker 文档: https://huggingface.co/docs/hub/spaces-sdks-docker
|
| 110 |
+
- FastAPI 官方教程: https://fastapi.tiangolo.com/tutorial/
|
| 111 |
+
|
| 112 |
+
**外部参考**:
|
| 113 |
+
- FastAPI 最小应用示例: https://fastapi.tiangolo.com/tutorial/first-steps/
|
| 114 |
+
- HuggingFace Space README 配置: title, emoji, colorFrom, colorTo, sdk: docker
|
| 115 |
+
|
| 116 |
+
**验收标准**:
|
| 117 |
+
**手动验证**:
|
| 118 |
+
- [ ] 创建文件: `requirements.txt`, `.dockerignore`
|
| 119 |
+
- [ ] `requirements.txt` 包含: `fastapi>=0.104.0`, `uvicorn[standard]>=0.24.0`
|
| 120 |
+
- [ ] `.dockerignore` 包含: `.git`, `README.md`, `.dockerignore`
|
| 121 |
+
- [ ] 文件语法验证: `cat requirements.txt` → 无错误
|
| 122 |
+
|
| 123 |
+
- [ ] 2. 创建多阶段 Dockerfile
|
| 124 |
+
|
| 125 |
+
**做什么**:
|
| 126 |
+
- 第一阶段: Node.js 20 LTS 环境
|
| 127 |
+
- 第二阶段: Python 3.12 运行时环境
|
| 128 |
+
- 非 root 用户配置
|
| 129 |
+
- 安全和性能优化
|
| 130 |
+
|
| 131 |
+
**禁止做**:
|
| 132 |
+
- 不要使用 `latest` 标签
|
| 133 |
+
- 不要以 root 用户运行应用
|
| 134 |
+
- 不要包含构建工具在最终镜像
|
| 135 |
+
|
| 136 |
+
**可并行**: 是(与任务 3)
|
| 137 |
+
|
| 138 |
+
**参考文件**:
|
| 139 |
+
**模式引用**:
|
| 140 |
+
- Dockerfile 多阶段构建最佳实践: 研究发现的 Node.js + Python 组合模式
|
| 141 |
+
|
| 142 |
+
**文档引用**:
|
| 143 |
+
- Docker 官方多阶段构建文档
|
| 144 |
+
- HuggingFace Spaces Docker 要求: 端口 7860,非 root 用户
|
| 145 |
+
|
| 146 |
+
**外部参考**:
|
| 147 |
+
- Node.js 官方 Docker 镜像: `node:20-alpine`
|
| 148 |
+
- Python 官方 Docker 镜像: `python:3.12-slim`
|
| 149 |
+
- FastAPI 生产部署模式: `gunicorn -k uvicorn.workers.UvicornWorker`
|
| 150 |
+
|
| 151 |
+
**验收标准**:
|
| 152 |
+
**手动验证**:
|
| 153 |
+
- [ ] 构建: `docker build -t hfbase-fastapi .` → 成功无错误
|
| 154 |
+
- [ ] 镜像大小: `docker images hfbase-fastapi` → < 1GB
|
| 155 |
+
- [ ] 安全检查: `docker run --rm hfbase-fastapi whoami` → 显示非 root 用户
|
| 156 |
+
- [ ] 端口暴露: `docker inspect hfbase-fastapi` → ExposedPort 7860
|
| 157 |
+
|
| 158 |
+
- [ ] 3. 实现 FastAPI 最简应用
|
| 159 |
+
|
| 160 |
+
**做什么**:
|
| 161 |
+
- 创建 `app.py` 作为应用入口
|
| 162 |
+
- 实现基础的 GET `/` 和 `/health` 端点
|
| 163 |
+
- 配置生产服务器启动命令
|
| 164 |
+
- 添加基础的错误处理
|
| 165 |
+
|
| 166 |
+
**禁止做**:
|
| 167 |
+
- 不要添加复杂的路由或业务逻辑
|
| 168 |
+
- 不要包含数据库连接
|
| 169 |
+
- 不要添加身份验证
|
| 170 |
+
|
| 171 |
+
**可并行**: 是(与任务 2)
|
| 172 |
+
|
| 173 |
+
**参考文件**:
|
| 174 |
+
**模式引用**:
|
| 175 |
+
- FastAPI 标准应用结构: `app = FastAPI()`, `@app.get("/")`
|
| 176 |
+
|
| 177 |
+
**API/类型引用**:
|
| 178 |
+
- FastAPI 响应模型: `from pydantic import BaseModel`
|
| 179 |
+
- HTTP 状态码: `from fastapi import status`
|
| 180 |
+
|
| 181 |
+
**文档引用**:
|
| 182 |
+
- FastAPI 第一个步骤教程
|
| 183 |
+
- Uvicorn 配置选项文档
|
| 184 |
+
|
| 185 |
+
**外部参考**:
|
| 186 |
+
- FastAPI 最小应用: `from fastapi import FastAPI; app = FastAPI()`
|
| 187 |
+
- Gunicorn + UvicornWorker 生产配置
|
| 188 |
+
|
| 189 |
+
**验收标准**:
|
| 190 |
+
**手动验证**:
|
| 191 |
+
- [ ] 语法检查: `python -m py_compile app.py` → 无语法错误
|
| 192 |
+
- [ ] 本地运行: `uvicorn app:app --host 0.0.0.0 --port 7860` → 服务启动成功
|
| 193 |
+
- [ ] 根端点: `curl http://localhost:7860/` → 返回 JSON 响应
|
| 194 |
+
- [ ] 健康检查: `curl http://localhost:7860/health` → 返回 `{"status": "ok"}`
|
| 195 |
+
|
| 196 |
+
- [ ] 4. 配置 HuggingFace Space 元数据
|
| 197 |
+
|
| 198 |
+
**做什么**:
|
| 199 |
+
- 更新 `README.md` 包含 HuggingFace Space 前置元数据
|
| 200 |
+
- 配置 `app_port: 7860`
|
| 201 |
+
- 设置合适的标题、表情符号和颜色
|
| 202 |
+
- 添加部署说明文档
|
| 203 |
+
|
| 204 |
+
**禁止做**:
|
| 205 |
+
- 不要移除现有的 Git LFS 配置
|
| 206 |
+
- 不要添加不必要的元数据字段
|
| 207 |
+
|
| 208 |
+
**可并行**: 否
|
| 209 |
+
|
| 210 |
+
**参考文件**:
|
| 211 |
+
**现有文件**:
|
| 212 |
+
- `README.md` - 当前基础配置
|
| 213 |
+
|
| 214 |
+
**文档引用**:
|
| 215 |
+
- HuggingFace Spaces 配置参考: https://huggingface.co/docs/hub/spaces-config-reference
|
| 216 |
+
|
| 217 |
+
**外部参考**:
|
| 218 |
+
- Space YAML frontmatter 格式: `title`, `emoji`, `colorFrom`, `colorTo`, `sdk`, `pinned`, `app_port`
|
| 219 |
+
|
| 220 |
+
**验收标准**:
|
| 221 |
+
**手动验证**:
|
| 222 |
+
- [ ] YAML 语法验证: `head -10 README.md` → 无语法错误
|
| 223 |
+
- [ ] 元数据完整: `title`, `emoji`, `colorFrom`, `colorTo`, `sdk: docker`, `app_port: 7860`
|
| 224 |
+
- [ ] HuggingFace 解析: 可被 HuggingFace 正确解析元数据
|
| 225 |
+
|
| 226 |
+
- [ ] 5. 设置 HuggingFace CLI 管理流程
|
| 227 |
+
|
| 228 |
+
**做什么**:
|
| 229 |
+
- 安装和配置 HuggingFace CLI
|
| 230 |
+
- 创建 Space 仓库连接
|
| 231 |
+
- 配置部署脚本或 Makefile
|
| 232 |
+
- 设置 Git 远程仓库
|
| 233 |
+
|
| 234 |
+
**禁止做**:
|
| 235 |
+
- 不要提交敏感信息到版本控制
|
| 236 |
+
- 不要使用 commit 时自动部署(除非明确要求)
|
| 237 |
+
|
| 238 |
+
**可并行**: 否
|
| 239 |
+
|
| 240 |
+
**参考文件**:
|
| 241 |
+
**模式引用**:
|
| 242 |
+
- HuggingFace CLI 标准工作流程: `huggingface-cli login`, `huggingface-cli repo create`
|
| 243 |
+
|
| 244 |
+
**文档引用**:
|
| 245 |
+
- HuggingFace CLI 官方文档
|
| 246 |
+
- Spaces 部署指南
|
| 247 |
+
|
| 248 |
+
**外部参考**:
|
| 249 |
+
- CLI 安装: `pip install huggingface_hub`
|
| 250 |
+
- 登录命令: `huggingface-cli login --token`
|
| 251 |
+
|
| 252 |
+
**验收标准**:
|
| 253 |
+
**手动验证**:
|
| 254 |
+
- [ ] CLI 安装: `huggingface-cli --version` → 显示版本号
|
| 255 |
+
- [ ] 登录状态: `huggingface-cli whoami` → 显示用户名
|
| 256 |
+
- [ ] Git 配置: `git remote -v` → 显示 huggingface 远程仓库
|
| 257 |
+
- [ ] Space 创建: `huggingface-cli space list` → 显示新创建的 space
|
| 258 |
+
|
| 259 |
+
- [ ] 6. 端到端部署验证
|
| 260 |
+
|
| 261 |
+
**做什么**:
|
| 262 |
+
- 使用 HuggingFace CLI 部署到 Spaces
|
| 263 |
+
- 验证线上服务正常运行
|
| 264 |
+
- 测试所有 API 端点
|
| 265 |
+
- 检查部署日志和状态
|
| 266 |
+
|
| 267 |
+
**禁止做**:
|
| 268 |
+
- 不要跳过任何验证步骤
|
| 269 |
+
- 不要在验证未通过时继续下一步
|
| 270 |
+
|
| 271 |
+
**可并行**: 否
|
| 272 |
+
|
| 273 |
+
**参考文件**:
|
| 274 |
+
**模式引用**:
|
| 275 |
+
- HuggingFace 部署流程: `git push` 触发自动构建
|
| 276 |
+
|
| 277 |
+
**文档引用**:
|
| 278 |
+
- HuggingFace Spaces 构建和部署文档
|
| 279 |
+
|
| 280 |
+
**验收标准**:
|
| 281 |
+
**手动验证**:
|
| 282 |
+
- [ ] 推送成功: `git push origin main` → 无错误,开始构建
|
| 283 |
+
- [ ] 构建状态: Spaces 页面显示 "Running" 状态
|
| 284 |
+
- [ ] API 可访问: 浏览器访问 space URL → 可访问
|
| 285 |
+
- [ ] 端点测试: `curl https://<space-url>/health` → 返回 `{"status": "ok"}`
|
| 286 |
+
- [ ] 文档页面: 访问 `https://<space-url>/docs` → FastAPI 文档正常显示
|
| 287 |
+
|
| 288 |
+
---
|
| 289 |
+
|
| 290 |
+
## 提交策略
|
| 291 |
+
|
| 292 |
+
| 任务后 | 提交消息 | 文件 | 验证 |
|
| 293 |
+
|--------|----------|------|------|
|
| 294 |
+
| 1 | `feat: add basic project configuration` | requirements.txt, .dockerignore | docker build 语法检查 |
|
| 295 |
+
| 2 | `feat: implement multi-stage Dockerfile` | Dockerfile | docker build 成功 |
|
| 296 |
+
| 3 | `feat: create minimal FastAPI application` | app.py | uvicorn 启动成功 |
|
| 297 |
+
| 4 | `feat: configure HuggingFace Space metadata` | README.md | YAML 语法检查 |
|
| 298 |
+
| 5 | `feat: setup HuggingFace CLI workflow` | Makefile/deploy.sh | CLI 登录验证 |
|
| 299 |
+
| 6 | `chore: complete initial deployment` | 部署配置更新 | 线上访问验证 |
|
| 300 |
+
|
| 301 |
+
---
|
| 302 |
+
|
| 303 |
+
## 成功标准
|
| 304 |
+
|
| 305 |
+
### 验证命令
|
| 306 |
+
```bash
|
| 307 |
+
# 本地验证
|
| 308 |
+
docker build -t hfbase-fastapi .
|
| 309 |
+
docker run -p 7860:7860 hfbase-fastapi
|
| 310 |
+
curl http://localhost:7860/health
|
| 311 |
+
|
| 312 |
+
# HuggingFace 部署验证
|
| 313 |
+
huggingface-cli space list
|
| 314 |
+
git push origin main
|
| 315 |
+
curl https://<space-url>/health
|
| 316 |
+
```
|
| 317 |
+
|
| 318 |
+
### 最终检查清单
|
| 319 |
+
- [ ] 所有 "必须包含" 功能已实现
|
| 320 |
+
- [ ] 所有 "明确排除" 功能未包含
|
| 321 |
+
- [ ] Docker 镜像大小合理
|
| 322 |
+
- [ ] HuggingFace Space 正常运行
|
| 323 |
+
- [ ] API 端点响应正确
|
| 324 |
+
- [ ] 安全配置(非 root 用户)正确
|
| 325 |
+
- [ ] CLI 管理流程可工作
|
| 326 |
+
|
| 327 |
+
---
|
| 328 |
+
|
| 329 |
+
## 风险和注意事项
|
| 330 |
+
|
| 331 |
+
### 潜在问题
|
| 332 |
+
1. **Node.js 多阶段构建复杂性** - 可能不需要 Node.js,需确认具体用途
|
| 333 |
+
2. **HuggingFace Space 构建限制** - 可能有内存或时间限制
|
| 334 |
+
3. **端口绑定冲突** - 确保 7860 端口正确暴露
|
| 335 |
+
|
| 336 |
+
### 回滚策略
|
| 337 |
+
- 保持基础工作的 `requirements.txt` 简单
|
| 338 |
+
- 使用明确的版本号避免依赖冲突
|
| 339 |
+
- 保留构建成功的 Docker 镜像标签
|
| 340 |
+
|
| 341 |
+
---
|
| 342 |
+
|
| 343 |
+
## 后续扩展方向
|
| 344 |
+
|
| 345 |
+
### 可能的下一步
|
| 346 |
+
1. 添加更多 API 端点
|
| 347 |
+
2. 集成 HuggingFace 模型
|
| 348 |
+
3. 添加身份验证
|
| 349 |
+
4. 数据库集成
|
| 350 |
+
5. 前端界面
|
| 351 |
+
|
| 352 |
+
### 架构考虑
|
| 353 |
+
- 保持当前的模块化结构
|
| 354 |
+
- 为后续功能预留配置空间
|
| 355 |
+
- 维护简单性原则
|
Dockerfile
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 第一阶段:Node.js 20 LTS 构建环境
|
| 2 |
+
FROM node:20-alpine AS node-builder
|
| 3 |
+
|
| 4 |
+
WORKDIR /app
|
| 5 |
+
|
| 6 |
+
# 如果有 Node.js 依赖,在这里安装
|
| 7 |
+
# COPY package*.json ./
|
| 8 |
+
# RUN npm ci --only=production
|
| 9 |
+
|
| 10 |
+
# 第二阶段:Python 3.12 构建环境
|
| 11 |
+
FROM python:3.12-slim AS python-builder
|
| 12 |
+
|
| 13 |
+
WORKDIR /app
|
| 14 |
+
|
| 15 |
+
# 安装构建依赖
|
| 16 |
+
RUN apt-get update && apt-get install -y \
|
| 17 |
+
gcc \
|
| 18 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 19 |
+
|
| 20 |
+
# 复制并安装 Python 依赖
|
| 21 |
+
COPY requirements.txt .
|
| 22 |
+
RUN pip install --no-cache-dir --user -r requirements.txt
|
| 23 |
+
|
| 24 |
+
# 第三阶段:生产运行环境
|
| 25 |
+
FROM python:3.12-slim AS production
|
| 26 |
+
|
| 27 |
+
# 设置环境变量
|
| 28 |
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
| 29 |
+
PYTHONUNBUFFERED=1 \
|
| 30 |
+
PATH="/home/user/.local/bin:$PATH"
|
| 31 |
+
|
| 32 |
+
# 创建非 root 用户
|
| 33 |
+
RUN useradd --create-home --shell /bin/bash user
|
| 34 |
+
|
| 35 |
+
WORKDIR /app
|
| 36 |
+
|
| 37 |
+
# 从构建阶段复制 Python 包
|
| 38 |
+
COPY --from=python-builder /root/.local /home/user/.local
|
| 39 |
+
|
| 40 |
+
# 复制应用代码
|
| 41 |
+
COPY --chown=user . .
|
| 42 |
+
|
| 43 |
+
# 切换到非 root 用户
|
| 44 |
+
USER user
|
| 45 |
+
|
| 46 |
+
# 暴露 HuggingFace 标准端口
|
| 47 |
+
EXPOSE 7860
|
| 48 |
+
|
| 49 |
+
# 健康检查
|
| 50 |
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
| 51 |
+
CMD curl -f http://localhost:7860/health || exit 1
|
| 52 |
+
|
| 53 |
+
# 启动命令
|
| 54 |
+
CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-w", "1", "-b", "0.0.0.0:7860", "app:app"]
|
Makefile
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.PHONY: help install build run deploy push
|
| 2 |
+
|
| 3 |
+
# 默认目标
|
| 4 |
+
help:
|
| 5 |
+
@echo "可用的 make 命令:"
|
| 6 |
+
@echo " make install - 安装 HuggingFace CLI"
|
| 7 |
+
@echo " make build - 构建 Docker 镜像"
|
| 8 |
+
@echo " make run - 本地运行服务"
|
| 9 |
+
@echo " make test - 测试 API 端点"
|
| 10 |
+
@echo " make deploy - 部署到 HuggingFace Spaces"
|
| 11 |
+
@echo " make push - 推送到 Git 仓库"
|
| 12 |
+
|
| 13 |
+
# 安装 HuggingFace CLI
|
| 14 |
+
install:
|
| 15 |
+
pip install -U "huggingface_hub[cli]"
|
| 16 |
+
@echo "HuggingFace CLI 安装完成!"
|
| 17 |
+
@echo "请运行: huggingface-cli login --token YOUR_TOKEN"
|
| 18 |
+
|
| 19 |
+
# 构建 Docker 镜像
|
| 20 |
+
build:
|
| 21 |
+
docker build -t hfbase-api .
|
| 22 |
+
|
| 23 |
+
# 本地运行服务
|
| 24 |
+
run:
|
| 25 |
+
docker run -p 7860:7860 hfbase-api
|
| 26 |
+
|
| 27 |
+
# 测试 API 端点
|
| 28 |
+
test:
|
| 29 |
+
@echo "测试根端点..."
|
| 30 |
+
@curl -s http://localhost:7860/ | jq .
|
| 31 |
+
@echo ""
|
| 32 |
+
@echo "测试健康检查..."
|
| 33 |
+
@curl -s http://localhost:7860/health | jq .
|
| 34 |
+
@echo ""
|
| 35 |
+
@echo "测试系统信息..."
|
| 36 |
+
@curl -s http://localhost:7860/info | jq .
|
| 37 |
+
|
| 38 |
+
# 部署到 HuggingFace Spaces(先确保已登录)
|
| 39 |
+
deploy:
|
| 40 |
+
@git status
|
| 41 |
+
@echo "添加文件到 Git..."
|
| 42 |
+
git add .
|
| 43 |
+
@git status
|
| 44 |
+
@echo "请提交并推送到 HuggingFace Space:"
|
| 45 |
+
@echo " git commit -m '你的提交信息'"
|
| 46 |
+
@echo " git push origin main"
|
| 47 |
+
|
| 48 |
+
# 推送到 Git 仓库
|
| 49 |
+
push:
|
| 50 |
+
git push origin main
|
README copy.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Hfbase
|
| 3 |
+
emoji: 📚
|
| 4 |
+
colorFrom: purple
|
| 5 |
+
colorTo: pink
|
| 6 |
+
sdk: docker
|
| 7 |
+
pinned: false
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
README.md
CHANGED
|
@@ -1,10 +1,47 @@
|
|
| 1 |
---
|
| 2 |
-
title: Hfbase
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
|
|
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Hfbase API
|
| 3 |
+
emoji: 🚀
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
pinned: false
|
| 9 |
---
|
| 10 |
|
| 11 |
+
# HFBase API
|
| 12 |
+
|
| 13 |
+
基于 Node.js 20 LTS + Python 3.12 的 FastAPI 服务,部署在 HuggingFace Spaces。
|
| 14 |
+
|
| 15 |
+
## 技术栈
|
| 16 |
+
|
| 17 |
+
- **Node.js**: 20 LTS (多阶段构建)
|
| 18 |
+
- **Python**: 3.12 (运行时)
|
| 19 |
+
- **Web 框架**: FastAPI + Uvicorn
|
| 20 |
+
- **生产服务器**: Gunicorn + UvicornWorker
|
| 21 |
+
- **部署平台**: HuggingFace Spaces (Docker SDK)
|
| 22 |
+
|
| 23 |
+
## API 端点
|
| 24 |
+
|
| 25 |
+
- `GET /` - 欢迎信息
|
| 26 |
+
- `GET /health` - 健康检查
|
| 27 |
+
- `GET /info` - 系统信息
|
| 28 |
+
- `GET /docs` - FastAPI 自动文档
|
| 29 |
+
|
| 30 |
+
## 部署信息
|
| 31 |
+
|
| 32 |
+
此项目配置为在 HuggingFace Spaces 上运行,使用 Docker SDK 和端口 7860。
|
| 33 |
+
|
| 34 |
+
### 构建和部署
|
| 35 |
+
|
| 36 |
+
```bash
|
| 37 |
+
# 本地测试
|
| 38 |
+
docker build -t hfbase-api .
|
| 39 |
+
docker run -p 7860:7860 hfbase-api
|
| 40 |
+
|
| 41 |
+
# 访问 API
|
| 42 |
+
curl http://localhost:7860/health
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
## 配置参考
|
| 46 |
+
|
| 47 |
+
详细配置参考: [HuggingFace Spaces 配置文档](https://huggingface.co/docs/hub/spaces-config-reference)
|
app.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI
|
| 2 |
+
from fastapi.responses import JSONResponse
|
| 3 |
+
|
| 4 |
+
# 创建 FastAPI 应用实例
|
| 5 |
+
app = FastAPI(
|
| 6 |
+
title="HFBase API",
|
| 7 |
+
description="基于 Node.js + Python 的最简 API 服务",
|
| 8 |
+
version="1.0.0"
|
| 9 |
+
)
|
| 10 |
+
|
| 11 |
+
@app.get("/")
|
| 12 |
+
async def root():
|
| 13 |
+
"""根端点,返回基本信息"""
|
| 14 |
+
return JSONResponse(
|
| 15 |
+
content={
|
| 16 |
+
"message": "欢迎使用 HFBase API",
|
| 17 |
+
"version": "1.0.0",
|
| 18 |
+
"status": "运行中"
|
| 19 |
+
}
|
| 20 |
+
)
|
| 21 |
+
|
| 22 |
+
@app.get("/health")
|
| 23 |
+
async def health_check():
|
| 24 |
+
"""健康检查端点"""
|
| 25 |
+
return JSONResponse(
|
| 26 |
+
content={"status": "ok"},
|
| 27 |
+
status_code=200
|
| 28 |
+
)
|
| 29 |
+
|
| 30 |
+
@app.get("/info")
|
| 31 |
+
async def info():
|
| 32 |
+
"""系统信息端点"""
|
| 33 |
+
return JSONResponse(
|
| 34 |
+
content={
|
| 35 |
+
"framework": "FastAPI",
|
| 36 |
+
"python_version": "3.12",
|
| 37 |
+
"nodejs_version": "20 LTS",
|
| 38 |
+
"deployment": "HuggingFace Spaces"
|
| 39 |
+
}
|
| 40 |
+
)
|
push.sh
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
OS_TYPE=$(uname -s)
|
| 4 |
+
|
| 5 |
+
case "$OS_TYPE" in
|
| 6 |
+
Darwin*)
|
| 7 |
+
echo "当前系统是 macOS。"
|
| 8 |
+
ssh-add ~/.ssh/id_ed25519_airsltd_mac
|
| 9 |
+
;;
|
| 10 |
+
Linux*)
|
| 11 |
+
echo "当前系统是 Linux。"
|
| 12 |
+
;;
|
| 13 |
+
CYGWIN*|MINGW*|MSYS*)
|
| 14 |
+
echo "当前系统是 Windows。"
|
| 15 |
+
;;
|
| 16 |
+
*)
|
| 17 |
+
echo "未知的系统: $OS_TYPE"
|
| 18 |
+
;;
|
| 19 |
+
esac
|
| 20 |
+
git add .
|
| 21 |
+
git commit -m "update"
|
| 22 |
+
git push
|
| 23 |
+
|
requirements.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastapi>=0.104.0
|
| 2 |
+
uvicorn[standard]>=0.24.0
|
| 3 |
+
gunicorn>=21.0.0
|
setup_hf.sh
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# HuggingFace CLI 设置脚本
|
| 3 |
+
|
| 4 |
+
# 设置镜像源
|
| 5 |
+
export HF_ENDPOINT="https://hf-mirror.com"
|
| 6 |
+
|
| 7 |
+
# 安装 HuggingFace CLI
|
| 8 |
+
echo "安装 HuggingFace CLI..."
|
| 9 |
+
pip install -U "huggingface_hub[cli]"
|
| 10 |
+
|
| 11 |
+
# 检查安装
|
| 12 |
+
echo "验证安装..."
|
| 13 |
+
huggingface-cli --version
|
| 14 |
+
|
| 15 |
+
# 提示登录
|
| 16 |
+
echo ""
|
| 17 |
+
echo "========================================="
|
| 18 |
+
echo "HuggingFace CLI 已安装完成!"
|
| 19 |
+
echo "========================================="
|
| 20 |
+
echo ""
|
| 21 |
+
echo "请使用以下命令登录:"
|
| 22 |
+
echo "huggingface-cli login --token YOUR_TOKEN"
|
| 23 |
+
echo ""
|
| 24 |
+
echo "获取 token: https://huggingface.co/settings/tokens"
|
| 25 |
+
echo ""
|
| 26 |
+
echo "登录后,可以使用以下命令管理 Space:"
|
| 27 |
+
echo " - huggingface-cli space list # 列出所有 Spaces"
|
| 28 |
+
echo " - huggingface-cli repo type space # 创建新的 Space"
|
| 29 |
+
echo ""
|