Deployment boundary
Move a Docker Compose project to a single VPS
A VPS move is a change in operating boundary, not merely a different docker compose up command.
Define the host boundary first
Record who can access the server, which ports reach the public internet, and where the deployment can be recovered if the host is unavailable. A public service usually needs one HTTPS entry point rather than a collection of exposed application and database ports.
Turn the region into an explicit decision: proximity to primary users and external dependencies, a required data jurisdiction, proximity to operators and the recovery path, or a flexible shortlist that will be measured. This prevents a low headline price in the wrong region from becoming the default candidate.
Build resource floors from known requirements
Keep application RAM, database or cache RAM, and host reserve separate, then add them into one comparable RAM floor. Set the vCPU floor from upstream requirements, an existing deployment, or a representative load test; user count and a label such as “bursty” do not determine CPU demand by themselves.
Forecast protected state over the planning horizon, apply the selected free-space reserve, and add a separate allowance for the operating system, image layers, logs, and temporary work. For public workloads, apply the chosen traffic reserve to estimated monthly egress so every plan is compared against the same transfer boundary.
Carry state separately from containers
Images can be recreated. Databases, uploaded files, repositories, certificates, and configuration need an explicit persistence and recovery map. Keep the map next to the deployment project before migration begins.
Make the first launch reversible
Render the final configuration, record the image versions, and keep a backup of current state before switching traffic. The first VPS launch should also prove DNS, HTTPS, restart behavior, and a representative restore.
Compare snapshot scope, independent backup access, public-address pricing, CPU throttling, storage I/O terms, transfer overage, rescue access, and resize downtime beside the advertised CPU, RAM, and disk. These terms decide whether a nominally matching plan can actually support the intended operating and recovery path.