Skip to content
v0.5.0 Backups with database dumps are here → FIG. 1 — ONE SERVER, MOORED

Docker Compose stacks.
Backed up. On your domain.

A self-hosted web panel for one server. Paste a compose.yaml and get data folders, encrypted S3 backups with database dumps and a local domain with real HTTPS. Free, AGPL-3.0.

amd64 · arm64UnraidEnglish · PolskiAGPL-3.0
BROWSERon your LAN PHONEvia VPN HTTPS :443 SERVER · /opt/stacks CADDY *.home.example.com wildcard via DNS API nextcloud./data/ immich./data/ vaultwarden./data/ STACKMOOR PANEL :5001 ① dump databases ② snapshot each stack ③ encrypt (restic) ④ verify SHA-256 checksums reads files + dumps nightly · encrypted BUCKET B2 · S3 · R2 nothing exposed to the internet BROWSERon your LAN PHONEvia VPN HTTPS :443 SERVER · /opt/stacks CADDY *.home.example.com · DNS API nextcloud./data/ immich./data/ vaultwarden./data/ files + dumps STACKMOOR PANEL :5001 ① dump databases ② snapshot each stack ③ encrypt ④ verify checksums nightly · encrypted BUCKET B2 · S3 · R2
FIG. 2 — HOW STACKMOOR SITS ON YOUR SERVER

DETAIL DRAWINGS

Paste a compose file. Stackmoor takes care of the rest.

DETAIL B · BACKUPS

Restorable, not just stored.

Databases dumped while apps keep running. Every stack its own encrypted restic snapshot in Backblaze B2, Amazon S3, Cloudflare R2, Hetzner or Wasabi. Unchanged files are never uploaded twice.

postgres mysql / mariadb mongodb redis
NEW DATA PER NIGHT ✓ CHECKSUMS OK
LAST 10 NIGHTS · EXAMPLE
DETAIL C · DOMAINS

Real HTTPS on your LAN

Caddy gets one wildcard certificate through your DNS provider’s API – 14 providers, or an internal CA. No port forwarding.

https://cloud.home.example.com
DETAIL D · VOLUMES

No paths to type

Named volumes and image VOLUMEs become folders in the stack, owned by PUID:PGID.

nextcloud/
├─ compose.yaml
└─ data/
   ├─ app-var-www-html/
   └─ db_data/
DETAIL E · UPDATES

Found for you, applied by you

New images and panel versions with release notes. A backup runs first; nothing changes until you click.

current image → new image
DETAIL F · LOGS

Live, per service

Follow one container or the whole stack. Every operation keeps its output in the history.

app-1 GET /status.php 200
db-1 checkpoint complete
app-1 ▍

SECTION A–A · BACKUP CYCLE

Every night, every stack – and proof that it can be restored.

One encrypted restic repository in your bucket holds all stacks and the panel’s own settings.

  1. 01 Dump the databases Detected automatically; the dump replaces the raw database files.
  2. 02 Snapshot each stack Its own snapshot, so one app can be restored or cloned alone.
  3. 03 Encrypt and upload B2, S3, R2, Hetzner, Wasabi or any S3-compatible storage.
  4. 04 Verify the checksums After every run, 10% read back weekly, everything on demand.
  • --schedule days + time, in your time zone
  • --keep daily / weekly / monthly
  • --pre-update backup before every update
  • --verify SHA-256 checksums
  • --restore one stack, or a clone
  • --encrypt always on, your password
03:00:00 scheduled backup started
db: dumping the database (postgres)…
$ restic backup /opt/stacks/nextcloud
✓ nextcloud: 3.2 GB (new data: 48 MB)
✓ panel settings and Caddy files
$ restic forget --prune --keep-daily 7 --keep-weekly 4
$ restic check --read-data-subset=10%
✓ Checksums OK (10% of the data) █

SPECIFICATION

SM-01 · EDITORValidated before savingChecked with docker compose config – a broken file is never saved.
SM-02 · PORTSChecked before startSee which container uses a port, and a free one to pick instead.
SM-03 · FILESPlain compose foldersStacks stay normal compose.yaml folders you can still use from the shell.
SM-04 · TRASHNothing deleted by accidentRemoving or restoring a stack moves its old folder to .trash/.
SM-05 · ACCESSOne admin, locked downscrypt passwords, login rate limit, CSRF protection, optional domain-only access.
SM-06 · PLATFORMLinux, amd64 / arm64, UnraidImages on GitHub Container Registry; settings in SQLite.
SM-07 · INSTALLOne script, also updatesInstalls Docker if missing; run it again to update the panel.
SM-08 · LICENSEFree and open sourceAGPL-3.0 – free for everyone, improvements stay open.

TABLE 1 — COMPARED WITH FREE EDITIONS

Less platform. More of what a home server needs.

ITEM STACKMOOR DOCKGE PORTAINER CE
Compose stacks in the browser●●●
App data into the stack folder, automatically●○○
App and database backups with restore● S3 / B2○○
Local domains with certificates● Caddy○○
Many servers○ not yet● agents●
Several user accounts○ one admin○ one admin●
LicenseAGPL-3.0MITzlib

● built in · ○ not built in — from each project’s documentation, October 2026. Out of date? Open an issue.

ASSEMBLY — 3 STEPS

Up and running before your coffee cools.

DETAIL A — FIRST INSTALL
root@server:~# curl -fsSL https://raw.githubusercontent.com/gadziunet/stackmoor/main/install.sh | sudo bash
[ ok ] Docker found
[ ok ] Stacks folder: /opt/stacks
[ ok ] Stackmoor is running
➜ Open http://<server-ip>:5001 █
  1. 01 Run the command as root Docker is installed if missing. On Unraid add the image ghcr.io/gadziunet/stackmoor instead.
  2. 02 Open the panel http://<server-ip>:5001 – create the admin account.
  3. 03 Paste a compose.yaml Then add your bucket in Settings → Backups and a domain in Settings → Domains.