[{"data":1,"prerenderedAt":158},["ShallowReactive",2],{"seo-verification":3,"blog-deployer-payload-cms-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"title":9,"excerpt":10,"readTime":11,"views":12,"isPinned":13,"publishedAt":14,"category":15,"categories":21,"featuredImage":23,"bgImage":24,"posterImage":25,"relatedSolution":26,"intro":28,"sections":29,"ctaTitle":112,"ctaBody":113,"ctaButton":114,"ctaUrl":115,"relatedPosts":116},55,"deployer-payload-cms-vps","Deploying a Payload CMS application on a VPS","Deploy Payload CMS on a Cloud VPS: Next.js app, MongoDB or PostgreSQL, Docker, reverse proxy and SSL. Payload vs Strapi comparison included.",9,435,false,"2026-04-26T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},4,"Development","developpement","bg-warning\u002F10 text-warning","dev",[22],{"id":16,"name":17,"slug":18,"color":19,"icon":20},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-payload-cms-vps-poster.svg",{"categorySlug":18,"appSlug":27},"payload-cms","Payload CMS is a TypeScript-first headless CMS that integrates natively into Next.js. Self-hosting it on a VPS gives you a unified code-first stack, where the CMS and the front end share the same runtime. Here is how to deploy it in production, with its database and a comparison against Strapi.",[30,34,44,47,69,109],{"type":31,"title":32,"body":33},"h2","Why self-host Payload CMS on a VPS","Payload CMS takes a radically code-first approach: your content schema is defined in TypeScript in configuration files, versioned with Git, and since its version 3 Payload installs directly into a Next.js application via the App Router. This means a VPS lets you host the CMS and the front-end site in a single Node process, sharing the build and the runtime. You get end-to-end typing, schema migrations managed in code, and no dependency on a graphical interface to model your content. Self-hosting is the natural option here: Payload is designed to be deployed like any Next.js app, and a VPS gives you control of the database (MongoDB or PostgreSQL), the uploads and the environment variables, without an intermediary platform.",{"type":35,"title":36,"items":37},"ul","Concrete benefits",[38,39,40,41,42,43],"Content schema defined in TypeScript and versioned with Git: full code review and history","CMS and Next.js front end in a single runtime: one build, one process to deploy","End-to-end typing between the Payload config, the API and the front end, without manual generation","Choice of database: MongoDB or PostgreSQL via the official adapters","Schema migrations driven by code (`payload migrate`), reproducible across environments","Local API: direct data access without an HTTP call from Next.js server code",{"type":31,"title":45,"body":46},"Hardware and software prerequisites","Since Payload relies on Next.js, the build is demanding: plan for a VPS with 2 vCPU and 4 GB of RAM to build and run the application comfortably, especially if the Next.js front end is substantial. Install Node.js 20 LTS, Docker and Docker Compose. On the database side, provision MongoDB 7 or PostgreSQL 16 depending on the chosen adapter (`@payloadcms\u002Fdb-mongodb` or `@payloadcms\u002Fdb-postgres`). Point your domain at the VPS IP. Count 15 GB of disk for the `node_modules`, the `.next` build, the uploads and the database backups.",{"type":48,"title":49,"steps":50},"steps","Step-by-step deployment",[51,54,57,60,63,66],{"title":52,"body":53},"Choose and configure the database adapter","In `payload.config.ts`, declare the adapter: `mongooseAdapter` for MongoDB or `postgresAdapter` for PostgreSQL, reading the connection URL from `DATABASE_URI`. This choice is structural: PostgreSQL requires migrations, MongoDB is more flexible on the schema.",{"title":55,"body":56},"Set the secret and build the Next.js app","Set `PAYLOAD_SECRET` (the token encryption key) in the environment. Run `npm run build`: since Payload 3 lives inside Next.js, this command compiles both the Payload admin and your front end. Watch the RAM during the build.",{"title":58,"body":59},"Containerize with Docker Compose","Create a `node:20-alpine` Dockerfile that builds the app and runs `npm start`, then a `docker-compose.yml` linking the `app` service to a `mongo` or `postgres` service. Mount a volume for the uploads and pass `DATABASE_URI` and `PAYLOAD_SECRET` as variables. Run `docker compose up -d`.",{"title":61,"body":62},"Run the migrations (PostgreSQL)","If you use the PostgreSQL adapter, apply the schema with `npm run payload migrate` after the containers start. With MongoDB, the schema is applied automatically, no manual migration is needed.",{"title":64,"body":65},"Configure Nginx as a reverse proxy","Point a vhost to `http:\u002F\u002F127.0.0.1:3000` (Next.js default port). Increase `client_max_body_size` for media uploads and add the `X-Forwarded-Proto` headers so that Payload generates correct HTTPS URLs.",{"title":67,"body":68},"Secure with SSL and set the server URL","Run `certbot --nginx -d mydomain.com`, then set `serverURL: 'https:\u002F\u002Fmydomain.com'` in `payload.config.ts`. This URL conditions the media links, the reset emails and the correct operation of the admin panel behind the proxy.",{"type":70,"title":71,"headers":72,"rows":76},"comparison","Payload CMS vs Strapi: which headless CMS to self-host?",[73,74,75],"Criterion","Payload CMS","Strapi",[77,81,85,89,93,97,101,105],[78,79,80],"Configuration approach","Code-first in TypeScript, versioned with Git","GUI-first via the Content-Type Builder",[82,83,84],"Front-end integration","Native in Next.js (a single runtime)","Decoupled, front end and CMS separate",[86,87,88],"Supported databases","MongoDB and PostgreSQL","PostgreSQL, MySQL, SQLite",[90,91,92],"Typing","Native end-to-end TypeScript","Generated types, looser integration",[94,95,96],"Server data access","Local API without an HTTP call","REST\u002FGraphQL API via HTTP",[98,99,100],"Content modeling","In the code, by developers","In the interface, accessible to non-developers",[102,103,104],"RAM needed for the build","High (Next.js build)","High (React admin build)",[106,107,108],"Ideal for","Dev teams, typed Next.js projects","Mixed teams, visual modeling",{"type":110,"body":111},"tip","Leverage Payload's Local API in your Next.js server components: instead of calling your own API via `fetch`, import `getPayload` and query the database directly (`payload.find({ collection: 'posts' })`). You remove an HTTP round-trip and gain in latency as well as in security. For media, plug in the `@payloadcms\u002Fstorage-s3` plugin to store uploads off the VPS, and automate a daily dump of your database via a cron to guarantee off-server backups.","Deploy Payload CMS on a unified stack","The ServOrbit Cloud VPS offers the power needed for Payload's Next.js build and a Docker environment ready for MongoDB or PostgreSQL, to host your code-first CMS and your front end on the same machine.","Discover the Cloud VPS","\u002Fvps-cloud",[117,131,145],{"id":118,"slug":119,"title":120,"excerpt":121,"readTime":122,"views":123,"isPinned":13,"publishedAt":124,"category":125,"categories":126,"featuredImage":23,"bgImage":24,"posterImage":128,"relatedSolution":129},5,"deployer-laravel-vps","Deploying Laravel on a VPS: a production guide","Take Laravel to production on a VPS: PHP, workers, cache, database, reverse proxy and HTTPS configured cleanly.",7,2840,"2026-02-09T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[127],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fdeployer-laravel-vps-poster.svg",{"categorySlug":20,"appSlug":130},"laravel-stack",{"id":132,"slug":133,"title":134,"excerpt":135,"readTime":136,"views":137,"isPinned":13,"publishedAt":138,"category":139,"categories":140,"featuredImage":23,"bgImage":24,"posterImage":142,"relatedSolution":143},43,"deployer-nodejs-vps","Deploy a Node.js Application on a VPS","Deploy a Node.js application to production on a VPS: PM2, Nginx reverse proxy, Let's Encrypt SSL, and automatic startup at boot.",8,591,"2026-05-08T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[141],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":18,"appSlug":144},"nodejs",{"id":146,"slug":147,"title":148,"excerpt":149,"readTime":136,"views":150,"isPinned":13,"publishedAt":151,"category":152,"categories":153,"featuredImage":23,"bgImage":24,"posterImage":155,"relatedSolution":156},44,"deployer-django-vps","Deploy a Django Application on a VPS","Deploy Django on a VPS: Gunicorn, Nginx, PostgreSQL, Docker, and SSL. A complete guide for Python developers who want to self-host.",628,"2026-05-07T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[154],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":18,"appSlug":157},"django",1785628431252]