Lumio / self-hosted
Guide

Install Lumio on a Synology NAS.

Step by step from Container Manager to your first gallery — plus an honest take on which models fit and where the limits are. Lumio brings its own storage (MinIO), so it runs without any cloud.

Will your Synology run it?

Lumio is a plain Docker Compose stack that brings everything it needs with it (PostgreSQL, Redis, MinIO for object storage, Caddy, the app itself). So it runs on a sufficiently capable NAS — but these points should line up:

  • DSM 7.2 or newer with Container Manager — it ships Docker ≥ 24 and Compose v2 (the old Docker package isn't enough)
  • 64-bit model — x86-64 Plus models (DS920+/DS923+, DS1522+/DS1621+) recommended; arm64 works too, old 32-bit ARM models don't
  • RAM: photos only from 4 GB, with video 8 GB, AI tagging another +4 GB (best left off on the NAS)
  • Free space on a volume for the data (images, database)

If your NAS has only 2 GB RAM or is a 32-bit ARM model: not recommended.

Performance & limits — honestly

What to expect:

  • The first start builds the images itself (frontend, API, Python worker with libvips). On a NAS CPU that's slow and RAM-hungry — budget 10–30+ minutes and a couple of GB of free RAM.
  • Video transcoding is the heaviest task (x264 on CPU). A 2-core NAS transcodes slowly and one at a time; photo-only studios are much lighter.
  • Client downloads run straight from the NAS's local storage — speed depends on your home upload bandwidth. Large ZIPs are split into parts automatically.

What you have to live with:

  • No GPU tagging — it needs NVIDIA/CUDA, which no Synology has. AI tagging runs on CPU only (slower) and is best left off on the NAS.
  • DSM owns ports 80/443 — we put Lumio's Caddy on high ports and front it with the DSM reverse proxy (step 3).
  • DSM updates and reboots restart the containers; thanks to the restart policy they come back on their own, but with a few minutes of downtime.
  • This is single-studio self-hosting — you don't want to run multi-tenant with wildcard TLS on a home NAS.

Step 1 — Container Manager & files

Install Container Manager from the Package Center (DSM 7.2+) and enable SSH (Control Panel → Terminal & SNMP). Then over SSH:

# Check Compose v2
sudo docker compose version   # must print v2.x

# Create a folder and get the source
mkdir -p /volume1/docker && cd /volume1/docker
git clone https://github.com/markusthiel/lumio.git
cd lumio
cp .env.example .env

If git isn't available on your NAS: download the repository as a ZIP on your PC and upload the extracted folder via File Station to /volume1/docker/lumio.

Step 2 — Secrets & ports

Generate secure random secrets:

sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')|" .env
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$(openssl rand -base64 32 | tr -d '/+=')|" .env
sed -i "s|^SESSION_SECRET=.*|SESSION_SECRET=$(openssl rand -base64 32 | tr -d '/+=')|" .env
sed -i "s|^S3_ACCESS_KEY=.*|S3_ACCESS_KEY=$(openssl rand -hex 12)|" .env
sed -i "s|^S3_SECRET_KEY=.*|S3_SECRET_KEY=$(openssl rand -base64 32 | tr -d '/+=')|" .env

DEPLOYMENT_MODE=single is the default — leave it. Single mode auto-creates a studio on first start, no super admin needed.

DSM already listens on 80/443. Put Lumio's Caddy on high ports in .env so nothing clashes:

CADDY_HTTP_PORT=8080
CADDY_HTTPS_PORT=8443

Step 3 — TLS via the DSM reverse proxy

The cleanest path on a NAS: let DSM terminate HTTPS with a Synology-managed certificate and forward plain HTTP to Lumio's Caddy. Lumio's Caddy explicitly supports this external reverse-proxy mode.

  1. DNS: point two names at the NAS — a real domain or Synology DDNS (e.g. name.synology.me): gallery.example.com and s3.example.com.
  2. Certificate: Control Panel → Security → Certificate, get a Let's Encrypt cert for both names.
  3. Reverse proxy: Control Panel → Login Portal → Advanced → Reverse Proxy, create two rules to http://localhost:8080; enable HTTP/2 and WebSocket, forward the Host header.

Then tell Lumio its public identity (in .env):

LUMIO_HOST=gallery.example.com
LUMIO_S3_HOST=s3.example.com
PUBLIC_URL=https://gallery.example.com
S3_PUBLIC_URL=https://s3.example.com

Caddy trusts X-Forwarded-Proto from private ranges, so it correctly sees the DSM-terminated HTTPS.

Alternative: if you'd rather let Caddy obtain certificates itself, you have to free up 80/443 (move DSM's ports or port-forward on the router) — usually more fuss on a NAS.

Step 4 — Start & create an admin

# Start the stack — the first run builds the images (be patient, see Performance)
sudo docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

# Watch progress
sudo docker compose logs -f

Once everything is running, create the first user:

sudo docker compose exec api npm run create-admin \
  -- --email=you@example.com --password=atleast12chars

Studio login at https://gallery.example.com. You're live once creating a test gallery, uploading an image, sharing the link and opening it from your phone all work.

Common questions about the Synology setup

Which Synology models are suitable for Lumio? +

Ideally x86-64 Plus models with enough RAM — such as the DS920+/DS923+ or DS1522+/DS1621+. 64-bit ARM models (arm64) also work, just without GPU tagging. Old 32-bit ARM entry models are not supported. The baseline requirement is always DSM 7.2 or newer with Container Manager, because that ships Docker Compose v2.

Is my NAS RAM enough? +

Rule of thumb: photos only need at least 4 GB, with video transcoding 8 GB, and the optional AI auto-tagging adds another 4 GB on top. 2 GB entry models are too small. Many Plus models can be upgraded to 8 to 32 GB — on a NAS that is almost always worth it.

Can I use AI auto-tagging on the NAS? +

Technically yes, but without a GPU it runs on the CPU only — much slower and memory-hungry (around 4 GB extra; the ML image is ~2.5 GB). GPU acceleration needs NVIDIA/CUDA and is not available on any Synology. On a NAS we recommend leaving the ML profile off; every other feature works without it.

How fast are gallery downloads for my clients? +

The files sit locally on the NAS, so your home upload bandwidth caps the speed — not the NAS itself. Large downloads are automatically split into multiple part ZIPs, which helps with flaky connections. For very large archives or many concurrent clients, external S3 (Hetzner, Backblaze B2) pays off so the NAS only runs the app.

How do I do backups? +

Back up two things: the Postgres database and the object data (the MinIO volume). Synology Hyper Backup can back up the /volume1/docker/lumio folder together with the Docker volumes — ideally to a second, off-site target. Details are in the backup docs in the repository.

Ready for your own gallery?

Source code on GitHub, questions and discussions there too. If anything in the Synology guide trips you up, reach out — we're happy to improve the docs.