Self-hosting Garage the easy way

Self-hosting Garage the easy way

Yulei Chen - Content-Engineerin bei sliplane.ioYulei Chen
7 min

Garage 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.

SliplaneDeploy Garage >
  1. Click the deploy button above
  2. Select a project
  3. Select a server (If you just signed up you get a 48-hour free trial server)
  4. 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 /health healthcheck
  • 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:

VariablePurpose
GARAGE_VERSIONGarage binary version to download (default: v2.3.0)
GARAGE_ADMIN_TOKENToken for authenticating admin API requests
GARAGE_METRICS_TOKENToken for accessing the /metrics endpoint (Prometheus format)
GARAGE_RPC_SECRETInternal secret for node-to-node communication
RUST_LOGLog 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:

ProvidervCPURAMDiskMonthly CostNote
Sliplane22 GB40 GB€9 (~$10.65)Flat rate, 1 TB bandwidth, SSL included
Fly.io22 GB40 GB~$18Disk and bandwidth billed separately
Render12 GB40 GB~$35100 GB bandwidth, Disk billed separately
Railway22 GB40 GB~$67 + $20 planPro 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-2x 2 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.

Self-host Garage now - It's easy!

Sliplane gives you everything you need to run your own S3-compatible object storage.