
Self-hosting Garage the easy way
Yulei ChenGarage is a lightweight, S3-compatible distributed object storage service built for self-hosting. Unlike AWS S3 or other managed object storage providers, Garage is open-source, runs on modest hardware, and gives you full control over your data. If you're looking for a self-hosted alternative to expensive cloud storage, Garage is a solid pick.
Sliplane makes deploying Garage painless. With a one-click preset, you can have your own S3-compatible storage running in minutes - no server setup, no reverse proxy config, no infrastructure to babysit.
Prerequisites
Before deploying, ensure you have a Sliplane account (free trial available).
Quick start
Sliplane provides one-click deployment with presets.
- Click the deploy button above
- Select a project
- Select a server (If you just signed up you get a 48-hour free trial server)
- Click Deploy!
About the preset
The one-click deploy above uses Sliplane's Garage preset. Here's what it includes:
- Garage v2.3.0 binary (downloaded automatically on first deploy)
- Alpine 3.20 base image (provides the shell needed for startup configuration)
- Two persistent volumes: one for metadata (
/var/lib/garage/meta) and one for data (/var/lib/garage/data) - LMDB as the database engine for metadata (fast and reliable for single-node setups)
- Admin API exposed on the public endpoint with
/healthhealthcheck - Auto-generated credentials for the RPC secret, admin token, and metrics token
- TOML config written automatically at startup (no manual config file needed)
- Automatic cluster layout configured on first boot so the node is immediately ready
The preset runs a single-node Garage instance with replication_factor = 1, which is the right setting for a single-server deployment.
Next steps
Once Garage is running on Sliplane, access the admin API using the domain Sliplane provided (e.g. garage-xxxx.sliplane.app).
Cluster layout
The preset automatically configures the cluster layout on first boot, so your node is ready to use right away. You can verify the layout by checking the cluster status:
curl -H "Authorization: Bearer <your-admin-token>" https://<your-domain>/v2/GetClusterStatus
Replace <your-domain> with your Sliplane domain and <your-admin-token> with the GARAGE_ADMIN_TOKEN value from your service's environment variables.
Creating access keys and buckets
Create an access key:
curl -X POST -H "Authorization: Bearer <your-admin-token>" \
-H "Content-Type: application/json" \
-d '{"name": "my-key"}' \
https://<your-domain>/v2/CreateKey
Save the accessKeyId and secretAccessKey from the response. Then create a bucket:
curl -X POST -H "Authorization: Bearer <your-admin-token>" \
-H "Content-Type: application/json" \
-d '{"globalAlias": "my-bucket"}' \
https://<your-domain>/v2/CreateBucket
Grant your key access to the bucket:
curl -X POST -H "Authorization: Bearer <your-admin-token>" \
-H "Content-Type: application/json" \
-d '{"bucketId": "<bucket-id>", "accessKeyId": "<access-key-id>", "permissions": {"read": true, "write": true, "owner": true}}' \
https://<your-domain>/v2/AllowBucketKey
Connecting S3 clients
The S3 API runs on port 3900 inside the container. Other services on the same Sliplane server can connect to it using the internal hostname (e.g. garage-xxxx.internal:3900). Use the access key and secret you created above as your S3 credentials, with garage as the region.
Environment variables
The preset configures these key environment variables:
| Variable | Purpose |
|---|---|
GARAGE_VERSION | Garage binary version to download (default: v2.3.0) |
GARAGE_ADMIN_TOKEN | Token for authenticating admin API requests |
GARAGE_METRICS_TOKEN | Token for accessing the /metrics endpoint (Prometheus format) |
GARAGE_RPC_SECRET | Internal secret for node-to-node communication |
RUST_LOG | Log level (default: garage=info) |
Logging and troubleshooting
Garage logs to stdout by default, so all output is visible in Sliplane's built-in log viewer. If you need more detail, change RUST_LOG to garage=debug and redeploy. For general Docker log tips, check out our post on how to use Docker logs.
Cost comparison
You can also self-host Garage with other cloud providers. Here is a pricing comparison for the most common ones:
| Provider | vCPU | RAM | Disk | Monthly Cost | Note |
|---|---|---|---|---|---|
| Sliplane | 2 | 2 GB | 40 GB | €9 (~$10.65) | Flat rate, 1 TB bandwidth, SSL included |
| Fly.io | 2 | 2 GB | 40 GB | ~$18 | Disk and bandwidth billed separately |
| Render | 1 | 2 GB | 40 GB | ~$35 | 100 GB bandwidth, Disk billed separately |
| Railway | 2 | 2 GB | 40 GB | ~$67 + $20 plan | Pro plan floor, usage-based, bandwidth billed separately |
Click here to see how these numbers were calculated.
(Assuming an always-on instance running 730 hrs/month)
- Sliplane: flat €9/month for the Base server. Unlimited services on the same server, 1 TB egress and SSL included.
- Fly.io:
shared-cpu-2x2 GB = $11.83/mo + 40 GB volume × $0.15/GB = $6 -> ~$17.83/mo. Egress billed separately ($0.02/GB in EU). - Render: closest match is Standard ($25, 1 vCPU / 2 GB) plus 40 GB disk × $0.25/GB = $10 -> ~$35/mo. Stepping up to Pro (2 vCPU / 4 GB) costs $85/mo + disk.
- Railway (Pro plan): CPU 2 × $0.00000772/s × 2,628,000 s = $40.57; RAM 2 × $0.00000386/s × 2,628,000 s = $20.29; volume 40 × $0.00000006/s × 2,628,000 s = $6.31 -> ~$67/mo compute, plus the $20/mo Pro plan floor and $0.05/GB egress.
Bandwidth costs can add up fast on usage-based providers. Use our bandwidth cost comparison tool to see what your egress would cost on each platform.
FAQ
What can I use Garage for?
Garage works anywhere you'd use S3: file backups, static website hosting, media storage for web apps, or as a backend for tools like Nextcloud or Duplicati. It supports the standard S3 API, so most S3-compatible clients and libraries work out of the box.
Can I change the S3 region name?
Yes. The preset defaults to garage as the S3 region. If you need a different region name, you'll need to update the TOML config that the startup command generates. You can do this by modifying the service's command in Sliplane's settings.
How do I update Garage?
Change the GARAGE_VERSION environment variable in your service settings (e.g. from v2.3.0 to a newer version) and redeploy. Check Garage releases for the latest stable version. Garage handles data migrations automatically between minor versions.
Are there alternatives to Garage?
Yes. MinIO is the most popular S3-compatible self-hosted storage but requires more resources. SeaweedFS is another distributed storage option. For managed solutions, check out our list of 5 cheap object storage providers. If you just need file sync rather than S3, take a look at OpenCloud.
Is a single-node Garage setup reliable?
For personal projects, small teams, and non-critical workloads, a single-node setup works great. Garage uses LMDB for metadata storage, which is crash-safe. Your data is persisted to Sliplane volumes, so it survives container restarts. For production workloads that need redundancy, you'd want to run multiple Garage nodes across different servers.