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/backupsinside 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