Spaces:
Running
Running
| title: OpenSpace | |
| emoji: 💻 | |
| colorFrom: yellow | |
| colorTo: blue | |
| sdk: docker | |
| pinned: false | |
| license: mit | |
| # OpenSpace 后端部署指南 (HuggingFace Space) | |
| 本目录 (`Backend_HF`) 包含了 OpenSpace 的核心执行引擎、Skill 进化逻辑以及 API 服务。它被设计为通过 Docker 容器部署在 **HuggingFace Space** 上,并使用 **Turso** 作为 Serverless 云端数据库以保证数据持久化。 | |
| ## 🚀 部署到 HuggingFace Space | |
| ### 1. 准备工作 | |
| 在部署后端之前,您需要完成以下服务的配置: | |
| * **Turso 数据库**: | |
| 1. 登录 [Turso](https://turso.tech/) 并创建一个新数据库 (如 `openspace-db`)。 | |
| 2. 获取连接 URL (如 `libsql://openspace-db-yourusername.turso.io`)。 | |
| 3. 生成 Auth Token (通过 `turso db tokens create openspace-db`)。 | |
| * **大语言模型 API Key**:OpenSpace 的进化引擎依赖 LLM(如 OpenAI、Anthropic 或其他兼容模型)。 | |
| ### 2. 在 HuggingFace 创建 Space | |
| 1. 登录 [HuggingFace](https://huggingface.co/)。 | |
| 2. 点击右上角头像,选择 **"New Space"**。 | |
| 3. 填写 Space Name (例如 `openspace-backend`)。 | |
| 4. **License**: 建议选择 `MIT`。 | |
| 5. **Select the Space SDK**: 必须选择 **Docker**,然后选择 **Blank** 模板。 | |
| 6. **Space Hardware**: 免费的 `CPU basic` (2 vCPU, 16GB RAM) 已经足够运行此后端服务。 | |
| 7. **Visibility (可见性)**: | |
| * **建议选择 Public (公开)**:如果您的前端部署在 EdgeOne 等外部平台,必须将 Space 设为 Public,否则前端的跨域 API 请求将被 HuggingFace 的鉴权层拦截拦截导致无法访问。 | |
| * *(注:虽然是 Public,但由于您的核心数据在外部的 Turso 数据库中,且您的前端有 Clerk 白名单保护,安全性是有保障的。为了防止他人滥刷 API,建议在 `dashboard_server.py` 中增加简单的 API_KEY 校验。)* | |
| 8. 创建 Space。 | |
| ### 3. 配置环境变量 (Secrets) | |
| 在新创建的 Space 页面,进入 **Settings -> Variables and secrets**。添加以下 **Secrets** (注意不是 Variables,因为这些是敏感信息): | |
| | Secret Name | 示例值 | 说明 | | |
| | :--- | :--- | :--- | | |
| | `TURSO_DATABASE_URL` | `libsql://your-db.turso.io` | **必填**。Turso 数据库的连接地址。 | | |
| | `TURSO_AUTH_TOKEN` | `ey...` | **必填**。Turso 数据库的访问令牌。 | | |
| | `OPENSPACE_API_KEY` | `your_secret_api_key_here` | **必填**。用于保护您的 API 不被恶意调用。前端也需要配置此 Key。 | | |
| | `OPENAI_API_KEY` | `sk-...` | (根据需要)您使用的大语言模型的 API Key。支持 `ANTHROPIC_API_KEY` 等其他受 LiteLLM 支持的密钥。 | | |
| | `PORT` | `7860` | **必填**。HuggingFace Docker 默认暴露端口为 `7860`,请勿更改此值。 | | |
| ### 4. 推送代码触发部署 | |
| 将此 `Backend_HF` 目录中的所有文件直接推送到您的 HuggingFace Space 仓库。 | |
| 如果您在本地: | |
| ```bash | |
| # 克隆您的 HF Space 仓库 | |
| git clone https://huggingface.co/spaces/your-username/openspace-backend | |
| # 将 Backend_HF 里的文件复制进去 | |
| cp -r /path/to/Backend_HF/* openspace-backend/ | |
| # 提交并推送 | |
| cd openspace-backend | |
| git add . | |
| git commit -m "Deploy OpenSpace backend" | |
| git push | |
| ``` | |
| 推送完成后,HuggingFace 会自动读取根目录下的 `Dockerfile`,构建镜像并启动服务。当状态变为 **Running** 时,您的后端就部署成功了。 | |
| --- | |
| ## ⏰ 防止休眠与自动备份 (GitHub Actions) | |
| HuggingFace 的免费 Space 如果长时间无人访问,会自动进入 **Sleeping** 状态。同时,Turso 的免费数据库如果 10 天不活跃也会被深度归档。 | |
| 为了保持服务 24/7 在线并定期备份高价值数据,强烈建议在您的 **GitHub 仓库**(存放本项目的私有仓库)中配置以下 GitHub Action: | |
| 1. 在您的 GitHub 仓库中创建文件 `.github/workflows/keepalive_and_backup.yml`。 | |
| 2. 填入以下配置: | |
| ```yaml | |
| name: OpenSpace Sync & KeepAlive | |
| on: | |
| schedule: | |
| - cron: '0 0,12 * * *' # 每天 UTC 0点和12点触发 | |
| workflow_dispatch: | |
| jobs: | |
| backup: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Install Dependencies | |
| run: pip install libsql-experimental | |
| - name: Ping HuggingFace Space | |
| # 将这里的 URL 替换为您自己的 HF Space 的实际域名 | |
| run: curl -s -o /dev/null -w "%{http_code}" https://your-username-openspace-backend.hf.space/api/v1/health | |
| - name: Backup Core Data from Turso | |
| env: | |
| TURSO_DATABASE_URL: ${{ secrets.TURSO_DATABASE_URL }} | |
| TURSO_AUTH_TOKEN: ${{ secrets.TURSO_AUTH_TOKEN }} | |
| run: | | |
| python -c ' | |
| import os, json, libsql_experimental as sqlite3 | |
| conn = sqlite3.connect(os.environ["TURSO_DATABASE_URL"], auth_token=os.environ["TURSO_AUTH_TOKEN"]) | |
| cursor = conn.cursor() | |
| # Handle column mapping manually since libsql_experimental may not support row_factory | |
| def fetch_dicts(cur, query): | |
| cur.execute(query) | |
| cols = [c[0] for c in cur.description] | |
| return [dict(zip(cols, row)) for row in cur.fetchall()] | |
| records = fetch_dicts(cursor, "SELECT skill_id, name, description, category, total_selections, total_applied, total_completions FROM skill_records") | |
| lineage = fetch_dicts(cursor, "SELECT * FROM skill_lineage_parents") | |
| os.makedirs("backups", exist_ok=True) | |
| json.dump(records, open("backups/skill_records.json", "w"), ensure_ascii=False, indent=2) | |
| json.dump(lineage, open("backups/skill_lineage.json", "w"), ensure_ascii=False, indent=2) | |
| ' | |
| - name: Commit and Push Backups | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git add backups/ | |
| git diff --quiet && git diff --staged --quiet || (git commit -m "Auto-backup: Turso Core DB" && git push) | |
| ``` | |
| 3. 在该 GitHub 仓库的 **Settings -> Secrets and variables -> Actions** 中,添加 `TURSO_DATABASE_URL` 和 `TURSO_AUTH_TOKEN`。 | |
| 这样,GitHub Action 每天会自动访问您的 HF Space 防止其休眠,并将 Turso 中最有价值的技能树和元数据备份回 GitHub 的 `backups/` 目录中。 |