DeployManage, server management for any cloud

Craft CMS Deployment and Craft CMS Hosting With Zero Downtime Releases on Your Own Servers

Connect your cloud account, launch a PHP 8.2 to 8.4 server with Nginx, MySQL, Redis and Supervisor, and push every Craft site from git as an atomic release. Editor uploads, the .env file and storage live outside the release, and craft up applies project config before the new code goes live.

One-time demo, no credit card required.

Craft CMS, Craft Cloud, Laravel Forge and DigitalOcean figures read from their own pricing pages and docs in October 2026.

Servers 5 online
New server
Servers
Sites
Deployments
Databases
Mailboxes
Recipes
Activity
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%
Deploy to web-01.prod Live
  • Pull main from GitHub
  • Build and migrate
  • Switch release, zero downtime
Finished in 11.3 s
The short answer

Craft CMS deployment on your own server means three things done in the right order: build the new code in a fresh release directory, link the files that must persist (the .env, storage/, web/cpresources/ and any local asset volume such as web/uploads), then run php craft up to apply project config and migrations before switching the live symlink. Craft's own docs recommend exactly this atomic pattern. DeployManage runs it on every git push on Growth and Business, on servers in your own DigitalOcean, Hetzner, AWS, Vultr or Linode account, so an agency can host ten Craft sites on two servers for less than one Craft Cloud project costs.

Diagram of a git push building a new Craft CMS release while uploads, storage and the env file stay in shared folders outside the release

Where Craft deploys usually go wrong

A Craft site changes from two directions. Developers push templates, plugins and project config YAML through git, and editors upload images and files in the Control Panel straight onto the server. A deploy that copies a fresh checkout over the site, or rebuilds it from scratch, can quietly delete those uploads or leave the database out of step with the config.

The other classic failure is a production Control Panel that still allows admin changes. Someone adds a field on the live site, the next deploy applies the project config from git, and the field is gone. Craft's documentation says allowAdminChanges should be off everywhere except development, and the deploy process below assumes it is.

What DeployManage does for a Craft CMS site

A PHP server that meets Craft 5 requirements

Pick DigitalOcean, Hetzner, AWS, Vultr, Linode or your own VPS. DeployManage installs Nginx, PHP-FPM with the extensions Craft 5 lists (BCMath, Intl, GD, Zip and the rest), MySQL 8, MariaDB or PostgreSQL 16, Composer, Redis and Supervisor, and closes every port except 22, 80 and 443.

Uploads and storage that survive every deploy

On zero downtime sites the .env file and storage/ are shared between releases automatically. The deploy script is yours to edit, so linking web/cpresources and a local volume such as web/uploads from the shared directory is two lines.

Atomic releases with craft up before the switch

Each push runs composer install and php craft up --interactive=0 inside a new release directory, then flips the current symlink in one step. If a migration fails, the live site never sees the new code. Available on Growth and Business.

A real queue runner instead of page requests

By default Craft runs queue jobs from visitor page requests. Add php craft queue/listen as a Supervisor daemon, or a one minute cron running queue/run, and image transforms, search indexing and emails run in the background without slowing anyone down.

HTTPS, firewall and cron handled for you

Let's Encrypt certificates are issued and renewed per domain, the firewall is set when the server is built, and scheduled commands such as gc or a nightly backup run from the panel's cron editor.

Seats and an audit log for agencies

Growth includes 10 team members and Business is unlimited. Every deploy, rollback and SSH key change is recorded with the person who made it, across every client server.

How it works

  1. 1
    Connect a cloud account

    Paste an API token from DigitalOcean or Hetzner and DeployManage creates the server for you, or run one install command on an AWS, Vultr, Linode or other VPS. The servers stay in your account and on your provider's invoice.

  2. 2
    Launch a server and add the site

    Choose a region close to the client's visitors, for example a 4 GB droplet in New York, add the domain and create the MySQL database. A Let's Encrypt certificate is issued and renewed for you.

  3. 3
    Connect the repository and paste the .env

    Pick the GitHub, GitLab or Bitbucket repository and branch, paste the production .env once with CRAFT_ENVIRONMENT=production and allowAdminChanges off, and add the shared links for web/cpresources and your asset volume to the deploy script.

  4. 4
    Push to deploy

    On Growth and Business every push becomes an atomic release that installs dependencies and runs craft up before going live. Editors keep working in the Control Panel the whole time.

Craft CMS hosting and deployment options compared

Prices from each vendor's own pricing page, read in October 2026. The honest headline: Laravel Forge is the cheaper panel for Craft on a VPS, and Craft Cloud removes the server entirely and includes the Craft licence. DeployManage is the choice for teams that want the same atomic release on several servers, team seats and an audit log, on one plan.

swipe to see all columns →

What you are comparing DeployManage Laravel Forge Craft Cloud Servd
Monthly price Starter $59, Growth $129, Business $299, servers billed by your cloud Hobby $12, Growth $19, Business $39, servers billed by your cloud Team $120 or Pro $240 per project ($110 or $220 paid yearly) Starter, Enhanced and Pro, each plan covers one Craft install
Craft licence Bought separately: Team $279 or Pro $399, then $99 a year Bought separately Included in the plan Bought separately
Sites covered 10 per server on Starter, 50 on Growth, unlimited on Business Unlimited sites One project, 2 environments on Team and 3 on Pro One Craft install per plan
Zero downtime deploys Yes on Growth and Business, with shared folders you control Yes on new sites, one server per site Built in, images rebuilt on each deploy Atomic code deployments
Same release to several servers Yes on Growth and Business Needs Envoyer at $10 to $50 more Platform scales it Load balanced redundancy
SSH and root access Yes, your server Yes, your server No, serverless with an ephemeral filesystem No server access
Where it runs Your DigitalOcean, Hetzner, AWS, Vultr, Linode or own VPS Laravel VPS or your cloud account Oregon, Quebec, Frankfurt or Sydney US, EU, UK and CA regions

Who it's for

An agency hosting client Craft sites

Eight or fifteen marketing sites, each with its own Craft Team or Pro licence, spread over two or three servers. Clients upload images every day and developers push template changes every week, and neither should be able to break the other.

Moving off a host that rebuilds from scratch

Teams leaving shared hosting, FTP uploads or a git pull deploy that has already overwritten an uploads folder once. Atomic releases plus shared folders end that class of incident.

A busy Craft Commerce store

A store that cannot go down during a deploy and needs queue jobs for order emails and stock updates to run reliably. A Supervisor queue runner and craft up before the symlink switch keep checkout working through every release.

Craft next to a Laravel app

Craft for the marketing site and a Laravel app for the product, on the same server or the same fleet. One panel, one deploy process and one set of SSH keys for both.

How do you deploy Craft CMS to production?

Deploy Craft CMS by building each release in its own directory, linking the files that must persist, running php craft up and then switching a symlink. Craft's deployment guide describes this atomic pattern and lists what must survive a deploy: the .env file, storage (including storage/backups), uploaded assets such as web/uploads, and the project config in config/project, which lives in git.

On a DeployManage zero downtime site the order is fixed. The panel clones the commit into releases/<timestamp>, links the shared .env and storage/, then runs your deploy script. Front end assets are usually built in CI or committed, so a typical script looks like this:

mkdir -p "$DM_SITE_DIR/shared/cpresources" "$DM_SITE_DIR/shared/uploads"
ln -sfn "$DM_SITE_DIR/shared/cpresources" web/cpresources
ln -sfn "$DM_SITE_DIR/shared/uploads" web/uploads
composer install --no-dev --no-interaction --optimize-autoloader
php craft up --interactive=0
php craft clear-caches/data

Only when every line succeeds does the current symlink move to the new release. Craft takes a database backup before it applies pending migrations, so a failed migration leaves both the old code and a fresh backup in place. The last five releases stay on disk for a rollback.

Which Craft folders must be shared between releases?

Share the .env file, storage/, web/cpresources/ and every local asset volume. storage/ holds runtime files, logs, backups and rebrand images. web/cpresources/ holds the compiled Control Panel resources Craft publishes on first request, and sharing it avoids a burst of slow Control Panel loads after each deploy. Local volumes such as web/uploads hold everything editors upload.

Do not share config/project. Project config is meant to come from git, and craft up applies it to the database on each deploy. If a client asks to add fields on the live site, the answer is a staging environment, not allowAdminChanges in production.

If your assets already live on S3, DigitalOcean Spaces or another remote volume, there is no uploads folder to share, which also makes it possible to run one Craft site on two servers behind a load balancer.

Running the Craft queue on your own server

Craft's default queue runner piggybacks on page requests: at the end of a request it injects a small script that starts a background process. That works on a quiet site and is unreliable on a busy one, because jobs wait for visitors and compete with them for PHP workers.

On your own server you have two better options. Set runQueueAutomatically to false and add php craft queue/listen --verbose as a Supervisor daemon in the panel, remembering that a daemon keeps the old code in memory and needs a restart after a release, which Craft's own docs point out. Or add a one minute cron that runs php craft queue/run from the current directory, which exits when the queue is empty and always starts on the newest release. For most marketing sites the cron is simpler; Commerce stores with heavy email or stock jobs are better on the daemon.

Craft CMS hosting requirements for a VPS

Craft 5 needs PHP 8.2 or later, MySQL 8.0.17 or later with InnoDB, MariaDB 10.4.6 or later, or PostgreSQL 13 or later, at least 256 MB of PHP memory (512 MB recommended) and 200 MB of free disk. It also needs sixteen PHP extensions, including BCMath, Intl, GD, Zip and DOM, and Craft recommends ImageMagick for better image transforms.

Every server DeployManage builds meets those requirements out of the box. In practice a single 2 GB server handles two or three small Craft sites with MySQL on the same box, and a 4 GB server handles five or six. Image transforms are the usual memory spike, so give a site with large photo libraries more headroom or move transforms to a remote volume.

Craft CMS hosting cost on your own servers

The Craft licence is the same wherever you host, except on Craft Cloud, which includes it. Craft Solo is free with one account; Team is $279 per project and Pro is $399 per project, each with a year of updates and $99 a year after that. Budget that line separately for every client site.

Hosting and panel cost, per month, with DigitalOcean Basic Droplets in a US region ($12 for 2 GB, $24 for 4 GB, $48 for 8 GB):

SetupCraft CloudForge on DigitalOceanDeployManage on DigitalOcean
One Craft Team site, 2 GB server$120$24 (Hobby $12 + $12)$71 on Starter (no atomic releases), $141 on Growth
Ten client sites, two 4 GB servers$1,200 (ten projects)$67 (Growth $19 + $48)$177 (Growth $129 + $48)
One busy site released to two 4 GB servers$240 on Pro$77 (Growth $19 + Envoyer $10 + $48)$177 (Growth $129 + $48)

Forge is cheaper than DeployManage in every row, and the table says so on purpose. The reason teams pick DeployManage anyway is the combination in one plan: atomic releases across several servers without a second subscription, 10 seats on Growth, and an audit log of every deploy across every client server. If you are one developer with one Craft site, Forge Hobby on a $12 server is the better buy. For a full breakdown of Craft Cloud's plans see Craft Cloud pricing.

Moving a Craft site from another host

Launch the new server, add the site and connect the repository, then copy the uploads folder into the shared directory with rsync and import a database backup with php craft db/restore. Run a first deploy on a temporary hostname and check the Control Panel, an image transform and a form submission. Lower the DNS TTL a day ahead and switch DNS last. If the old host was Craft Cloud or Servd, move assets off their asset platform first, because the paths change with the volume.

Ready to stop managing servers by hand? DeployManage provisions, deploys and monitors your fleet from one dashboard.

Get started

Frequently asked questions

What is the best way to deploy Craft CMS?

Use atomic deployments: build each release in a new directory, link the .env, storage, web/cpresources and local uploads from a shared folder, run php craft up, then switch a symlink. Craft's own deployment guide recommends this pattern because it keeps the live site untouched until the new release is ready.

Can Craft CMS run on a VPS?

Yes. Craft is a self hosted PHP application that runs on any server with PHP 8.2 or later, MySQL 8.0.17 or later or PostgreSQL 13 or later, and the standard extensions. A 2 GB VPS runs two or three small Craft sites comfortably, and a panel handles Nginx, SSL, the queue runner and deploys.

What does php craft up do?

php craft up applies pending project config changes from config/project and runs any pending database migrations for Craft and its plugins. Run it with --interactive=0 in a deploy script, after composer install and before the release goes live. Craft takes a database backup before it applies migrations.

Should allowAdminChanges be enabled in production?

No. Craft's documentation says allowAdminChanges should be disabled in all but development environments. If admins change fields or sections on the live site, the next deploy applies the project config from git and overwrites those changes. Make schema changes locally or on staging and deploy them through git.

How much does Craft CMS hosting cost?

On your own server, a Craft site costs the server (about $12 to $24 a month on DigitalOcean) plus a panel fee, plus the Craft licence: Team $279 or Pro $399 per project, then $99 a year. Craft Cloud costs $120 or $240 per project per month with the licence included.

Can you use Laravel Forge with Craft CMS?

Yes. Forge deploys any PHP app from git, and its zero downtime deployments support shared paths, so you can share storage, web/cpresources and uploads. Forge's native zero downtime deploys cover one server per site, so a Craft site on several servers needs Envoyer or another panel.

How do I run the Craft queue without page requests?

Set runQueueAutomatically to false, then either run php craft queue/listen as a Supervisor daemon and restart it after each release, or add a one minute cron that runs php craft queue/run. The cron always starts on the newest code, while the daemon picks up jobs instantly.

Related

fortrabbit alternative Deploy Symfony Drupal deployment Statamic hosting Laravel Forge alternative Laravel Envoyer alternative DeployHQ alternative Laravel DigitalOcean hosting Hetzner control panel Craft Cloud pricing Deploy from git Platform.sh alternative

Deploy your Craft sites to servers you own.

Connect a cloud account, launch a server and push your first Craft release with shared uploads and craft up. Every account starts with a one-time demo, no card required.

Get started Pricing

One-time demo, no credit card required.