I rent a single Ubuntu VPS to host several small applications at once. At first the way I deployed was simple: log in over SSH, pull the latest code, run the migrations, restart the service. For one application that was enough. For the second, I started losing track of which steps I had already run and which I had not.
The real problem was not the number of commands. It was that nothing was written down. There was no single place I could open to find out which version was actually running.
Each application is now packaged as a container, and Coolify runs them. The change I felt most was not performance, it was having boundaries:
The part that put my mind at rest most, oddly enough, was domains. Every service has its own subdomain, the certificates are handled automatically, and I no longer edit an nginx config every time something new goes up.
Two things, and neither was really about Docker.
First, storage. Images uploaded by users disappeared after the first deploy, because they were being written inside the container. Since then the upload folder always gets a volume, and mounting that volume is written into the deployment guide so it never gets skipped again.
Second, background work. A container that only runs a web server does not run a queue worker. Emails I had sent through the queue piled up quietly in the jobs table with no error message at all. Since then I make sure a worker is actually running, or I send after the response has already reached the browser.
A good deploy is not the fastest one, it is the one that asks least of your memory. If I have to remember a sequence of steps, sooner or later a step gets missed, usually late at night when I am in a hurry.