StarrySkyWorld commited on
Commit
d334177
·
1 Parent(s): 82ce3b3

Add shell-based HF Space setup

Browse files
Files changed (4) hide show
  1. Dockerfile +16 -0
  2. README.md +27 -0
  3. entrypoint.sh +40 -0
  4. requirements.txt +3 -0
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY requirements.txt /app/
6
+ COPY entrypoint.sh /app/
7
+
8
+ RUN apt-get update \
9
+ && apt-get install -y --no-install-recommends curl ca-certificates unzip \
10
+ && rm -rf /var/lib/apt/lists/* \
11
+ && pip install --no-cache-dir -r requirements.txt \
12
+ && chmod +x /app/entrypoint.sh
13
+
14
+ EXPOSE 7860
15
+
16
+ CMD ["/app/entrypoint.sh"]
README.md CHANGED
@@ -1 +1,28 @@
 
1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HF Hidden Code Space Shell
2
 
3
+ 这个仓库是一个 Hugging Face Space 的“壳”项目,用于在运行时拉取真实业务源码并启动服务。构建阶段不会包含任何业务代码,保持仓库公开而代码私有。
4
+
5
+ ## 运行流程
6
+ 1. 使用 `python:3.11-slim` 构建最小镜像,只安装基础依赖。
7
+ 2. 镜像启动时运行 `entrypoint.sh`,检查 `APP_ARCHIVE_URL` 环境变量。
8
+ 3. 通过运行时提供的 URL 下载真实业务代码压缩包(支持 zip 与 tar.gz),自动解压到 `/opt/app`。
9
+ 4. 进入解压后的目录,执行 `uvicorn app:app --host 0.0.0.0 --port 7860` 启动 FastAPI 应用。
10
+
11
+ ## 配置方法
12
+ 在 Hugging Face Space → **Settings** → **Variables** 中新增:
13
+
14
+ ```
15
+ APP_ARCHIVE_URL = https://example.com/your-real-app.zip
16
+ ```
17
+
18
+ > 注意:不要在 Dockerfile 或构建阶段尝试读取该变量,HF secrets 仅在运行时可用。
19
+
20
+ ## 部署步骤示例
21
+ 1. 将本仓库推送到 Hugging Face,创建为 **Public** Space(Docker 模式)。
22
+ 2. 在 Space 设置里添加环境变量 `APP_ARCHIVE_URL`,指向你的私有业务代码归档包(zip 或 tar.gz)。
23
+ 3. 点击 **Restart this Space**,容器启动时会自动下载、解压并运行你的应用。
24
+
25
+ ## 重要提示
26
+ - 这是一个空壳仓库,不包含真实业务源码,Fork 后直接运行会失败,因为缺少 `APP_ARCHIVE_URL`。
27
+ - `entrypoint.sh` 不会打印下载 URL,避免泄露敏感信息。
28
+ - 仅包含基础依赖,如需额外依赖,请在真实业务代码的环境中自行处理。
entrypoint.sh ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ if [[ -z "${APP_ARCHIVE_URL:-}" ]]; then
5
+ echo "错误:未设置 APP_ARCHIVE_URL 环境变量。" >&2
6
+ exit 1
7
+ fi
8
+
9
+ APP_DIR="/opt/app"
10
+ mkdir -p "$APP_DIR"
11
+ cd "$APP_DIR"
12
+
13
+ ARCHIVE_FILE="app_archive"
14
+
15
+ # 下载归档文件,不输出 URL 防止泄露
16
+ if ! curl -fsSL "$APP_ARCHIVE_URL" -o "$ARCHIVE_FILE"; then
17
+ echo "错误:无法下载应用归档文件。" >&2
18
+ exit 1
19
+ fi
20
+
21
+ # 根据文件类型解压 zip 或 tar.gz
22
+ if file "$ARCHIVE_FILE" | grep -qi "zip"; then
23
+ unzip -q "$ARCHIVE_FILE" -d "$APP_DIR"
24
+ elif file "$ARCHIVE_FILE" | grep -Eqi "gzip compressed data|tar archive"; then
25
+ tar -xzf "$ARCHIVE_FILE" -C "$APP_DIR"
26
+ else
27
+ echo "错误:不支持的归档格式。" >&2
28
+ exit 1
29
+ fi
30
+
31
+ # 选择解压后的第一个目录作为应用目录
32
+ APP_SUBDIR=$(find "$APP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)
33
+ if [[ -z "$APP_SUBDIR" ]]; then
34
+ echo "错误:未找到解压后的应用目录。" >&2
35
+ exit 1
36
+ fi
37
+
38
+ cd "$APP_SUBDIR"
39
+
40
+ exec uvicorn app:app --host 0.0.0.0 --port 7860
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ requests