这个VersityGW官方称为高性能S3转换服务,和Garage是完全不同的实现。
VersityGW是无状态的,且数据是原样保存的,假设你上传了一个hello.txt(内容是 “hello world”)你可以看数据目录下的结构:
./data/
└── my-bucket/
└── hello.txt <-- 这就是一个普通的文本文件,你用记事本直接能打开
而Garage的数据目录类似:
./data/
└── a1/
└── f8e2c... <-- 乱码文件(hello.txt 的碎片,直接打开是乱码)
VersityGW主打一个简单、高效、易于部署,我其实挺喜欢VersityGW这种设计方案的,反正作为普通用户在使用层面是完全无感的。
安装Docker:
apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
安装NGINX、CertBot:
apt update
apt install nginx python3-certbot-nginx
创建目录新建compose文件:
mkdir /opt/versitygw && cd /opt/versitygw && nano docker-compose.yml
写入如下内容:
services:
versitygw:
image: ghcr.io/versity/versitygw:latest
ports:
- "127.0.0.1:7070:7070"
- "127.0.0.1:7071:7071"
- "127.0.0.1:8080:8080"
environment:
ROOT_ACCESS_KEY: imlala
ROOT_SECRET_KEY: setyourpassword
VGW_PORT: ":7070"
VGW_IAM_DIR: /data/iam
VGW_VERSIONING_DIR: /data/versioning
VGW_BACKEND: posix
VGW_BACKEND_ARGS: /data/s3
VGW_ADMIN_PORT: ":7071"
VGW_WEBUI_PORT: ":8080"
VGW_WEBUI_GATEWAYS: "https://versitygw-s3.example.com"
VGW_WEBUI_ADMIN_GATEWAYS: "https://versitygw-admin.example.com"
volumes:
- ./data/s3:/data/s3
- ./data/versioning:/data/versioning
- ./data/iam:/data/iam
restart: unless-stopped
7070是s3 api端口,7071是管理api端口,8080是webui端口。对于生产环境而言,建议使用反向代理。我这里使用NGINX反向代理:
https://versitygw-s3.example.com --> 7070端口
https://versitygw-admin.example.com --> 7071端口
https://versitygw-console.example.com --> 8080端口
[不推荐]如果不使用反向代理,可以将VGW_WEBUI_GATEWAYS、VGW_WEBUI_ADMIN_GATEWAYS配置为服务器的公网IP:
services:
versitygw:
image: ghcr.io/versity/versitygw:latest
ports:
- "7070:7070"
- "7071:7071"
- "8080:8080"
environment:
VGW_WEBUI_GATEWAYS: "http://8.9.6.4:7070"
VGW_WEBUI_ADMIN_GATEWAYS: "http://8.9.6.4:7071"
[不推荐]如果你在没有公网IP的环境下部署,如本地测试环境,可以配置为localhost:
services:
versitygw:
image: ghcr.io/versity/versitygw:latest
ports:
- "7070:7070"
- "7071:7071"
- "8080:8080"
environment:
VGW_WEBUI_GATEWAYS: "http://localhost:7070"
VGW_WEBUI_ADMIN_GATEWAYS: "http://localhost:7071"
创建VersityGW需要用到的目录:
mkdir -p ./data/s3 ./data/versioning ./data/iam
启动:
docker compose up -d
新建NGINX站点配置文件:
nano /etc/nginx/sites-available/versitygw
写入如下内容:
upstream versity_s3_backend {
server 127.0.0.1:7070;
keepalive 32; # 保持 32 个空闲长连接,提升高频请求性能
}
upstream versity_admin_backend {
server 127.0.0.1:7071;
keepalive 8;
}
upstream versity_webui_backend {
server 127.0.0.1:8080;
keepalive 8;
}
server {
listen 80;
listen [::]:80;
server_name versitygw-s3.example.com; # 替换为你的 S3 访问域名
client_max_body_size 0;
# 关键设置:禁用缓冲,确保大文件分片上传和流式传输时不会塞满 Nginx 缓存
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_pass http://versity_s3_backend;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 优化长连接
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
server {
listen 80;
listen [::]:80;
server_name versitygw-admin.example.com; # 替换为你的管理 API 域名
location / {
proxy_pass http://versity_admin_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
listen [::]:80;
server_name versitygw-console.example.com; # 替换为你的 Web UI 域名
location / {
proxy_pass http://versity_webui_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用站点:
ln -s /etc/nginx/sites-available/versitygw /etc/nginx/sites-enabled/versitygw
签发证书:
certbot --nginx
访问versitygw-console.example.com,使用ROOT_ACCESS_KEY、ROOT_SECRET_KEY登录Web UI:
创建一个普通用户:
创建bucket,设置所有者为刚才创建的用户:
上传文件测试:
可以为文件生成presigned URL供临时访问:
管理bucket:
这绝对又是一个MinIO的绝佳替代品,MinIO已经死了没啥好对比的了,与Garage对比的话,我觉得VersityGW无论是部署还是平时使用都比Garage简单太多了,上手自然也比Garage快,毕竟自带Web UI,而且比Garage多了版本控制功能。
荒岛























