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

Deploy MaxIO | (Just Updated) MinIO Alternative, S3-Compatible Object Storage, Keys Generated, Data Survives Redeploys

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 /data at 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_KEY and MAXIO_SECRET_KEY are 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 the RAILWAY_PUBLIC_DOMAIN of the maxio service, also published as the variable S3_ENDPOINT
  • Private URL: http://maxio.railway.internal:8080 (also the variable S3_PRIVATE_ENDPOINT), for services in the same project
  • Credentials: the variables MAXIO_ACCESS_KEY and MAXIO_SECRET_KEY. They stay the same across redeploys.
  • Auth: AWS Signature V4, service s3, region us-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 /healthz returns 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 /data volume.
  • 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

Implementation Details

VariablePurpose
MAXIO_ACCESS_KEYS3 access key, generated per deploy.
MAXIO_SECRET_KEYS3 secret key, generated per deploy. Keep it server-side.
S3_ENDPOINTPublic HTTPS S3 endpoint.
S3_PRIVATE_ENDPOINTPrivate endpoint for services in the same Railway project.
RAILWAY_RUN_UIDSet 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

More templates in this category

View Template
RustFS | (Just Updated) S3 Object Store, Public URL and Keys Set
S3-compatible object store, keys and public URL preset, volume kept

SuperSlowSloth
0
View Template
TimescaleDB
A PostgreSQL-based time-series database for analytics on Railway.

Rakit
1
View Template
Garage S3 Storage
Ultra-light S3 server: fast, open-source, plug-and-play.

PROJETOS
8