An S3 object store so reliable you can run it outside datacenters by DeuxFleurs with tailscale.
10K+
A ready-to-run Docker image for Garage, the lightweight, S3-compatible distributed object storage made by Deuxfleurs, with a built-in Tailscale client.
Your Garage nodes join your tailnet and talk to each other over Tailscale: build a multi-site cluster without opening any port on the internet.
Don't need Tailscale? Use waazaafr/garage-s3-simple instead.
garage.toml generation from environment variabless3 alias for aws s3)linux/amd64 and linux/arm64| Tag | Garage version |
|---|---|
latest | latest release |
2.4.1 | v2.4.1 |
New image releases follow the Garage releases from Deuxfleurs.
services:
garage:
image: waazaafr/garage-s3-tailscale:latest
container_name: garage
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
devices:
- /dev/net/tun
ports:
- "9000:9000" # S3 API
- "3901:3901" # RPC
- "3902:3902" # S3 web hosting
- "3903:3903" # Admin API
- "4080:4080" # Web UI (optional)
volumes:
- ./garage/config:/config
- ./garage/data:/data
- ./garage/meta:/meta
- ./garage/tailscale:/var/lib/tailscale
environment:
TS_AUTHKEY: "tskey-auth-xxxxx"
TS_HOSTNAME: "garage-node1"
ADMIN_TOKEN: "your-secure-token"
WEBUI_ENABLED: "true"
docker run -d \
--name garage \
--restart unless-stopped \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--device=/dev/net/tun \
-p 9000:9000 \
-p 3901:3901 \
-p 3902:3902 \
-p 3903:3903 \
-p 4080:4080 \
-v /path/to/config:/config \
-v /path/to/data:/data \
-v /path/to/meta:/meta \
-v /path/to/tailscale:/var/lib/tailscale \
-e TS_AUTHKEY="tskey-auth-xxxxx" \
-e TS_HOSTNAME="garage-node1" \
-e ADMIN_TOKEN="your-secure-token" \
-e WEBUI_ENABLED="true" \
waazaafr/garage-s3-tailscale:latest
The node then appears in your tailnet as garage-node1, and Garage is reachable on its Tailscale IP as well as on the published ports.
Required
| Variable | Description |
|---|---|
ADMIN_TOKEN | Token for the Admin API (and the web UI) |
TS_AUTHKEY | Tailscale auth key used to join your tailnet |
TS_HOSTNAME | Name of this node in your tailnet |
Optional
| Variable | Default | Description |
|---|---|---|
GATEWAY | 0.0.0.0 | Bind address of the S3 API and the Admin API |
RPC_SECRET | auto-generated | RPC secret shared by all nodes of a cluster (64 hex characters) |
REPLICATION_FACTOR | 1 | Number of copies of each object |
CONSISTENCY_MODE | degraded | consistent, degraded or dangerous |
BLOCK_SIZE | 5 | Block size, in MB |
COMPRESSION_LEVEL | 2 | Compression level |
TAILSCALE_FORCE_PORT | false | true to make Tailscale use a fixed UDP port |
TAILSCALE_UDP_PORT | 25565 | UDP port used when TAILSCALE_FORCE_PORT=true |
WEBUI_ENABLED | false | true to start the web UI on port 4080 |
META_SNAPSHOTS_ENABLE | false | true to enable automatic metadata snapshots |
META_SNAPSHOTS_DIR | /data/snapshots_meta | Where metadata snapshots are stored |
META_SNAPSHOTS_INTERVAL | 24 | Interval between metadata snapshots, in hours |
💡 For a multi-node cluster, every node must use the same
RPC_SECRET: let the first node generate it, then copy it from its/config/garage.tomlto the other nodes.
| Port | Service |
|---|---|
9000 | S3 API |
3901 | RPC (communication between Garage nodes, over Tailscale) |
3902 | S3 web hosting (static websites) |
3903 | Admin API |
4080 | Web UI (only if WEBUI_ENABLED=true) |
| Path | Content |
|---|---|
/config | Garage configuration (garage.toml, including secrets) |
/data | Object data — make sure it has enough space |
/meta | Metadata |
/var/lib/tailscale | Tailscale state, so the node keeps its identity and IP across restarts |
| Option | Why |
|---|---|
--cap-add=NET_ADMIN | Lets Tailscale create and configure its network interface |
--cap-add=SYS_MODULE | Lets Tailscale load the kernel modules it needs |
--device=/dev/net/tun | Gives access to the TUN device used by Tailscale |
TS_AUTHKEY and TS_HOSTNAME.tailscale0 interface and used as the RPC address of the node: nothing to configure./config/garage.toml does not exist): it is created from the environment variables; unset optional variables use their defaults, and a random RPC_SECRET is generated if none is given.GATEWAY and ADMIN_TOKEN are always re-applied; optional variables are updated only if they are explicitly set, everything else (such as RPC_SECRET) is kept.Garage release notes: git.deuxfleurs.fr/Deuxfleurs/garage/releases
v2.3.0 → v2.4.1.arm64.WEBUI_ENABLED=true and publish port 4080.Content type
Image
Digest
sha256:fdb4b0991…
Size
132.1 MB
Last updated
about 1 month ago
docker pull waazaafr/garage-s3-tailscale