Sthora
Managed services

Managed services

One-click PostgreSQL, Redis, and MinIO — pinned, published on no port, and reachable by container name.

A managed service is a database the platform runs for you, in its own compose project, on the shared network your applications are already on.

The three kinds

ImageDefault versionPortConnection URL
PostgreSQLpostgres17-alpine5432postgresql://…
Redisredis7.4-alpine6379redis://…
MinIOminio/minioRELEASE.2025-04-22T22-12-26Z9000 (console 9001)http://…

Every image tag is pinned. latest on a database is how an on-disk format changes underneath you.

You can pin a different version at creation. You cannot change it afterwards by editing a field — see changing versions below.

No published ports

A managed service publishes nothing to the host

A managed database reachable from the internet is the single most common way a self-hosted deployment is lost. Applications reach a service by container name on the shared network, never through a host port.

The names are fixed rather than left to Compose's <project>-<service>-1 scheme, because they get pasted into an application's configuration and must not change when the compose file is regenerated:

Hostnamesthora-svc-<slug>
Compose projectst-svc-<slug>
Data volumesthora-svc-<slug>-data

Connecting an application

GET /services/:id/connection is the only route that discloses generated credentials, and it writes an audit row every time it is read. The list and detail routes have no field that could carry one.

It returns the host, port, username, password, database, a ready-to-paste URL, and the variable names an application conventionally expects them under:

KindSuggested variables
PostgreSQLDATABASE_URL
RedisREDIS_URL
MinIOS3_ENDPOINT, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY

Copy them into the application's environment variables and redeploy.

Settings

SettingRange
name1–64 chars
version1–64 charsPinned per kind when omitted. Never latest.
environmentIdOptional. Scopes the service to one environment.
cpuLimit0.1–64
memoryLimitMb64–262144
backupScheduleFive-field cronSee backups.
backupTargetLOCAL | S3
backupRetentionCount1–365

Status and lifecycle

NEWPROVISIONINGRUNNING, or STOPPED / FAILED.

Start, stop, and restart are three explicit routes, never one :action segment. Services run through their own queue at concurrency 1 (SERVICES_CONCURRENCY).

What each kind is configured with

Changing a version

There is no in-place upgrade. A volume that already holds data from a different major version will stop the service from starting at all — Postgres refuses an on-disk format it did not write, and says so explicitly in the log.

The path is: back up, create a new service on the new version, restore into it, and repoint your applications.

On this page