# AxonHub Hugging Face Spaces Dockerfile # # 此 Dockerfile 专为 Hugging Face Spaces 部署优化 # 使用 PostgreSQL 作为数据库(需要配置外部数据库) # # 重要:此文件需要复制到项目根目录使用 # cp hf/Dockerfile ./Dockerfile # ============================================ # Stage 1: 构建前端 # ============================================ FROM --platform=$BUILDPLATFORM node:20-alpine AS frontend-builder WORKDIR /build # 启用 pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # 复制前端目录 COPY frontend ./frontend WORKDIR /build/frontend # 安装依赖 RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile # 构建前端(增加 Node.js 内存限制) ENV NODE_OPTIONS="--max-old-space-size=4096" RUN pnpm build # ============================================ # Stage 2: 复制前端构建产物 # ============================================ FROM alpine AS frontend-dist COPY --from=frontend-builder /build/frontend/dist /dist # ============================================ # Stage 3: 构建后端 # ============================================ FROM golang:alpine AS backend-builder WORKDIR /build # 安装必要工具 RUN apk add --no-cache git ca-certificates tzdata # 复制 Go 模块文件 COPY go.mod go.sum ./ # 下载依赖 RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ GOTOOLCHAIN=auto go mod download # 复制源码 COPY . . # 复制前端构建产物到静态文件目录 COPY --from=frontend-dist /dist /build/internal/server/static/dist # 设置构建环境变量 ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux # 构建二进制文件 RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ GOTOOLCHAIN=auto go build \ -tags=nomsgpack \ -ldflags "-s -w -X 'github.com/looplj/axonhub/internal/build.Version=$(cat internal/build/VERSION 2>/dev/null || echo dev)' -X 'github.com/looplj/axonhub/internal/build.BuildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)'" \ -o axonhub \ ./cmd/axonhub # ============================================ # Stage 4: 最终运行镜像 # ============================================ FROM alpine # 安装运行时依赖 RUN apk add --no-cache ca-certificates tzdata # Hugging Face Spaces 要求使用非 root 用户运行 # 创建 uid=1000 的用户(HF 标准) RUN adduser -D -u 1000 user # 切换到非 root 用户 USER user # 设置工作目录 WORKDIR /home/user/app # 复制二进制文件 COPY --from=backend-builder --chown=user:user /build/axonhub /home/user/app/axonhub # 创建数据目录(用于日志等) RUN mkdir -p /home/user/app/data /home/user/app/logs # ============================================ # 环境变量配置 # ============================================ # 服务器配置 ENV AXONHUB_SERVER_HOST=0.0.0.0 ENV AXONHUB_SERVER_PORT=7860 ENV AXONHUB_SERVER_DEBUG=false # 数据库配置(PostgreSQL) # 注意:实际的 DSN 应通过 HF Secrets 配置,这里只是默认值 ENV AXONHUB_DB_DIALECT=postgres ENV AXONHUB_DB_DSN="" # 日志配置 ENV AXONHUB_LOG_LEVEL=info ENV AXONHUB_LOG_ENCODING=json # Hugging Face Spaces 使用端口 7860 EXPOSE 7860 # 启动应用 ENTRYPOINT ["/home/user/app/axonhub"]