#s3 #lfs #cache #server #git #aws #local

bin+lib rudolfs

一个高性能的、具有 AWS S3 后端的 Git LFS 服务器

20 个版本

0.3.7 2024年5月3日
0.3.6 2022年10月4日
0.3.5 2021年7月31日
0.3.1 2021年2月12日
0.2.1 2019年3月22日

#377 in 命令行工具

Download history 96/week @ 2024-04-27 28/week @ 2024-05-04 2/week @ 2024-05-25 1/week @ 2024-06-01 1/week @ 2024-06-29 39/week @ 2024-07-06 69/week @ 2024-07-27 1/week @ 2024-08-03

每月 70 次下载

MIT 许可证

145KB
3K SLoC

Rudolfs

Cirrus CI - Specific Branch Build Status Crates.io AUR version Docker Image Version (latest semver) Docker Image Size (latest semver)

一个具有 AWS S3 后端的高性能、缓存 Git LFS 服务器。

功能

  • 多个后端

    1. 具有可选本地磁盘缓存的 AWS S3 后端。
    2. 本地磁盘后端。
  • 可配置的本地磁盘缓存以加快下载速度(并减少您的 S3 账单)。

  • 具有抗损坏的本地磁盘缓存。即使磁盘受到宇宙射线的轰击,它也会找到损坏的 LFS 对象并将它们从缓存中透明地清除。客户端永远不会注意到这种情况的发生。

  • 缓存和永久存储中对 LFS 对象的加密。

  • 分离 GitHub 组织和项目。只需在 URL 中指定 org 和项目名称即可自动创建。如果两个项目共享许多 LFS 对象,让他们使用相同的 URL 以节省存储空间。

  • 一个小型(<10MB)的 Docker 镜像(jasonwhite0/rudolfs)。

后端存储代码非常模块化和可组合。欢迎提交实现其他存储后端的 PR。如果您开始工作,请通过提交问题来通知我们。

非功能特性

  • 没有客户端身份验证。这旨在在您信任的内部网络中运行,而不是在互联网上与恶意行为者一起运行。

运行它

生成加密密钥(可选)

如果配置了,所有 LFS 对象都将使用 xchacha20 对称流加密进行加密。在启动服务器之前,您必须生成一个 32 字节的加密密钥。

生成随机密钥很容易

openssl rand -hex 32

请保密并使用密码管理器保存,以免丢失。我们将通过下面的 --key 选项将其传递给服务器。如果没有指定 --key 选项,则 LFS 对象将 不会 加密。

注意:

  • 如果密钥发生变化(或加密被禁用),所有现有的LFS对象都将变成垃圾。当Git LFS客户端尝试下载它们时,SHA256验证步骤将失败。
  • 同样,如果加密在禁用后再次启用,所有现有的未加密LFS对象都将被视为垃圾。
  • 缓存和永久存储中的LFS对象都是加密的。然而,在发送给LFS客户端之前,对象会被解密,因此请采取必要的安全预防措施来保护您的知识产权。

开发

在开发过程中进行测试时,使用Cargo运行它是最容易的。创建一个名为test.sh的文件(此路径已被.gitignore忽略)

# Your AWS credentials.
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_DEFAULT_REGION=us-west-1

# Change this to the output of `openssl rand -hex 32`.
KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

cargo run -- \
  --cache-dir cache \
  --host localhost:8080 \
  --max-cache-size 10GiB \
  --key $KEY \
  s3 \
  --bucket foobar

如果您只需要使用本地磁盘作为后端,请使用以下bash。

# Change this to the output of `openssl rand -hex 32`.
export RUDOLFS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

cargo run -- --port 8080 local --path=/data

注意:始终使用与生产环境不同的S3存储桶、缓存目录和加密密钥。

警告此服务器可能无法从其他机器访问。指定--host localhost:8080通常会绑定服务器到仅内部使用的环回网络接口(即如果localhost解析为127.0.01[::1])。因此,要使服务器从外部世界访问,请指定--host 0.0.0.0:8080或只需指定--port 8080(服务器将绑定的默认IP是0.0.00)。IP 0.0.00表示服务器将尝试绑定到所有可用的网络接口,包括内部和外部。有关更多信息,请参阅https://github.com/jasonwhite/rudolfs/issues/38#issuecomment-973721511

生产

要在生产环境中运行,最简单的方法是使用docker-compose

  1. docker-compose.yml旁边创建一个名为.env的文件,并包含配置变量

    AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXQ
    AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    AWS_DEFAULT_REGION=us-west-1
    LFS_ENCRYPTION_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    LFS_S3_BUCKET=my-bucket
    LFS_MAX_CACHE_SIZE=10GB
    
  2. 使用提供的docker-compose.yml文件来运行生产环境

    docker-compose up -d
    
    # use minio yml
    docker-compose -f ./docker-compose.minio.yml up -d
    
    # use local disk yml
    docker-compose -f ./docker-compose.local.yml up -d
    
  3. 【可选】:最好使用nginx作为此服务器的反向代理。使用它来启用TLS。如何在互联网上的其他教程中有更好的说明。

注意:

  • 更大的缓存几乎总是更好的。尽量使用85%的可用磁盘空间。
  • 缓存数据存储在名为rudolfs_data的Docker卷中。如果要删除它,请运行docker volume rm rudolfs_data

AWS凭证

AWS凭证必须提供给服务器,以便它可以对命令行上指定的S3存储桶(使用--bucket)发出请求。

将按以下顺序搜索您的AWS凭证

  1. 环境变量:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  2. AWS凭证文件。通常位于~/.aws/credentials
  3. IAM 实例配置文件。只有在使用具有实例配置文件/角色的 EC2 实例上运行时才会起作用。

AWS 区域从环境变量 AWS_DEFAULT_REGIONAWS_REGION 中读取。如果格式不正确,将回退到 us-east-1。如果不存在,将回退到 ~/.aws/config 中与当前配置文件关联的值或由环境变量 AWS_CONFIG_FILE 指定的文件。如果该文件格式不正确或不存在,将回退到 us-east-1

客户端配置

将名为 .lfsconfig 的文件添加到 Git 仓库的根目录,并将其提交,以确保每个人都在使用相同的 LFS 服务器。

[lfs]
url = "http://gitlfs.example.com:8080/api/my-org/my-project"
              ─────────┬──────── ──┬─ ─┬─ ───┬── ─────┬────
                       │           │   │     │        └ Replace with your project's name
                       │           │   │     └ Replace with your organization name   
                       │           │   └ Required to be "api"
                       │           └ The port your server started with
                       └ The host name of your server

可选,我还建议更改以下全局设置以加快速度

# Increase the number of worker threads
git config --global lfs.concurrenttransfers 64

# Use a global LFS cache to make re-cloning faster
git config --global lfs.storage ~/.cache/lfs

许可证

MIT 许可证

感谢

该项目是在 环境系统研究学院 (Esri) 开发的,他们慷慨地允许我保留版权并将其作为开源软件发布。

依赖项

~26–40MB
~724K SLoC