DeployManage, server management for any cloud
Connect a cloud account, launch a server with Nginx, PHP 8.1 to 8.4, MySQL or MariaDB, Redis and Composer, and deploy every client WordPress site straight from its git branch. Each release is built in its own folder, uploads and wp-config.php stay outside it, and traffic only moves when the whole build has passed.
One-time demo, no credit card required.
WP Engine, SpinupWP, Laravel Forge and Envoyer details read from their own docs and pricing pages in October 2026.
| Server | Provider | Load |
|---|---|---|
|
web-01.prod
fsn1
|
Hetzner |
32%
|
|
web-02.prod
fsn1
|
Hetzner |
47%
|
|
db-01.prod
fra1
|
DigitalOcean |
18%
|
|
worker-01
eu-central-1
|
AWS |
61%
|
|
mail-01
gra
|
OVHcloud |
9%
|
To deploy WordPress with git, keep your theme, plugins and composer.json in a repository, never uploads or wp-config.php, and have a deploy tool check out each commit into a new folder on the server, link the shared uploads folder and config file into it, and switch a symlink. DeployManage does that for every site on servers you own and can deploy on every push to GitHub, GitLab or Bitbucket. For a single site, SpinupWP or Laravel Forge cost less, and this page says where.
Most agencies still ship WordPress changes in one of two ways. Somebody drags a theme folder over SFTP, or somebody runs git pull inside the live document root. Both replace files while the site is answering requests, so for a few seconds a visitor can load a page that mixes the old functions.php with a new template part, and a fatal error lands in front of a client.
Neither method gives you a way back either. If a plugin update in the repository breaks checkout on a WooCommerce store, the old files are gone and the fix is another rushed commit. A release folder per deploy solves both problems: the new code is built next to the old code, the switch is one symlink, and the previous build is still on disk.
Paste a DigitalOcean or Hetzner API token and the server is created through their API, or run one install command on an AWS, Vultr, Linode or other Ubuntu VPS. You get Nginx, PHP-FPM 8.1 to 8.4, MySQL 8 or MariaDB, Redis, Composer and Supervisor, with only ports 22, 80 and 443 open.
Point a site at a repository and a branch. The server keeps a bare mirror of the repository, so each deploy only fetches what changed instead of cloning the whole history again.
On Growth and Business each deploy checks the commit out into releases/<timestamp>, runs your deploy script inside it, and only then points the current symlink at it. A failed composer install or build step stops the deploy and the live site keeps serving the previous release.
Your deploy script gets the site folder as DM_SITE_DIR. Two lines link the shared uploads folder and wp-config.php (or the Bedrock .env, which the panel shares automatically) into each new release, so media and credentials never live in git.
Turn on quick deploy and the panel gives you a webhook URL for GitHub, GitLab or Bitbucket. A push to the production branch starts a deploy, and the log streams in the panel with the commit hash, author and message.
Old builds are pruned automatically after five, so disk use stays flat. Going back means deploying the previous commit, which builds in a fresh folder and swaps the symlink the same way.
Add the client domain, point DNS at the server and the panel issues and renews a Let's Encrypt certificate. Redirects, the web directory (/ for classic WordPress, /web for Bedrock) and the PHP version are set per site.
Create a MySQL or MariaDB database and a database user for each client site from the panel, so one compromised plugin cannot read another client's tables with the same credentials.
Growth includes 10 team members and Business is unlimited. Every deploy, server change and member action is written to the team activity log, which is what a client asks for after an incident.
Paste a DigitalOcean or Hetzner token and the server is created for you, or run the install command on a server you already have at AWS, Vultr or Linode.
Pick the WordPress project type, set the domain and the web directory, create the database, and connect the repository and branch.
Add the two lines that link uploads and wp-config.php into the release, plus composer install if you manage plugins with Composer or Bedrock.
Push to the production branch. The release builds in its own folder, the symlink moves, PHP-FPM reloads and the log shows the commit that went live.
Prices from each vendor's own pricing page, read in October 2026, in USD. The honest headline: for one or two WordPress sites, SpinupWP and Laravel Forge are far cheaper than DeployManage, and WP Engine GitPush is the simplest if you already host there. DeployManage is for agencies running many client sites on their own servers that want atomic releases on every site, seats and an activity log on one flat plan.
swipe to see all columns →
| What you are comparing | DeployManage | SpinupWP | Laravel Forge | WP Engine GitPush |
|---|---|---|---|---|
| How you pay | Starter $59, Growth $129, Business $299 a month, servers billed by your cloud | Essentials $12 or Advanced $19 a month for one server, extra servers on a sliding scale | Hobby $12, Growth $19, Business $39 a month, servers billed by your cloud | Included with a WP Engine hosting plan |
| Where WordPress runs | Your servers at DigitalOcean, Hetzner, AWS, Vultr, Linode or any Ubuntu VPS | Your servers | Your servers | WP Engine infrastructure |
| How a git deploy lands | New release folder and a symlink switch on Growth and Business; in place reset on Starter | git pull into the live site, then your deploy script | Zero downtime releases on new sites, one server per site | Push to git.wpengine.com, tracked files copied to the environment |
| Going back after a bad deploy | Previous five releases kept, redeploy the earlier commit | No rollback documented | Not stated on the pricing page | Push a revert commit or restore a backup |
| Uploads and wp-config.php | Linked from the site folder into each release | Live in the site directory | Configured per site | Excluded from GitPush by WP Engine |
| Deploy on push | Webhook on Growth and Business | Yes | Yes | You run git push yourself |
| Other stacks on the same panel | Laravel, Symfony, Drupal, Craft, Statamic, static sites | WordPress only | PHP, Laravel, WordPress, Statamic, Node.js | WordPress only |
| Best for | Agencies with 10 or more client sites on several servers | A WordPress freelancer or small studio | Developers who mix Laravel and WordPress on a budget | Teams already paying WP Engine |
Custom themes and a curated plugin set live in git per client. Two or three servers the agency owns host every site, each with its own database, and every change goes out as a release folder the agency can step back from.
Plugins are Composer packages from wpackagist, config lives in .env and the document root is web/. The panel shares .env across releases automatically and composer install runs inside the new release before it goes live.
Checkout cannot go down during a theme deploy on a Tuesday afternoon. Atomic releases mean the old build keeps taking orders until the new one has fully built.
The marketing site is WordPress and the product is Laravel. One panel, one bill and one activity log cover both, with Horizon workers for the app and Nginx sites for the blog on the same servers.
Put the code you own in git (your theme, custom plugins, mu-plugins and, if you use Composer, composer.json and composer.lock), leave WordPress uploads and wp-config.php out, and let a deploy tool check each commit out on the server. The tool should build every release in a new directory, link uploads and the config file into it, run composer install, and switch a symlink only when everything has succeeded.
The .gitignore for a classic layout usually excludes wp-content/uploads, wp-config.php, cache folders and any plugin you install from the WordPress dashboard rather than from the repository. Track WordPress core only if you want core updates to go through code review; most agencies either track it or pull it in with Composer, and both work with release folders.
In DeployManage you choose the WordPress project type when you add the site, connect the repository and branch, and the deploy script runs inside the fresh release with DM_SITE_DIR pointing at the site folder. That variable is what you use to reach the shared uploads folder and wp-config.php.
For a classic layout, three lines are enough: create the shared uploads folder once, link it into wp-content, and link wp-config.php from the site folder.
mkdir -p "$DM_SITE_DIR/uploads"
rm -rf wp-content/uploads
ln -s "$DM_SITE_DIR/uploads" wp-content/uploads
ln -sfn "$DM_SITE_DIR/wp-config.php" wp-config.phpFor Roots Bedrock the config is a .env file, which DeployManage already links into every release from the environment you set in the panel, and the uploads folder sits at web/app/uploads. Set the web directory to /web and use:
composer install --no-dev --optimize-autoloader
mkdir -p "$DM_SITE_DIR/uploads"
rm -rf web/app/uploads
ln -s "$DM_SITE_DIR/uploads" web/app/uploadsIf your theme has a build step, add npm ci and npm run build in the theme folder before those lines. Because all of this runs in a release that is not live yet, a failed build costs you nothing but the time it took.
Yes. Turn on quick deploy for the site and add the webhook URL the panel shows you to the repository on GitHub, GitLab or Bitbucket; every push to the production branch then starts a deploy. The deploy log records the commit hash, author and message, so you can tell which push put which code live.
GitHub Actions can do the same with a workflow that runs rsync or an SSH command, and plenty of teams start there. The cost is that the workflow, the SSH keys in repository secrets and the release logic are now yours to maintain in every client repository, and a workflow that rsyncs straight into the document root has the same half deployed window as FTP. A panel keeps that logic in one place for every site.
WP Engine GitPush pushes your tracked files to git.wpengine.com and copies them to the chosen environment; its documentation lists wp-config.php, wp-content/uploads and media and binary files among what GitPush will not deploy, and only removes files you have also removed from the repository. It is a good fit if you already pay WP Engine and do not need your own servers.
SpinupWP runs git push to deploy as a pull into the live site followed by your script. It is inexpensive and WordPress focused, but there is no documented rollback, so a bad deploy is fixed by another commit.
Laravel Forge supports WordPress as well as Laravel, and new sites get zero downtime deployments. Forge's own FAQ says it "only supports deployments with zero downtime on one server", so a site behind a load balancer needs Envoyer at $10 to $50 a month on top.
Twenty small client sites fit on two DigitalOcean 4 GB Droplets at $24 each, so the servers cost $48 a month whichever panel you choose. The panel fee is what changes:
| Setup | Panel | Servers | Monthly total |
|---|---|---|---|
| Laravel Forge Growth | $19 | $48 | $67 |
| SpinupWP Essentials, 2 servers | $20 | $48 | $68 |
| DeployManage Starter, in place deploys | $59 | $48 | $107 |
| DeployManage Growth, atomic releases and deploy on push | $129 | $48 | $177 |
On price alone Forge and SpinupWP win, and if your sites change once a month that may settle it. Growth earns its extra $110 when releases happen weekly across many clients: every site deploys as a release folder with five builds kept, ten people share the account with their own logins, and the activity log shows who deployed what. Spread across 20 clients that is $5.50 per site per month, which most agencies already bill several times over as a care plan.
If you run one WordPress site, or a handful that rarely change, you do not need a release based deploy panel; SpinupWP at $12 or Forge Hobby at $12 covers it. If you want no server at all, managed WordPress hosting is the simpler purchase. And if you never put WordPress code in git, start with our WordPress VPS control panel page, which covers running client sites on your own servers without a git workflow.
Ready to stop managing servers by hand? DeployManage provisions, deploys and monitors your fleet from one dashboard.
Get startedKeep your theme, custom plugins and composer files in a repository, leave uploads and wp-config.php out, and use a deploy tool that checks each commit out into a new folder on the server, links the shared uploads folder and config into it, and switches a symlink when the build passes. That avoids the half updated window you get with FTP or git pull.
Yes. Connect the GitHub repository and branch to the site in DeployManage, turn on quick deploy and add the webhook URL to the repository. Every push to that branch starts a deploy, and the log shows the commit that went live. GitLab and Bitbucket work the same way.
Your own theme, custom plugins and mu-plugins should be in git. wp-content/uploads should not, because media changes on the live site every day and belongs in a shared folder linked into each release. Third party plugins can be tracked or installed with Composer; pick one method and stick to it per site.
No. It holds database credentials and salts that differ per environment. Keep it in the site folder on the server and link it into each release from the deploy script, or use Bedrock, where configuration comes from a .env file that DeployManage shares between releases automatically.
Yes. WP Engine GitPush lets you push to git.wpengine.com over SSH and deploys tracked files to the environment. Its documentation lists wp-config.php, the uploads folder and media and binary files as excluded. It only works for sites hosted on WP Engine.
On Growth and Business, DeployManage keeps the last five releases on the server. To go back you deploy the previous commit, which builds in a fresh folder and swaps the symlink. Database changes made by a plugin update are not reversed by a code rollback, so take a database backup before major plugin upgrades.
Yes. Set the web directory to /web, run composer install --no-dev in the deploy script and link web/app/uploads to the shared uploads folder. The .env file you set in the panel is linked into every release automatically.
Connect a cloud account, launch a server and push your first WordPress release with shared uploads and wp-config kept safe. Every account starts with a one-time demo, no card required.