How it works
How it works
How it works
Everything runs from your machine over SSH. There is no agent on the VM, no control plane, and nothing extra listening that you have to secure.
sequenceDiagram
autonumber
participant You as your machine<br/>(baryovm)
participant VM as your VM<br/>(sshd, docker)
participant Site as the running site
You->>VM: pg_dump, before anything changes
You->>VM: sync the source (never the compose dir)
You->>VM: docker build
You->>VM: docker compose up
You->>VM: post-deploy: reload nginx, restore SELinux context
You->>VM: verify: run the check on the VM
VM->>Site: curl healthUrl, or your own check script
alt serving
Site-->>VM: 200
VM-->>You: release done
else not serving
Site-->>VM: error, or no answer
VM-->>You: release fails, the stack needs attention
end
Note over You,VM: agentless. no daemon on the VM,<br/>no control plane, SSH key paths only
The backup comes first on purpose: one taken afterwards would already contain whatever a start-time migration did. The verify step is the one that turns "every command succeeded" into "the site is serving", and those are not the same thing.
The tool stores SSH key paths, never key material, and never reads your
application secrets. A stack's compose directory is never in a release
manifest's sync list, so --delete cannot wipe a .env.
Why not just ask a coding agent to deploy it
An agent can absolutely ssh in, rsync a directory and run docker compose up.
It will usually work. The problem is what "usually" costs.
It reconstructs the deploy every time. Nothing is written down, so each run
re-derives the host, the paths, the build order and the restart command from
whatever it can infer that day. A deploy is a thing you want to be identical on
the fortieth run and the first. baryovm stack release app is one command that
does the same thing every time, and the manifest is in your repository where a
reviewer can see it.
The dangerous commands are the ones easiest to get subtly wrong. This tool
carries a comment about rsync's trailing-slash rule because getting it wrong,
combined with --delete, empties a webroot and puts the site one directory
down. That is a live outage produced by a single character. An agent writing
rsync from scratch is one plausible-looking flag away from it, and the output
looks like success.
Safety defaults do not survive improvisation. A release here backs the
database up before it touches anything, because a backup taken afterwards
already contains whatever a start-time migration did. The compose directory is
never in the sync list, so --delete cannot reach a .env. An unattended
update refuses to run on a stack with no health check, because an update that
cannot tell a healthy start from a crash loop is worse than no update. Each of
those is a rule someone learned the hard way; none of them are things an agent
reliably reinvents under time pressure.
Credentials stay out of the conversation. BaryoVM stores SSH key paths,
never key material, and never reads your application secrets. An agent driving
ssh directly needs the connection details in its context to work at all.
And yes, the tokens. A deploy driven conversationally means reading the repository, inferring the topology, composing the commands, reading the output and iterating when something fails. That is a meaningful slice of a context window every single time, and you pay it again on the next deploy. One command costs none of it.
The honest version of this argument is not that agents cannot deploy. It is that a deploy should be a decision you already made, encoded once, rather than a thing re-reasoned from first principles while you watch. Use the agent to change the code. Let the tool ship it.