[ LEVEL HIGHER ]
Operations / Alexander's field notes

How to Deploy Multiple SaaS Products on One Home Server Safely

A home server can run several useful SaaS products reliably, but only when each deployment treats every neighbouring service as protected infrastructure.

Isolation begins with an inventory

Every service needs a known directory, command, port, public hostname and data location. That inventory is the foundation for automation. Without it, a deployment script is forced to guess.

The inventory should be machine-readable and backed by a small amount of human documentation. Names matter less than consistency: one service should not silently borrow another service’s port or storage path.

Treat persistent data differently from code

Code is replaceable. Subscriber lists, orders, uploads and configuration are not. A deployment should stage new code, copy or preserve approved data locations and assert that protected environment files have not changed.

Do not rely on a broad folder copy without a data policy. It is safer to name the files and directories that must survive and fail the deployment when an unexpected state is detected.

Preflight on a separate port

Before stopping the production process, start the staged build on an isolated port. Check the homepage, key APIs, authentication and protected paths. If the preflight fails, production remains untouched.

A useful preflight tests both availability and privacy. Public routes should return the intended content. Environment files, databases and private downloads should not.

Make the swap narrow and reversible

Create a timestamped backup, stop only the target process, move the staged build into place and start the same service on the same port. Avoid restarting the entire server for a single landing-page update.

If the new process does not become healthy, restore the previous directory and restart it. The rollback path should be tested in logic even when it is rarely used.

Reverse proxy and public verification

A tunnel or reverse proxy maps public hostnames to local ports. A healthy local port does not prove that DNS, TLS and ingress rules are correct, so every deployment needs an external check.

Verify the canonical HTTPS URL, important subdomains and any webhook that depends on the public route. Keep admin surfaces unlinked, authenticated and excluded from indexing.

Observe without creating noise

Health checks should be small and authoritative: status code, expected JSON field, protected-file response and process state. Repeatedly crawling every file or restarting healthy services creates more risk than confidence.

The objective is not perfect infrastructure. It is a deployment system that makes the common safe path easy and makes dangerous mistakes difficult.

Alexander's public build log

See what gets built next.

Follow the next build →