Docs · Backups

Backups and restore confidence

SteadyPlan is self-hosted: your server, your backups. This page explains what to back up, what the in-app restore does (and does not do), and a simple routine that stays safe without becoming a chore.

Trust checkpoint

In-app restore is a validated, two-step overwrite flow for one user at a time.

SteadyPlan previews the export first and creates a fresh whole-instance SQLite backup automatically before confirmed overwrite. If that safety backup cannot be created, restore stops and leaves current data unchanged.

Where data lives

Financial data is stored locally in a SQLite database (typically data/finance.db). In Docker, this is inside the container under /app/data/finance.db, backed by a host-mounted volume.

On Unraid, that host mount is often under /mnt/user/appdata/steadyplan (or whatever path you chose).

The same data directory also contains secret_key.txt (used to keep sessions stable). Include it in your backups.

A simple routine (recommended)

  • Back up your whole app data directory on a schedule (this is the real “whole instance” backup).
  • Before risky changes: download a fresh per-user JSON export. For restore, SteadyPlan will also create a fresh whole-instance SQLite backup automatically before overwrite.
  • Occasionally do a restore drill to a test container, so you know your backups actually work.

Per-user JSON export (portable)

A JSON export is a portable file containing the current user’s data. It is useful before risky actions and for moving a user’s data between instances.

  • Scope: one user only
  • Use it for: pre-change safety, portability, user-scoped restore
  • Does not include: other users, whole-instance settings, server secrets

Keep exports private. They contain financial data.

Whole-instance SQLite backups

The built-in SQLite backup tool creates a copy of the database for the whole instance (all users). Backups are stored under data/backups inside the app’s data directory (Docker: /app/data/backups).

  • Scope: whole instance (all users in the database)
  • Location: data/backups inside the data directory
  • Use it for: whole-instance recovery, belt-and-braces alongside exports

A backup file stored on the same disk/share is helpful, but it is not a complete disaster-recovery plan. Include the whole appdata directory in your wider server backup routine (snapshots, rsync, borg, etc.).

Before restore or delete

For best coverage, do both:

  • Download a fresh per-user JSON export for the user you’re about to affect
  • Create a whole-instance SQLite backup if you want a separate manual checkpoint as well

During in-app restore, SteadyPlan validates the export first and then creates a fresh whole-instance SQLite backup automatically before confirmed overwrite. If that safety backup cannot be created, restore stops and leaves current data unchanged.

How to restore

Per-user restore happens inside the app via the JSON export/restore flow. You validate the export first, then confirm overwrite for that user only. SteadyPlan creates a fresh whole-instance SQLite backup before overwrite, and it does not change usernames/passwords.

Whole-instance recovery is a server/admin task: stop the container and restore your appdata directory (at minimum finance.db and secret_key.txt) from your backup.

Next: Reverse proxy · Privacy · Install