Deciding to self-host is the easy part; the [self-hosting math guide](/savings/how-to/self-hosting-honest-math) covers whether it pays. This guide is what comes after yes: a short list of habits that keep a tool you run yourself from becoming the thing that loses your data or lets someone in. It covers backups and restore tests, updates, who can sign in, whether to put it on the internet, how you find out it is down, where the secrets live, who answers the alert, and when to stop. Lopifi plans to run this for customers once the service opens; today it is not open and there is no uptime commitment, so treat everything below as work you or a hired person does.
Move and replace · guide 5 of 7 · Reviewed Oct 25, 2026
Each calculator opens on a made-up sample. Type over it with your own figures; nothing you type leaves this tab.
The honest yearly cost of running open-source software yourself, set against the bill it replaces, with the seat count where it stops paying.
Arithmetic only, not tax, accounting or legal advice. Check the figures against your own order form.
Before the tool holds real data, write a single page and keep it somewhere that does not depend on the tool. It is the document the next person opens at an awkward hour, and writing it is how you find out what you do not know.
Start with what has to be in the backup, because a copy of the wrong folder looks fine until the day you need it. The project's own documentation says what that is. Nextcloud's manual lists five things to retain: the config folder, the custom apps folder (only if you have custom apps), the data folder, the theme folder and the database. Vaultwarden's wiki marks its database and its attachments directory as required, and config.json and the rsa_key* files as recommended. It also warns that config.json holds some plaintext sensitive data and that the key files should be encrypted if they go to cloud storage, so the backup itself needs protecting.
For a database that is being written to, use the project's own backup method rather than copying the live file. Vaultwarden's wiki shows the SQLite .backup command and, since version 1.32.1, a built-in /vaultwarden backup command; in Docker that is docker exec -it vaultwarden /vaultwarden backup. Nextcloud's manual describes maintenance mode, which locks the sessions of logged-in users and prevents new logins to help avoid inconsistent data, and gives sudo -E -u www-data php occ maintenance:mode --on to turn it on. Set it back when you finish.
Keep a copy somewhere that does not share a failure with the server: another provider, another account, credentials that the server itself cannot use to delete it. That part is our advice, not a quotation from any source. If you use restic, its documentation shows how to check the repository: restic check verifies the structure, the --read-data flag also verifies the integrity of the pack files, and --read-data-subset checks a part at a time. The docs warn that --read-data downloads all pack files, so it can raise bandwidth costs.
Checking a repository is not the same as restoring from it. The restore test is the real one.
Use a scratch machine or folder, never the production server. Put the date on the calendar every quarter and assign it to a person.
With restic the docs show restic -r /srv/restic-repo --no-cache restore c23e491f --target /tmp/restore-work; replace the repository path, snapshot ID and target with yours. Whatever tool you use, restore from the copy that lives elsewhere, not the one next to the server.
Start the tool against the restored copy, sign in, and open a few records you know. For a file tool that is a real folder and a real document. For a password vault it is an item you can read.
Record how long it took and what was missing or confusing. Fix the runbook. The time it took is the real answer to "how long are we down if the server dies".
Self-hosted software does not update itself on your schedule; you are the vendor's operations team. NIST's patching guide describes enterprise patch management as the process of identifying, prioritizing, acquiring, installing and verifying patches, updates and upgrades, and frames it as preventive maintenance: a cost of doing business. You do not need an enterprise program, but you need all five verbs, and you need to do them on a rhythm.
Read the project's upgrade page before the first update, not during an incident. Nextcloud's says to maintain regular backups and make a fresh one before every upgrade, and that the upgrade must go step by step: you reach the latest point release of your current major version before the next major one, and you cannot skip major releases. It also tells you to review third-party apps for compatibility first. Projects differ, so find the equivalent rules for yours and put them in the runbook.
To decide what cannot wait for the monthly window, CISA maintains a catalog of vulnerabilities that have been exploited in the wild and says organizations should use it as an input to their vulnerability management prioritization. Check whether your software or the software under it (the operating system, the web server, the container runtime) appears there. This guide does not tell you which fixes matter; the project's announcements and that catalog do.
Every self-hosted tool is one more login. The simplest control is the one CISA starts with: multifactor authentication on admin accounts and on people who handle sensitive data, extended to systems like email, file storage and remote access. CISA ranks the methods: security keys give the best protection against phishing, number-matching app prompts are strong, and text or email codes are the weakest and a last resort, though any MFA is better than none.
Single sign-on is attractive because removing a person in one place removes their access everywhere, which is the point of the offboarding guide. Whether a given tool supports it, and in which edition, is a question for that project's documentation; the Okta page covers what replacing a paid identity provider involves. If a tool cannot use your sign-in system, put it on the offboarding checklist by name so it is not forgotten.
The question is not whether the tool is secure; it is who needs to reach it. If only your team uses it, it does not need a public address. Keep it on a private network or behind a connection your team already uses, and the number of people who can even attempt a login drops from everyone on earth to the people you gave access to. That is our recommendation and reasoning, not a quoted rule.
Some tools have to be public, because customers or outside contacts use them. In that case serve them over HTTPS, keep their admin pages away from the public, and keep the software current, since a public tool is the one that gets probed. Vaultwarden's wiki says it is heavily recommended to activate HTTPS before enabling its admin page, to avoid possible man-in-the-middle attacks. Uptime Kuma's README shows binding its port to 127.0.0.1:3001:3001 to limit access to localhost, a small example of publishing only what you meant to.
You want to hear about a problem before a customer or a colleague tells you. Uptime Kuma is one open-source option: its README lists monitor types including HTTP(s), TCP, ping, DNS record, push and Docker containers, notifications through channels such as email, Slack, Telegram and Discord, and 20-second check intervals. The README gives a docker run command that publishes port 3001 with a named volume for its data.
Two rules matter more than the tool. First, run the monitor somewhere other than the server it watches, or it goes down with it. Second, monitor the thing that matters: a page that returns 200 can still be serving an error, so check for a keyword on a real page, and add a push or heartbeat check for the backup job so that a backup that silently stops raises an alert. If you would rather not run a monitor at all, the Pingdom page covers the paid uptime-check job and its alternatives.
OWASP's cheat sheet is clear on the habits. Secrets should be rotated regularly so that stolen credentials only work for a short time; rotation is better automated than done by hand; each secret should have the minimum privileges for its use; secrets should never be logged, and should not be hardcoded using Docker ENV or ARG; environment variables are not recommended unless the other methods are not possible; and auditing is essential. For a small company that means a team password manager, not a spreadsheet and not a chat thread. The LastPass page covers the job of a team vault if you have not chosen one.
Take the admin interface seriously too. Vaultwarden's wiki says its ADMIN_TOKEN acts as the admin password, should be a long random string, and can be stored as an argon2id hash so it cannot simply be read out of the configuration. It also says that disabling the token gives unrestricted access to the admin panel, which it warns against unless you know what you are doing.
Self-hosting fails most often at the human layer. The tool is fine until the one person who understands it is on vacation, busy or gone. Name a primary and a backup. Agree what counts as an emergency (the tool is down during working hours, the backup has failed twice, a security update is overdue) and what can wait until Monday. Make sure the backup person has actually logged in and read the runbook, not only been told where it is.
Be honest about hours. A founder who answers the alert is paying with time that is not free, which is why the self-hosting math guide counts it. Lopifi plans to take this on for customers once the service opens. There is no service and no SLA today, so the person who answers is you or someone you hire. Read how we get paid to see how that is meant to work.
Put these on the calendar with a name next to each. The cadence is our suggestion, sized for a small team and a handful of tools. The tasks come from the sections above.
restic check.Stopping is not failure; it is the outcome of the same math that told you to start. Several signals mean the arrangement has stopped paying.
Take a full export in a format another tool can read and confirm it opens. The exit plan in the runbook is for this day.
A paid plan of the same product, a different product, or a managed service. The consolidation guide and the software spend audit checklist help you compare.
Keep the self-hosted copy read-only while the new one does real work, then shut down. Delete credentials, DNS records and backups according to your retention needs, and remove it from the vendor list in your vendor register.
Send us the export and see which lines are worth a second look. A connected version is planned.
Worked example. Type over it.
Result
| Self-hosting, per year | Amount |
|---|---|
| Hosting, backups, tooling | 720.00 |
| Admin and restore-test time | 2,640.00 |
| Total | 3,360.00 |
| One-off set-up (not in the yearly total) | 1,200.00 |
The saving holds only if the time is real. Price the admin hours at what that person's time costs the company, not at zero.