VersityGW

VersityGW

Docker app from junkerderprovinz's Repository

Overview

Puts an S3 API in front of a folder you already have. Point it at a share and every file in it is an S3 object, readable over S3 and over SMB or NFS at the same time - no import, no second copy, no migration. Unlike an object store such as Garage or SeaweedFS, this one brings no storage of its own: your array stays the storage, and the bucket is a directory. Buckets are the top-level folders under the mapped path, objects are the files inside them. Ships an optional web interface for browsing and for managing accounts. Detailed README (setup, credentials, what works and what does not): https://github.com/junkerderprovinz/Unraid-apps/blob/main/versitygw/README.md
VersityGW

Validate  Upstream VersityGW  Image  Unraid  License

A plug-and-play Unraid Community Applications template for VersityGW, the Versity S3 Gateway - an S3 API in front of a folder you already have, wrapping the official versity/versitygw image.

Maintained solo, in whatever spare time there is. Questions via the support thread, bugs, ideas and feature requests via GitHub issues. If it's useful to you, a coffee is always welcome.

Buy me a coffee   PayPal   Donate with crypto


Table of Contents

  1. What is this?
  2. Why this instead of SeaweedFS or Garage?
  3. Quick Start on Unraid
  4. Connecting a client
  5. What a gateway can and cannot do
  6. Configuration
  7. More accounts than the root user
  8. How AI is used here
  9. Support this project

1. What is this?

Point it at a share and every file in that share is an S3 object. A top-level folder is a bucket, the files inside it are the objects, and the bytes never move: the same file stays readable over SMB and NFS while an S3 client is talking to it.

That is the whole idea. The gateway translates S3 requests into ordinary file operations on a POSIX filesystem, which on Unraid is your array or a pool. Nothing is imported, nothing is converted, and nothing is duplicated.

It is Apache-2.0, written in Go by Versity, and released about once a month.

2. Why this instead of SeaweedFS or Garage?

They answer a different question. SeaweedFS and Garage are object stores: they bring their own storage layout, and the data inside it is theirs. That is the right answer when you want replication, erasure coding or a cluster.

This is the right answer when the files already exist and you want to keep reading them the way you always have. A photo in /mnt/user/pictures stays a photo in /mnt/user/pictures. Your backup tool, your app, your script can reach it over S3, and Krusader, a share mount or ls still see the same file. Put an object store in front of the same data and you would have two copies and one of them unreadable outside the store.

Rough guide:

You want Take
S3 access to files you already have, still readable as files VersityGW
A real object store with replication across machines Garage
A fast single-node object store, cluster-ready later SeaweedFS

3. Quick Start on Unraid

  1. Apps and search for VersityGW, then install.
  2. Set Data to the share you want to expose. /mnt/user/ exposes every share, one bucket per share. A single share like /mnt/user/backups makes its subfolders the buckets.
  3. Pick a Root Access Key and a Root Secret Key. Anything goes, they are yours; treat the secret like a password.
  4. Leave Accounts on /mnt/user/appdata/versitygw.
  5. Start it. The S3 endpoint is http://<tower-ip>:7070, the web interface http://<tower-ip>:7071.

A bucket has to exist before an object can go in it. Either create it from an S3 client, or create a folder under the mapped path and it is a bucket.

4. Connecting a client

Anything that speaks S3 works. Three that come up most often:

AWS CLI

aws --endpoint-url http://tower:7070 s3 ls
aws --endpoint-url http://tower:7070 s3 cp file.txt s3://backups/

with ~/.aws/credentials holding your root access key and secret key.

rclone

[versity]
type = s3
provider = Other
endpoint = http://tower:7070
access_key_id = <your access key>
secret_access_key = <your secret key>
region = us-east-1

A backup tool (restic, Duplicati, Kopia and the rest): choose S3, endpoint http://tower:7070, bucket name, the two keys. Nothing else is special about it.

If a client insists on virtual-host style addressing (bucket.tower:7070), switch it to path style. Everything here is path style.

5. What a gateway can and cannot do

It can serve existing files as objects, keep POSIX and S3 access working side by side, hold multiple accounts with their own keys, and stay out of the way when you write files the ordinary way.

It cannot invent what the filesystem does not have. Object versioning, lifecycle rules and cross-region replication belong to a real object store; a folder has no version history. If you need those, you want Garage or SeaweedFS instead, and that is not a shortcoming of this one.

A caution about writing from both sides. A file changed over SMB while an S3 client is reading it is exactly as safe, or unsafe, as two SMB clients doing the same thing. The gateway adds no locking of its own.

6. Configuration

Setting Default What it does
Data /mnt/user/ The folder served as S3. Top-level subfolders are buckets.
Accounts /mnt/user/appdata/versitygw Where accounts other than root are stored.
Root Access Key - The root S3 access key. Required.
Root Secret Key - The root S3 secret key. Required, masked in the template.
S3 API 7070 The S3 endpoint port.
Web Interface 7071 Browser interface. Clear the address variable to switch it off.
Admin API 7080 Account administration. The web interface needs it.
Region us-east-1 The region string the gateway answers with. Client and gateway just have to agree.
Health Path /_health A GET here answers without credentials, for a monitor or a proxy.

The advanced variables (VGW_BACKEND, VGW_BACKEND_ARG, the listen addresses) exist because the image is driven by environment variables rather than a config file. They are set correctly for the POSIX case and only need touching if you switch the gateway to an S3, Azure or ScoutFS backend, which the upstream documentation covers.

7. More accounts than the root user

The root keys are meant for administration, not for handing to every app. The gateway carries a built-in account store, which is what the Accounts mapping is for: create an account per tool, each with its own keys, and revoke one without touching the others.

Do it in the web interface, or over the admin API with the upstream versitygw admin command. Without the Accounts mapping every account except root is gone on the next restart, which is the one mistake worth avoiding here.

8. How AI is used here

One knight builds this, and AI is one of the tools I work with, the same way I work with an editor or a compiler. It helps me write code and documentation and it checks my work, and that saves me a good many evenings. It does not make the decisions, though. I read and understand everything before it ships, and if something here breaks, that is on me and not on the tool.

You do not have to take my word for it. The code is open and every release note is written by hand. The issue tracker shows how problems actually get handled, including the ones I got wrong the first time. If you find something that is not right, open an issue and I will look at it.


9. Support this project

Buy me a coffee   PayPal   Donate with crypto

The gateway itself is Versity's work, Apache-2.0. What is maintained here is the Unraid template and this page.

Install VersityGW on Unraid in a few clicks.

Find VersityGW in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for VersityGW Review the template variables and paths Click Install

Requirements

Nothing beyond a folder to serve. Pick the access and secret key yourself before the first start - they are the root S3 credentials and the container will not start without them.

Download Statistics

231,890
Total Downloads

Related apps

Details

Repository
versity/versitygw:latest
Last Updated2026-09-04
First Seen2026-09-17

Runtime arguments

Web UI
http://[IP]:[PORT:7071]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

S3 APIPorttcp

The S3 endpoint. Point your S3 client, backup tool or app at http://tower-ip:7070

Target
7070
Default
7070
Value
7070
Web InterfacePorttcp

Optional browser interface for buckets and accounts. Leave the variable 'Web Interface Address' empty to switch it off, then this port does nothing.

Target
7071
Default
7071
Value
7071
Admin APIPorttcp

Account administration endpoint. The web interface needs it; an S3-only setup does not.

Target
7080
Default
7080
Value
7080
DataPathrw

The folder served as S3. Its top-level subfolders become buckets, the files inside them become objects. Map an existing share to expose what is already there, or a new one to start empty.

Target
/data
Default
/mnt/user/
Value
/mnt/user/
AccountsPathrw

Where the built-in account store keeps its users. Without this, every account except the root user is gone after a restart.

Target
/config
Default
/mnt/user/appdata/versitygw
Value
/mnt/user/appdata/versitygw
BackendVariable

Which storage the gateway puts S3 in front of. 'posix' is the one that means 'the folder above'. Leave it alone unless you know you want s3, azure or scoutfs.

Target
VGW_BACKEND
Default
posix
Value
posix
Served PathVariable

The path inside the container that the posix backend serves. Must match the container side of the Data mapping above.

Target
VGW_BACKEND_ARG
Default
/data
Value
/data
Root Access KeyVariable

The root S3 access key, your choice. This is the user name half of the S3 credentials.

Target
ROOT_ACCESS_KEY
Root Secret KeyVariable

The root S3 secret key, your choice. Treat it as a password: anything holding it has full access to every bucket.

Target
ROOT_SECRET_KEY
S3 AddressVariable

Listen address for the S3 API inside the container. Change only together with the S3 API port above.

Target
VGW_PORT
Default
:7070
Value
:7070
Web Interface AddressVariable

Listen address for the web interface. Empty switches the interface off entirely.

Target
VGW_WEBUI_PORT
Default
:7071
Value
:7071
Admin AddressVariable

Listen address for the admin API. Empty switches it off; the web interface then cannot manage accounts.

Target
VGW_ADMIN_PORT
Default
:7080
Value
:7080
Plain HTTP For Web InterfaceVariable

Serve the web interface over plain HTTP. Right for a LAN without a certificate; set to false once you put a reverse proxy with TLS in front.

Target
VGW_WEBUI_NO_TLS
Default
true
Value
true
Account StoreVariable

Directory for the built-in account store. Must match the container side of the Accounts mapping.

Target
VGW_IAM_DIR
Default
/config
Value
/config
RegionVariable

The S3 region string the gateway answers with. Many clients insist on one; the value itself does not matter as long as client and gateway agree.

Target
VGW_REGION
Default
us-east-1
Value
us-east-1
Health PathVariable

A GET on this path answers without credentials, so a monitor or a reverse proxy can check the gateway is alive.

Target
VGW_HEALTH
Default
/_health
Value
/_health