Skip to content

System Requirements

Minimum Requirements

ResourceMinimumRecommended
CPU2 cores4+ cores
RAM4 GB8+ GB
Disk20 GB50 GB
OSLinux (amd64)Ubuntu 22.04+
Docker24.0+26.0+
Docker Composev2.20+Latest

The host only runs the application services, Redis, Caddy, and analytics — Postgres is managed by Supabase Cloud, so the host no longer needs headroom for the database.

Prerequisites

Before deploying, provision these external services:

  • A Supabase Cloud project — provides managed Postgres and Auth (GoTrue). You will need both connection strings (transaction pooler on 6543 and session pooler on 5432) and the project's publishable + secret API keys (Project Settings → API Keys). Dashboard sessions are verified against the project JWKS (asymmetric ES256), so there is no shared JWT secret to manage. See Docker Compose Setup for the provisioning runbook.
  • A Hetzner Object Storage project — stores all media objects (see Storage Backend).
  • A Cloudflare-managed DNS zone (or another supported DNS provider) — for wildcard DNS-01 TLS (see Wildcard TLS).

Storage Planning

Media objects are stored in Hetzner Object Storage, not on the host. Capacity and durability scale with your Hetzner project — there is no local object-storage disk to provision. The host disk only needs room for the OS, container images, Redis persistence, and logs.

Usage LevelUsersMedia Volume (Hetzner)
Small1–10< 500 GB
Medium10–501–5 TB
Large50–20010–50 TB

Network

All self-hosted services run on a private Docker network (medialocker). Only Caddy exposes ports 80 and 443. Outbound connectivity to Supabase Cloud (Postgres pooler + Auth API) and Hetzner Object Storage is required.

Firewall Rules

Allow inbound:

  • 80/tcp — HTTP → HTTPS redirect
  • 443/tcp — HTTPS (TLS)

Allow internal (Docker network):

  • All ports between medialocker-network services

Allow outbound:

  • 443/tcp — Supabase Auth API + Hetzner Object Storage
  • 5432/tcp and 6543/tcp — Supabase Cloud Postgres poolers

Ports Summary

ServicePortPublic?
Caddy80, 443Yes
Redis6379No

DNS Configuration

Wildcard DNS covers the service subdomains (app, api, mcp, docs, ...):

medialocker.io      → <server-ip>
*.medialocker.io    → <server-ip>

Set up these A/CNAME records:

  • medialocker.io → your server IP
  • *.medialocker.io → your server IP

Docker Volumes

The following named volumes are created:

VolumePurposePersistence
redis_dataRedis AOF/RDBRecommended
caddy_dataTLS certificatesRequired
caddy_configCaddy stateRequired

Released under the AGPL-3.0 License.