
Deploy MaxIO | (Just Updated) MinIO Alternative, S3-Compatible Object Storage, Keys Generated, Data Survives Redeploys
MaxIO S3-compatible object storage, MinIO replacement, on a volume, keys on
Just deployed
/data
Deploy and Host MaxIO on Railway
Built for an LLM agent to deploy and use. There is no wizard and no form to fill in: the access key and secret key are generated at deploy time, and the contract below lists every URL, variable name and the one script that proves the store works. Create a bucket, put an object, read it back, with nothing but curl.
MaxIO is an open-source (Apache-2.0) S3-compatible object storage server written in Rust, built as a single-binary replacement for MinIO. It works with the AWS CLI, mc, rclone and any S3 SDK, and ships a web console at /ui/. This template runs the official MaxIO 0.4.2 image, pinned by digest, as one service with its data on a Railway volume.
About Hosting MaxIO
This template runs one service with a volume at /data. Buckets are directories and objects are files under that volume, together with the SSE-S3 keyring (/data/.maxio-keys.json), so buckets, objects and encryption keys are all still there after a redeploy. Three things are handled for Railway:
- Writable volume. Railway mounts volumes root-owned while the image runs as an unprivileged user, so the volume would be read-only. The service runs as root and logs the owner and writability of
/dataat boot. - Port follows Railway. The S3 API, the console and the health probe all listen on
$PORT(8080), on both IPv4 and IPv6, so the public domain, the healthcheck and the private network reach it. - Generated keys.
MAXIO_ACCESS_KEYandMAXIO_SECRET_KEYare random per deploy. MaxIO refuses to start with its built-in default keys, so there is never a well-known credential live on a public URL.
Agent contract
- Public URL:
https://plus theRAILWAY_PUBLIC_DOMAINof themaxioservice, also published as the variableS3_ENDPOINT - Private URL:
http://maxio.railway.internal:8080(also the variableS3_PRIVATE_ENDPOINT), for services in the same project - Credentials: the variables
MAXIO_ACCESS_KEYandMAXIO_SECRET_KEY. They stay the same across redeploys. - Auth: AWS Signature V4, service
s3, regionus-east-1, path-style addressing ($S3_ENDPOINT/BUCKET/KEY). A request with no signature returns 403. The web console is$S3_ENDPOINT/ui/. - Health:
GET /healthzreturns 200, no credentials
# run with S3_ENDPOINT, MAXIO_ACCESS_KEY and MAXIO_SECRET_KEY set (curl 7.75 or newer)
SIG="--aws-sigv4 aws:amz:us-east-1:s3 --user $MAXIO_ACCESS_KEY:$MAXIO_SECRET_KEY"
curl -s -o /dev/null -w 'health %{http_code}\n' "$S3_ENDPOINT/healthz"
curl -s -o /dev/null -w 'no-credential %{http_code}\n' "$S3_ENDPOINT/"
curl -s -o /dev/null -w 'create-bucket %{http_code}\n' $SIG -X PUT "$S3_ENDPOINT/agent-bucket"
curl -s -o /dev/null -w 'put-object %{http_code}\n' $SIG -X PUT --data-binary 'hello from an agent' "$S3_ENDPOINT/agent-bucket/agent.txt"
curl -s $SIG "$S3_ENDPOINT/agent-bucket/agent.txt"
curl -s $SIG -G --data-urlencode list-type=2 "$S3_ENDPOINT/agent-bucket" | grep -o 'agent.txt' | head -1
curl -s -o /dev/null -w 'delete-object %{http_code}\n' $SIG -X DELETE "$S3_ENDPOINT/agent-bucket/agent.txt"
A fresh deploy prints health 200, no-credential 403, create-bucket 200, put-object 200, hello from an agent, agent.txt and delete-object 204. With the AWS CLI the same store is AWS_ACCESS_KEY_ID=$MAXIO_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$MAXIO_SECRET_KEY aws --endpoint-url $S3_ENDPOINT s3 mb s3://agent-bucket.
Why Deploy MaxIO on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying MaxIO on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
- Agent-ready - generated keys, a contract block and one working script; no setup wizard.
- S3 on a public HTTPS URL plus a private URL for services in the same project.
- Keys and endpoints preset as variables:
S3_ENDPOINT,S3_PRIVATE_ENDPOINT,MAXIO_ACCESS_KEY,MAXIO_SECRET_KEY. - Buckets, objects and the encryption keyring survive redeploys on the
/datavolume. - One small Rust binary with no database to run beside it.
Common Use Cases
- Self-hosted S3 storage for application uploads and media
- Backup target for databases and tools such as restic or rclone
- A MinIO-compatible store for development, staging and CI
- Artifact, model and dataset storage for AI agents and data pipelines
Dependencies for MaxIO Hosting
- None. MaxIO runs as one service with a volume at
/data.
Deployment Dependencies
- MaxIO: https://github.com/coollabsio/maxio
- Production checklist: https://github.com/coollabsio/maxio/blob/main/docs/PRODUCTION.md
- Official image: https://github.com/coollabsio/maxio/pkgs/container/maxio
Implementation Details
| Variable | Purpose |
|---|---|
MAXIO_ACCESS_KEY | S3 access key, generated per deploy. |
MAXIO_SECRET_KEY | S3 secret key, generated per deploy. Keep it server-side. |
S3_ENDPOINT | Public HTTPS S3 endpoint. |
S3_PRIVATE_ENDPOINT | Private endpoint for services in the same Railway project. |
RAILWAY_RUN_UID | Set to 0 so the process can write the root-owned volume. |
Use path-style addressing and the region us-east-1. Back up the /data volume, including /data/.maxio-keys.json, before relying on server-side encryption.
Template Content
