v0.0.7
Some checks failed
docker-release / build-and-push (push) Failing after 9m58s
any-hub
any-hub 是一个面向个人与小型团队的多仓库代理,主打匿名访问、命令行部署与单一 config.toml 控制平面。当前阶段已交付 Phase 1:构建 Host→Hub 路由、磁盘缓存与示例代理。
单仓代理 (Phase 1)
Phase 1 的 HTTP 服务与磁盘缓存能力详见 specs/002-fiber-single-proxy/spec.md 与 plan.md。目标是:
- 构建 Fiber HTTP 服务 + Host 驱动(共享
ListenPort)的 Hub Registry,使docker.hub.local、npm.hub.local等域名在同一端口内路由到独立上游。 - 实现
StoragePath/<Hub>/<path>目录下的磁盘缓存,依靠文件mtime+ 上游HEAD请求完成动态标签的再验证。 - 提供 Docker/NPM/PyPI 示例配置、quickstart、测试桩,运行
go test ./tests/integration即可验证代理/缓存流程。
随着 Phase 1 推进,cmd/any-hub 将接入 server/cache/quickstart 章节,便于复用 Phase 0 的配置与日志骨架。
ListenPort 与凭证迁移指南
- 全局端口:在配置全局段声明
ListenPort = <port>,所有 Hub 共享该端口;旧的[[Hub]].Port字段已弃用,any-hub --check-config会在检测到遗留字段时直接失败。 - Hub 类型:为每个
[[Hub]]添加Type = "docker|npm|go|pypi",驱动日志中的hub_type字段并预留协议特定行为;非法值会被校验阻断。 - 可选凭证:如需突破上游限流,成对提供
Username/Password。CLI 仅在这两个字段同时出现时注入 Basic Auth,并在日志中输出掩码形式的auth_mode=credentialed。 - 验证命令:使用
any-hub --check-config --config ./config.toml快速确认迁移是否完成,成功时日志会显示listen_port、hub_type等字段。
凭证配置示例
[[Hub]]
Name = "secure"
Domain = "secure.hub.local"
Upstream = "https://registry.corp.local"
Type = "npm"
Username = "ci-user"
Password = "s3cr3t"
- CLI 日志不会打印明文凭证,而是输出
credentials=["secure:credentialed"],可在any-hub --check-config --config secure.toml中验证。 - 建议结合环境变量或密钥管理器生成
config.toml,并通过chmod 600或 CI Secret 注入限制可见范围。
快速开始
- 复制
configs/config.example.toml为工作目录下的config.toml并调整[[Hub]]配置:- 在全局段添加/修改
ListenPort,并从每个 Hub 中移除Port。 - 为 Hub 填写
Type,并按需添加Module(缺省为legacy,自定义模块需在internal/hubmodule/<module-key>/注册)。 - 根据 quickstart 示例设置
Domain、Upstream、StoragePath等字段,并按需添加Username/Password。
- 在全局段添加/修改
- 参考
specs/003-hub-auth-fields/quickstart.md完成配置校验、凭证验证与日志检查。 - 常用命令:
any-hub --check-config --config ./config.tomlany-hub --config ./config.tomlany-hub --version
模块化代理与示例
configs/config.example.toml展示了多个 Hub 的组合:Docker Hub(省略Module,自动使用Type同名 Hook)、Composer Hub(显式指定Module = "composer")以及 legacy 兜底 Hub,可直接复制修改。- 运行
./scripts/demo-proxy.sh docker(或npm)即可加载示例配置并启动代理,日志中会附带module_key字段,便于确认命中的是legacy还是自定义模块。 - Hook 开发流程:
- 复制
internal/hubmodule/template/至internal/hubmodule/<module-key>/,补全module.go与module_test.go。 - 在模块
init()中调用hubmodule.MustRegister注册 metadata,并使用hooks.MustRegister注册 Hook(NormalizePath/ResolveUpstream/RewriteResponse 等)。 - 为模块补充单元测试、
tests/integration/覆盖 miss→hit 流程,运行make modules-test/go test ./...。 - 更新配置:若
[[Hub]].Module留空,将根据Type自动选择 Hook;也可显式设置Module = "<module-key>"并通过Rollout控制 legacy/dual/modular。 - 启动服务前,可通过
curl -s /-/modules | jq '.hook_registry'确认 hook 注册情况;缺失时启动会直接失败,避免运行期回退到 legacy。
- 复制
模块选择与 legacy
[[Hub]].Module为空时会自动回退到与Type同名的模块(若已注册),否则使用legacy兜底。- diagnostics
/-/modules将展示hook_status,当模块仍使用 legacy 时会标记legacy-only,便于排查。 - legacy 模块仅提供最小兜底能力,迁移完成后应显式将
Module设置为对应仓库的 Hook。 - 示例操作手册、常见问题参见
specs/003-hub-auth-fields/quickstart.md以及本特性的quickstart.md。
CLI 标志
| Flag | 描述 |
|---|---|
--config, -c |
指定配置文件路径,优先级高于 ANY_HUB_CONFIG |
--check-config |
仅执行配置校验并退出,退出码区分成功/失败 |
--version |
打印语义化版本信息并立即退出 |
更多细节可查阅 contracts/cli-flags.md。
优先级:
--config⬆ANY_HUB_CONFIG⬆ 默认./config.toml。--version会短路其他逻辑,--check-config则在日志中记录action=check_config并返回退出码。
配置校验错误示例
$ any-hub --check-config --config broken.toml
Config.ListenPort: 必须在 1-65535
Hub[npm].Type: 不支持的值 "rubygems"
错误消息以 字段路径: 原因 形式展示,可根据 quickstart.md 的“常见错误排查”章节快速定位。
Description
Languages
Go
84.6%
Shell
15.1%
Dockerfile
0.2%
Makefile
0.1%