--- title: WeRSS emoji: 🐠 colorFrom: green colorTo: purple sdk: docker pinned: false license: mit --- # WeRSS · Hugging Face Docker Space 这个目录用于把 `CaPaCaptain/WeRSS` 部署为 Hugging Face Docker Space。 Dockerfile 不复制 Space 仓库中的业务代码,而是在构建阶段从 GitHub 拉取指定分支或标签,因此 GitHub 仓库更新后,只需在 Hugging Face Space 中执行 **Factory rebuild** 即可重新构建。 > 本目录需要作为 Hugging Face Space 仓库的根目录使用。若它保存在主 GitHub 仓库的 `huggingface/` 子目录中,请把该目录内的 `Dockerfile` 和 `README.md` 同步到 Space 根目录。 ## 1. 部署架构 - 源代码:`https://github.com/CaPaCaptain/WeRSS` - Hugging Face SDK:Docker - 对外端口:`7860` - 后端:FastAPI - 前端:已编译 Vue 静态文件 - 默认数据库:SQLite - 持久化路径:`/data` - API 前缀:`/api/v1/wx` - Swagger:`/api/docs` - ReDoc:`/api/redoc` - OpenAPI:`/api/openapi.json` ## 2. 创建 Hugging Face Space 1. 在 Hugging Face 新建 Space。 2. SDK 选择 **Docker**。 3. 建议第一次部署使用 **Private Space**。 4. 把本目录中的 `Dockerfile` 和 `README.md` 上传到 Space 根目录。 5. 在 Space 的 **Settings → Variables and secrets** 配置下列项目。 6. 如需持久保存数据库、微信公众号授权、配置、导出文件和缓存,请把持久化存储或 Storage Bucket 挂载到 `/data`。 7. 保存配置后执行 **Factory rebuild**。 ## 3. 构建参数与 GitHub 配置 ### Variables | 名称 | 建议值 | 是否必须 | 说明 | |---|---|---:|---| | `REPO_URL` | `https://github.com/CaPaCaptain/WeRSS.git` | 是 | 构建时拉取的 GitHub 仓库 | | `REPO_REF` | `main` | 是 | 分支、标签或可解析的 Git 引用 | | `USERNAME` | `admin` | 建议 | 初始化管理员用户名 | | `WEB_NAME` | `WeRSS微信公众号订阅助手` | 否 | 前端显示名称 | | `RSS_BASE_URL` | `https://你的-space.hf.space/` | 建议 | RSS 对外基础地址,建议以 `/` 结尾 | | `ENABLE_JOB` | `True` | 否 | 是否启动定时更新任务 | | `THREADS` | `1` | 建议 | 免费 CPU Space 建议保持 1 | | `BROWSER_TYPE` | `webkit` | 建议 | Playwright 浏览器类型 | | `GATHER_CONTENT` | `False` | 否 | 是否采集正文 | | `GATHER_MODEL` | `web` | 否 | 采集模式:`web`、`api` 或 `app` | | `GATHER_CONTENT_AUTO_CHECK` | `True` | 否 | 是否自动检查未采集正文 | | `MAX_PAGE` | `5` | 否 | 首次添加公众号时最多采集页数 | | `TOKEN_EXPIRE_MINUTES` | `4320` | 否 | Web 登录 Token 有效期 | | `LOG_LEVEL` | `INFO` | 否 | 日志级别 | | `PROXY_ENABLED` | `False` | 否 | 是否启用代理 | | `PROXY_HTTP_URL` | 空 | 否 | HTTP 或 SOCKS5 代理地址 | | `PROXY_DENO_URL` | 空 | 否 | Deno 代理地址 | Dockerfile 已设置以下默认值,通常不用在 Space 中重复配置: ```text PORT=7860 DB=sqlite:////data/db.db THREADS=1 AUTO_RELOAD=False ``` ### Secrets | 名称 | 是否必须 | 说明 | |---|---:|---| | `GITHUB_TOKEN` | 私有仓库必须 | GitHub fine-grained PAT;只授予该仓库 `Contents: Read-only` | | `PASSWORD` | 强烈建议 | 初始化管理员密码;不要使用上游默认密码 | | `SECRET_KEY` | 强烈建议 | JWT 签名密钥,建议使用至少 32 字节随机值 | | `REDIS_SERVER_PASSWORD` | 可选 | 内置 Redis 密码 | | `DINGDING_WEBHOOK` | 可选 | 钉钉通知 Webhook | | `WECHAT_WEBHOOK` | 可选 | 企业微信通知 Webhook | | `FEISHU_WEBHOOK` | 可选 | 飞书通知 Webhook | | `CUSTOM_WEBHOOK` | 可选 | 自定义通知 Webhook | | `CASCADE_API_KEY` | 可选 | 级联系统 API Key | | `CASCADE_API_SECRET` | 可选 | 级联系统 API Secret | 生成随机密钥示例: ```bash openssl rand -base64 48 ``` ### 私有 GitHub 仓库 Token 建议创建 GitHub fine-grained personal access token: - Repository access:只选择 `CaPaCaptain/WeRSS` - Repository permissions: - Contents:Read-only - Metadata:Read-only - 不需要写入、Actions 或管理权限 把 Token 保存为 Hugging Face Secret:`GITHUB_TOKEN`。 Dockerfile 通过一次性的 Git HTTP Authorization Header 读取该 Secret;Token 不会写入 Git remote,并会在运行应用前清除 `GITHUB_TOKEN` 环境变量。 ## 4. 持久化 WeRSS 默认会写入: - SQLite 数据库 - 微信公众号授权 Token - `config.yaml` - 头像与文章相关文件 - 缓存 - PDF、Markdown 等导出文件 - 自动生成的 JWT Secret(未显式设置 `SECRET_KEY` 时) Dockerfile 将: ```text /app/data → /data /app/config.yaml → /data/config.yaml ``` 没有挂载持久化存储时,Space 重启、休眠或重建后,上述数据可能丢失。 推荐: - 挂载路径:`/data` - 数据库:默认 `sqlite:////data/db.db` - 正式长期运行时可改用外部 PostgreSQL 或 MySQL,并通过 Secret `DB` 设置连接字符串 数据库连接示例: ```text # PostgreSQL postgresql://username:password@host:5432/database # MySQL mysql+pymysql://username:password@host:3306/we-rss?charset=utf8mb4 ``` 数据库连接字符串包含密码时,必须使用 **Secret**,不要使用公开 Variable。 ## 5. 本地构建测试 ### 私有 GitHub 仓库 ```bash printf '%s' 'github_pat_xxx' > .github_token docker build \ --secret id=GITHUB_TOKEN,src=.github_token \ --build-arg REPO_URL=https://github.com/CaPaCaptain/WeRSS.git \ --build-arg REPO_REF=main \ -t werss-hf . ``` 运行: ```bash mkdir -p data docker run --rm \ --name werss-hf \ -p 7860:7860 \ -v "$PWD/data:/data" \ -e USERNAME=admin \ -e PASSWORD='请替换为强密码' \ -e SECRET_KEY='请替换为随机密钥' \ -e RSS_BASE_URL='http://localhost:7860/' \ werss-hf ``` 访问: ```text http://localhost:7860/ http://localhost:7860/api/docs ``` ### 公开 GitHub 仓库 ```bash docker build \ --build-arg REPO_URL=https://github.com/CaPaCaptain/WeRSS.git \ --build-arg REPO_REF=main \ -t werss-hf . ``` ## 6. API 配置 ```text BASE_URL=https://你的-space.hf.space API_BASE=${BASE_URL}/api/v1/wx ``` Swagger 文档: ```text ${BASE_URL}/api/docs ``` ### 获取 Bearer Token ```bash curl -X POST "${BASE_URL}/api/v1/wx/auth/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "username=admin" \ --data-urlencode "password=你的管理员密码" ``` 验证 Token: ```bash curl "${BASE_URL}/api/v1/wx/auth/verify" \ -H "Authorization: Bearer 你的_access_token" ``` ### 创建 Access Key ```bash curl -X POST "${BASE_URL}/api/v1/wx/auth/ak/create" \ -H "Authorization: Bearer 你的_access_token" \ -H "Content-Type: application/json" \ -d '{ "name": "n8n", "description": "供 n8n 工作流调用", "permissions": ["article:read", "article:sync"], "expires_in_days": 365 }' ``` 其他接口、参数和认证方式以 Swagger `/api/docs` 中当前构建版本为准。 ## 7. n8n / Webhook 接入 在 n8n 的 HTTP Request 节点中: ```text Base URL: https://你的-space.hf.space/api/v1/wx Authentication: Header Auth Header: Authorization Value: Bearer ``` 建议正式自动化使用 Access Key,而不是长期保存管理员用户名与密码。 通知 Webhook 可通过以下 Secrets 配置: ```text DINGDING_WEBHOOK WECHAT_WEBHOOK FEISHU_WEBHOOK CUSTOM_WEBHOOK ``` ## 8. 更新与版本锁定 ### 跟随 GitHub main ```text REPO_REF=main ``` 每次 GitHub 更新后,在 Space 中执行: ```text Settings → Factory rebuild ``` ### 固定版本 生产环境建议把 `REPO_REF` 设置为 Git tag、固定分支或 commit SHA,避免主分支更新造成不可预期变化。 ## 9. Hugging Face 兼容处理 此 Dockerfile 在构建时执行以下调整: 1. 将服务端口从上游默认 `8001` 改为 Space 公开端口 `7860`。 2. 将 `/app/data` 和 `/app/config.yaml` 持久化到 `/data`。 3. 把点号环境变量名转换为下划线形式,例如: - `GATHER.CONTENT` → `GATHER_CONTENT` - `CACHE.DIR` → `CACHE_DIR` - `WEBHOOK.CONTENT_FORMAT` → `WEBHOOK_CONTENT_FORMAT` 4. 移除启动时打印全部环境变量的代码,防止 Secrets 出现在日志中。 5. 使用一次性 Git Authorization Header 拉取私有仓库,不把 Token 写入 remote,并在运行前清除 `GITHUB_TOKEN`。 ## 10. 注意事项 - 微信公众号采集依赖浏览器自动化,镜像较大,首次构建时间和内存占用会高于普通 FastAPI 应用。 - 免费 Space 可能休眠;休眠期间定时更新任务不会持续执行。 - 微信接口可能受出口 IP、地区、风控和授权状态影响。 - 公网部署前必须更改管理员密码并设置 `SECRET_KEY`。 - 建议初期使用 Private Space,确认登录、授权、RSS 与 API 均正常后再决定是否公开。 - 不要在 README、Dockerfile、GitHub 提交或 Space Variables 中硬编码密码、Token、Webhook 或数据库凭据。