#cargo-registry #api-server #self-hosted #repository #low-memory #private #organization

app palletizer-server

堆垛机API和下载服务器,是一个自托管的Cargo注册表

8个版本

0.2.4 2021年11月30日
0.2.3 2021年10月5日
0.2.1 2021年9月12日
0.1.3 2021年8月30日
0.1.0 2021年5月17日

#593HTTP服务器

每月 21次下载

BSD-2-Clause

79KB
1.5K SLoC

堆垛机

堆垛机是一个完全开源(BSD-2-clause)的自托管私有Cargo注册表。主要目标受众是小规模组织。

它更注重简洁而非可扩展性:您可以通过运行单个服务器应用程序来托管整个注册表。但即便如此,它应该对大多数组织来说运行流畅,并且内存占用较低,性能问题也会受到重视。

当前功能

  • 从同一服务器托管您的crate数据和索引仓库。
  • 使用Cargo Web API发布和撤回crate。
  • 使用以下命令搜索crate: cargo search --registry ...
  • Web服务器有多个监听套接字,每个套接字都有独立的(可选)TLS配置。
  • 从命令行手动添加/删除/撤回/恢复crate。

设置新的注册表

创建新注册表的过程相当简单。您可以使用来自 palletizerpalletizer-tools 包中的命令创建一个空的注册表。然后您可以从 palletizer-server 包中运行 palletizer-server 命令,将注册表上线。

初始化新的注册表

只需运行 palletizer init --url "https://example.com"。这将创建一个 palletizer.toml 文件,一个 index git 仓库和一个 crates 目录。注册表索引最终必须托管在 $URL/index,以及 $URL/crates。请参阅下一节以获取设置服务器的说明。

您可以使用额外的命令行选项进一步自定义注册表。您可以使用 --index-dir--crates-dir 选项更改索引仓库和 crate 目录的路径。

默认情况下,新注册表配置为接受来自 crates.io 的依赖项的 crate。您可以通过添加 --no-crates-io 标志来禁用此功能,并可以使用 --allowed-registry 选项允许额外的注册表。您应该传递允许注册表的索引的完整 URL。

设置服务器

要运行服务器,您需要首先创建一个服务器配置文件。

最小配置文件可以是位于由 palletizer init 创建的 palletizer.toml 相同目录中的 server.toml

[[listener]]
bind = "[::1]:8080"

然后,可以通过运行 palletizer-server server.toml 来启动服务器。这将监听回环适配器上的 8080 端口上的连接。

您可以通过添加更多 [[listener]] 部分,简单地配置任何数量的监听器。每个监听器可以可选地配置为 HTTPS。

[[listener]]
bind = "127.0.0.1:4333"
tls = {
   private_key = "/etc/letsencrypt/live/example.com/privkey.pem",
   certificate_chain = "/etc/letsencrypt/live/example.com/fullchain.pem",
}

也可以将服务器配置文件与注册表本身分开。在这种情况下,您需要在服务器配置文件中配置注册表的路径。

registry = "/srv/my-little-registry"

[[listener]]
bind = "[::1]:8080"

请注意,配置文件中的所有相对路径都将相对于配置文件的文件夹本身进行解释,而不是相对于服务器的当前工作目录。

身份验证

目前,Palletizer 没有实现身份验证。API 服务器不会检查登录令牌,即使 Cargo 仍然希望您指定一个。您可以使用任何随机的垃圾作为令牌,服务器甚至不会查看它。

当然,目的是实现安全的身份验证,以便您可以安全地公开您的注册表,但目前的最大障碍是 Cargo。在撰写本文时,它无法执行身份验证的索引或 crate 下载。登录令牌仅用于访问网络 API,但这对于托管可能敏感代码的私有注册表来说还不够好。

在 crate 下载可用身份验证之前,Palletizer 将不支持身份验证。这应该避免给您造成错误的印象,即如果您仅配置身份验证,则您的代码就是安全的。有关更多信息,请参阅 RFC #2719

好吧,但我真的想要身份验证

公平地说,这对于您充满私有代码的私有注册表来说是有意义的。目前,您可以在网络服务器前面放置一个代理(例如:nginx)以执行身份验证。但是,如果您想让它与纯 Cargo 一起工作,您需要仔细选择身份验证机制。可能可行的一件事是使用基于 IP 的身份验证,允许来自某些网络的访问。

您还可以直接将Palletizer服务器绑定到私有VPN地址,从而避免使用单独的代理服务器。如果您正在寻找一个好用的简单VPN,可以看看WireGuard

项目结构

该项目由一个库、一个命令行工具和一个服务器应用程序组成。该库可用于为Palletizer注册表实现不同的前端。它还被命令行工具和服务器应用程序用于实现实际的注册表管理。

命令行工具不与运行中的服务器通信。它可以用来手动添加、删除、提取和取消提取注册表中的crate。您需要直接访问注册表才能使用它。

服务器应用程序托管索引存储库、crate数据和Cargo Web API。您也可以决定使用专用服务器来托管crate数据和索引存储库,并且仅向互联网(或您的VPN)公开Palletizer服务器的API。

贡献

贡献总是受欢迎的。请在GitHub上随意打开一个issue或pull request。

依赖项

~23–38MB
~661K SLoC