Deploying to multiple servers in parallel — a fleet of three web nodes, plus an S3 origin, plus an SFTP staging box — is one of the fastest ways to get version drift, half-rolled-out features, and 3 a.m. pages. One server takes the deploy, another times out, a third was on a stale branch, and now your users hit a load balancer that serves two different versions of the same page.
This guide covers how to deploy to multiple servers reliably: when to run deployments sequentially vs in parallel, how to keep an SSH, SFTP, and S3 target on the same commit, and how to roll back the entire fleet if one node misbehaves. DeployHQ calls this a Server Group — but the principles apply whether you use DeployHQ, a Bash loop, Ansible, or hand-rolled CI.
Sequential vs parallel: the deployment ordering decision
Before you set up multi-server deployments, decide the ordering model. This single choice determines blast radius and recovery time:
| Mode | What happens | When to use | Risk |
|---|---|---|---|
| Sequential | Each server completes the full deploy cycle before the next one starts | Production with a load balancer in front; databases that need migrations run once | Slower (N × deploy time) but if server 1 fails, servers 2-N never get touched |
| Parallel (batched) | Servers deploy in batches (DeployHQ uses 3 at a time); each stage must complete on all batch members before advancing | Stateless web tiers, CDN origins, identical app servers | Faster (≈ deploy time + N/batch overhead) but a partial failure leaves the fleet split-brain mid-deploy |
| Rolling / canary | Deploy to one node, validate, then continue | High-traffic production where bad code must be caught before it spreads | Adds an explicit validation step — see zero downtime deployment strategies |
The 80/20 rule we use in practice: parallel for build artefacts and static assets going to a CDN or read-replica fleet; sequential whenever a deployment runs database migrations, cron rewrites, or anything that can't be applied twice safely.
If you're not sure, start sequential. The extra minutes are cheaper than a half-deployed fleet.
Setting up a server group in DeployHQ
A Server Group in DeployHQ is the unit you deploy to instead of an individual server. One group can mix protocols — an SSH/SFTP app server, an FTP legacy box, and an S3 bucket for static assets — and they all receive the same commit, in lockstep.
To create one, open your project, click Servers & Groups in the left sidebar, then New Server Group:

Three settings matter most:
- Default branch: every server in the group will deploy from this branch. Mix
mainfor production servers andstagingfor a UAT box in the same group, and you'll lose the lockstep guarantee. Keep one branch per group; spin up a second group for staging. - Sequential or parallel: covered above. DeployHQ runs parallel in batches of 3 — useful if you have 10 nodes and want to limit concurrent load on shared resources like a single database or a license server.
- Notification preferences: route group deploys to a separate Slack channel from single-server deploys. The signal-to-noise ratio matters when an on-call engineer is triaging.
Adding servers to a group
Each server can belong to one group at a time. Open the server's settings and pick the group from the dropdown at the top:

A few rules we've learned the hard way:
- Servers in a group must share the same branch — otherwise you'll deploy commit
a1b2c3to two nodes andd4e5f6to a third. - Group ssh keys consistently: if one server uses key-based auth and another uses password auth, an automated deploy that triggers off a Git push will fail unpredictably. Standardise on SSH keys for all DeployHQ deployments.
- Test the connection on every server before grouping —
ssh user@hostfrom a known-good machine. A broken connection only surfaces mid-deploy otherwise.
Running a deployment to the whole group
Once your group is configured, deploying to it works exactly like deploying to a single server. Click Deploy Project, then choose the group from the Servers dropdown:

For the first deployment, DeployHQ sets the start revision to beginning of time
— meaning every server gets a full upload. Leave it as-is so every node in the fleet starts from the same baseline. If you skip this and only upload the diff, any server that was previously out-of-sync will stay out-of-sync, and Git deploy ≠ identical filesystem.
If you already know every server is on the same commit, click the orange commit selector and set start = end revision. That registers a no-op deploy and means future runs upload only the changed files — which is faster and safer once you're in steady state.
Click Deploy and watch each stage report progress. You'll see one log per server, with a play icon to expand individual server output:

Inspect a specific server when something looks off — for example, transfer durations that differ by more than 2-3× usually point to a network issue with that server, not a code problem:

What about failure handling? (the part most guides skip)
Here's the gotcha nobody puts in the docs: multi-server deploys can partially fail. Two servers upload cleanly, one times out on file transfer. Now your fleet is split-brain — two on the new commit, one on the old.
Three patterns to handle this in DeployHQ:
- Halt-on-failure (sequential mode): if server 1 fails, servers 2-N are never touched. The blast radius stays at 1. Recovery: fix the broken server, redeploy. The rest of the fleet was never disrupted.
- One-click rollback per server: when a parallel deploy leaves a server behind, use DeployHQ's one-click rollback on the divergent node to roll the fleet back to a known-good state, then investigate.
- Deployment hooks for health checks: add a SSH command hook (e.g.,
curl -fsS https://localhost/healthz) as the final deploy stage. If health check fails on any server, the deploy reports red and you stop the rollout before traffic shifts.
If you're running stateful services or migrations, pair this with database migration strategies for zero-downtime deployments — running migrations on each server in parallel is one of the classic ways to corrupt a shared database.
Automatic deployments to a server group
Once you're confident in a group, enable automatic deployments so every push to the branch triggers a fleet-wide rollout. Open Automatic Deployments in the left nav and toggle the group on:

A push to the configured branch now kicks off a deployment to every server in the group:

Two caveats worth flagging:
- Don't enable auto-deploy on production groups without a manual approval gate unless your CI runs a full test suite that's actually trusted. The Codebase + DeployHQ pattern in our automatic deployments guide shows how to wire test gates in.
- Use deployment windows for fleets that serve production traffic — DeployHQ supports availability schedules so a 5 p.m. Friday merge doesn't accidentally roll out to 20 servers.
Trying to wire something equivalent in Jenkins or a shell loop? It's possible — see DeployHQ vs Jenkins for how the two compare on multi-server deploys — but the operational burden of writing your own parallel deploy logic with proper failure handling, atomic releases, and rollback is often larger than teams expect.
Multi-server vs multi-environment: not the same problem
These get conflated constantly. They aren't the same:
- Multi-server (this article): one environment, multiple identical nodes — three production web servers behind a load balancer, all running the same branch.
- Multi-environment: separate dev / staging / production projects, usually different branches, often different secrets and database connections. That's a different setup — solved with multiple DeployHQ projects (or templates), not one server group.
If you mix these — say, putting your staging server in the same group as production — you'll deploy production code to staging on every release, defeating the point of staging. Keep the boundary clean.
Ready to deploy to a fleet?
Server groups are a feature on every DeployHQ plan — there's no per-server upcharge for grouping. If you're already deploying to a single server and you've outgrown it, you can sign up and add a second server to the same group in under five minutes.
If you have any questions about server groups, deployment strategies, or any other part of the DeployHQ platform, email us at support@deployhq.com or reach out on X (@deployhq).