[{"data":1,"prerenderedAt":206},["ShallowReactive",2],{"seo-verification":3,"blog-migrate-ghost-pro-to-self-hosted-ghost-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrate-ghost-pro-to-self-hosted-ghost-vps-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":144,"ctaBody":145,"ctaButton":146,"ctaUrl":147,"relatedPosts":148},496,"migrate-ghost-pro-to-self-hosted-ghost-vps",{"fr":12,"en":10,"ar":13,"es":14},"migrer-ghost-pro-vers-self-hosted-vps","نقل-مدونة-ghost-من-ghost-pro-إلى-خادم-vps-خاص","migrar-ghost-pro-a-ghost-autoalojado-en-vps","Migrate from Ghost(Pro) to self-hosted Ghost on a VPS","Leave Ghost(Pro) without losing a reader or a Stripe subscriber: export, images, theme, paid members, Mailgun newsletters and a reversible DNS cutover.",11,0,false,"2026-10-22T00:00:00+00:00","2026-10-23T13:27:02+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-ghost-pro-vers-self-hosted-vps-poster.svg",{"categorySlug":34,"appSlug":35},"cms-websites","ghost","Ghost(Pro) bills by member count: every tier you cross raises the subscription, and an agency running several publications pays one subscription per site. Because Ghost is open source, the same publication can run on your own server, with the same export format. The risk is not importing the content but everything around it: images, Stripe subscriptions, newsletter delivery and the domain cutover. This guide covers those four points step by step, with a rollback path for as long as Ghost(Pro) stays active.",[38,42,52,88,91,125,128,131,134,138,141],{"type":39,"title":40,"body":41},"h2","Why leave Ghost(Pro), and what you leave behind","Ghost(Pro) pricing is indexed on audience: each plan caps the number of members, and Ghost asks you to upgrade as the publication grows. For a solo publisher that is a readable cost. For an agency running the newsletter or media site of five clients, it is five subscriptions, each following its own curve. The entry plan also excludes custom themes and custom integrations.\n\nSelf-hosting solves both: one server carries several publications, and you install whatever theme and integrations you need.\n\nBe honest about the other column. Ghost(Pro) includes newsletter delivery with deliverability already configured, updates, backups and vendor support. When you leave, each of those tasks becomes yours. It is not an insurmountable project, but it is a real cost, to be priced before the decision rather than discovered afterwards.",{"type":43,"title":44,"items":45},"ul","What you gain by leaving Ghost(Pro)",[46,47,48,49,50,51],"**A cost that no longer tracks audience** — the server is sized on traffic and image volume, not on the number of signed-up members.","**Several publications on one machine** — an agency groups its Ghost instances on one or two VPS instead of stacking subscriptions.","**Themes and integrations with no plan restriction** — custom theme, webhooks, analytics or search tools wired straight into the server.","**Control over the data** — the MySQL database, the `content` folder and the backups are yours; you choose where they live and how long they are kept.","**The same format end to end** — from Ghost to Ghost the import is native: no converter, no rewriting of posts.","**An update schedule you choose** — you test a new release on a copy before applying it to the live publication.",{"type":53,"title":54,"headers":55,"rows":59},"comparison","What changes, item by item",[56,57,58],"Item","Ghost(Pro)","Self-hosted Ghost",[60,64,68,72,76,80,84],[61,62,63],"Pricing","Per plan, capped by member count","Server price, whatever the member count",[65,66,67],"Newsletter delivery","Included, no setup","Mailgun account required, billed separately",[69,70,71],"Member sign-in emails","Included","SMTP server to configure",[73,74,75],"Ghost updates","Applied by the vendor","Your responsibility",[77,78,79],"Backups","Handled by the vendor","MySQL database and `content` folder to back up yourself",[81,82,83],"Custom theme","Depends on the plan","Always possible",[85,86,87],"Commission on subscriptions","None from Ghost on paid plans","None; only Stripe fees apply",{"type":39,"title":89,"body":90},"Sized prerequisites before touching Ghost(Pro)","**Server**: plan 2 vCPU and 2 GB of RAM for one publication, 4 GB if you group two or three instances or if the list exceeds a few tens of thousands of members. Size the disk on your media: measure the image folder, double it for local backups, and add 10 GB for the system.\n\n**Database**: MySQL 8, not MariaDB. Ghost's official documentation is unambiguous: MySQL 8 is the only supported database in production, and Ghost recommends moving off MariaDB. The engine does not affect the JSON export, but the target instance must run on MySQL 8.\n\n**Version**: the target instance must be the same version as Ghost(Pro) or newer. Note the version shown in Ghost Admin before installing anything.\n\n**Accounts and access**: owner access to the Stripe account connected to the publication, a Mailgun account for newsletters, an SMTP relay for sign-in emails, and access to the domain's DNS zone.\n\n**The installation itself** is not repeated here: follow \u003Ca href=\"\u002Fen\u002Fblog\u002Fhosting-ghost-on-your-own-vps\">our guide to installing Ghost on a VPS\u003C\u002Fa>, then come back to step 5.",{"type":92,"title":93,"steps":94},"steps","The migration in ten steps, from inventory to cutover",[95,98,101,104,107,110,113,116,119,122],{"title":96,"body":97},"Record the baseline","Before any export, write down what the migration must find again: number of published posts, pages, free, paid and complimentary members (filters in the Ghost Admin Members view), Ghost version and the list of sitemap URLs. Keep that list in a file:\n\n```bash\ncurl -s https:\u002F\u002Fyour-domain.com\u002Fsitemap-posts.xml | grep -o '\u003Cloc>[^\u003C]*' | sed 's\u002F\u003Cloc>\u002F\u002F' > urls-before.txt\nwc -l urls-before.txt\n```",{"title":99,"body":100},"Lower the domain TTL","In the DNS zone, bring the TTL of the publication's records down to 300 seconds, at least 24 hours before the cutover. That is what lets you switch IP address in minutes on the day, and switch back just as fast.",{"title":102,"body":103},"Export all content","In Ghost Admin, open **Settings → Advanced → Import\u002FExport**, Export tab, and choose **All data**. The archive contains `export.json` (content and settings), `members.csv`, the installed themes as `.zip`, `routes.yaml` and `redirects.yaml`. Check that each file is there before moving on.",{"title":105,"body":106},"Recover images and media","Ghost's documentation is clear: images are not in the export. On Ghost(Pro) you have no server access, so there are two routes. Ask Ghost(Pro) support for an archive of the `content\u002Fimages` folder, or rebuild it from the public URLs found in the export:\n\n```bash\ngrep -o '\u002Fcontent\u002Fimages\u002F[^\"\\\\]*' export.json | sort -u > images.txt\nwc -l images.txt\n```\n\nThen download each file while keeping the `content\u002Fimages\u002F…` tree: Ghost's importer expects that path.",{"title":108,"body":109},"Install the target instance on a test subdomain","Install Ghost on the VPS with a temporary URL, for example `https:\u002F\u002Fnew.your-domain.com`, with MySQL 8 and a version at least equal to the source. The production publication stays on Ghost(Pro) the whole time: your readers see nothing.",{"title":111,"body":112},"Import content, theme and redirects","In **Settings → Advanced → Import\u002FExport**, import a `.zip` containing `export.json` and the `content\u002Fimages` folder: the importer accepts JSON and zip, and a large image archive can be split into several zips. Then check the theme before uploading it:\n\n```bash\nnpx gscan -z my-theme.zip\n```\n\nActivate it, and upload `redirects.yaml` and `routes.yaml` in **Settings → Labs**.",{"title":114,"body":115},"Connect the same Stripe account, then import members","Ghost asks you to connect the **same Stripe account** as the original publication **before** importing paid members. Import a sample of five to ten paid members first, check their tier and subscription on the member record, then import the rest of `members.csv`.",{"title":117,"body":118},"Wire up email: SMTP and Mailgun","Configure the `mail` block of `config.production.json` (or the equivalent environment variables under Docker) with your SMTP relay, for sign-in emails. Then enter the Mailgun API keys in the **Email newsletter** settings of Ghost Admin. Test both: a sign-in link received on an internal address, then a test newsletter sent to an internal label.",{"title":120,"body":121},"Compare before and after","Count posts and members on the new instance:\n\n```bash\nmysql -u ghost -p ghost_prod -e \"SELECT status, COUNT(*) FROM posts GROUP BY status; SELECT status, COUNT(*) FROM members GROUP BY status;\"\n```\n\nThe figures must match step 1. Open ten random posts, images included, and look for any trace of the old host in the page source.",{"title":123,"body":124},"Switch the domain and keep Ghost(Pro) as an overlap","Replace the temporary URL with the final domain in the configuration, restart Ghost, then change the DNS record. Replay the sitemap and check that every old URL answers 200:\n\n```bash\nwhile read u; do echo \"$(curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' \"$u\") $u\"; done \u003C urls-before.txt | grep -v '^200'\n```\n\nKeep the Ghost(Pro) subscription active for one to two weeks. For transactional email across several publications, see \u003Ca href=\"\u002Fen\u002Fblog\u002Fpostfix-smtp-relay-on-vps-client-transactional-emails\">our SMTP relay on a VPS guide\u003C\u002Fa>.",{"type":39,"title":126,"body":127},"Stripe subscriptions: what transfers, and what to test","The members export carries, for each paid member, their Stripe customer ID (`stripe_customer_id`). The importer can also find it on its own: with the value `auto`, Ghost searches the connected Stripe account for a customer with the same email address. Hence the condition set by the documentation: the new instance must be connected to the **same Stripe account** before the import. Another account does not hold those customers, and your paying subscribers would arrive as free members.\n\nThe subscriptions themselves stay at Stripe: the migration does not cancel them and asks no one to subscribe again. The documentation does not, however, detail how each subscription finds its tier on the new instance. That is the reason for the sample in step 7: check on a few records that the tier, the renewal date and the paid status are right before importing the whole list.\n\nAfter the cutover, open the webhook endpoints in the Stripe dashboard. The new instance's endpoint must receive events; the Ghost(Pro) one is removed only when the old subscription is closed.",{"type":39,"title":129,"body":130},"Newsletters: the email gap to fill","This is the point most migrations discover too late. On Ghost(Pro), newsletter delivery is included. Self-hosted, Ghost's documentation is explicit: Mailgun is the only supported bulk email provider, and a plain SMTP server cannot send newsletters. SMTP only handles sign-in emails and invitations.\n\nSo you need two channels: an SMTP relay for transactional mail, and a Mailgun account for distribution. On cost, Mailgun has withdrawn its Flex plan for new accounts or made it hard to reach: check the current pricing on Mailgun's site before budgeting, based on your monthly send volume (subscribed members multiplied by publishing frequency).\n\nFinally, prepare authentication of the sending domain: the SPF and DKIM records provided by Mailgun go into the DNS zone before the first real send. A newsletter sent from an unauthenticated domain lands in spam, and the reputation of the whole domain suffers.",{"type":39,"title":132,"body":133},"The DNS cutover, with downtime kept to a minimum","Downtime comes down to two things: DNS propagation and the TLS certificate. The TTL lowered in step 2 handles the first. For the second, there are two options. If your server gets its certificate through an HTTP challenge (Caddy in Ghost's official Docker install, certbot with nginx), it can only do so once DNS has switched: expect a few seconds to a few minutes of TLS errors. If your DNS allows it, a DNS-01 challenge issues the certificate before the cutover and removes that window.\n\nPick a low-traffic slot, and send no newsletter that day. A post scheduled on Ghost(Pro) would still go out from the old instance: suspend scheduled sends before the export.\n\nAs long as Ghost(Pro) stays active, rolling back means restoring the old DNS record. That is your safety net. Only close the subscription after a week with no gap in the counts, the Stripe webhooks and deliverability.",{"type":135,"title":136,"body":137},"tip","Back up from day one","Ghost(Pro) backed up for you; now it is your job. Schedule at least a daily database dump and a copy of the `content` folder, to storage outside the VPS:\n\n```bash\nmysqldump --single-transaction -u ghost -p ghost_prod | gzip > \u002Fbackup\u002Fghost-$(date +%F).sql.gz\ntar czf \u002Fbackup\u002Fcontent-$(date +%F).tar.gz \u002Fvar\u002Fwww\u002Fghost\u002Fcontent\n```\n\nClose every port other than 22, 80 and 443 at the firewall, and test a full restore on a blank machine at least once a quarter.",{"type":39,"title":139,"body":140},"Troubleshooting: the most frequent errors","**`413 Request Entity Too Large` on import**: nginx rejects the archive. Raise `client_max_body_size` in the `server` block (for example `200m`), reload nginx, or split the images into several zips.\n\n**Broken images after import**: the archive did not follow the `content\u002Fimages\u002F…` path, or some files are missing. Compare `images.txt` with the folder contents on the server and reimport the missing ones.\n\n**Paid members imported as free**: Stripe was not connected at import time, or it was a different account. Connect the right account and reimport the affected members.\n\n**Sign-in link never received**: the `mail` block is missing or wrong. Check Ghost's logs (`ghost log`, or `docker compose logs ghost`) at the moment of the sign-in request.\n\n**No email option when publishing**: Mailgun is not configured. SMTP is not enough for newsletters; enter the Mailgun API keys in **Email newsletter**.",{"type":39,"title":142,"body":143},"For an agency: grouping your clients' publications","Migrating one publication takes half a day of preparation and an hour of cutover. The second goes faster, because the server, the SMTP relay and the method already exist. That is where self-hosting pays off for an agency: several Ghost instances on one VPS, each with its own database and domain, and a single infrastructure bill.\n\nOn ServOrbit, VPS plans start at 99 DH\u002Fmonth tax exclusive (VAT excluded), with root access and a dedicated IPv4, and your domains, servers and renewals are tracked in one place. If the question remains “who runs the server?”, the VPS administration option answers it: you manage the editorial relationship with your clients, we run the infrastructure.\n\nThis guide is provided as is: ServOrbit does not carry out the migration of your Ghost(Pro) publication; VPS administration covers the server, not this switchover.","Your Ghost publications, grouped on your own servers","One space for the domains, VPS and renewal deadlines of your whole portfolio of publications. The VPS administration option covers running the server, not the migration itself: you manage the client relationship, we run the infrastructure.","Discover the agency offer","\u002Fsolutions\u002Fagences",[149,166,186],{"id":150,"slug":151,"slugs":152,"title":156,"excerpt":157,"readTime":158,"views":18,"isPinned":19,"publishedAt":159,"updatedAt":160,"category":161,"categories":162,"featuredImage":30,"bgImage":31,"posterImage":164,"relatedSolution":165},72,"hosting-ghost-on-your-own-vps",{"fr":153,"en":151,"ar":154,"es":155},"heberger-ghost","استضافة-ghost-على-خادمك-الـvps-الخاص","alojar-ghost-en-un-vps","Hosting Ghost on your own VPS: complete 2026 guide","Deploy Ghost v6 on your VPS with Caddy, MySQL, Ghost CLI and Stripe Tax: installation, TLS reverse proxy, updates and troubleshooting common startup errors.",10,"2026-04-09T00:00:00+00:00","2026-10-09T22:36:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[163],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":25,"appSlug":35},{"id":167,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":158,"views":18,"isPinned":19,"publishedAt":175,"updatedAt":176,"category":177,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},389,"migrating-squarespace-ghost-vps",{"fr":170,"en":168,"ar":171,"es":172},"migrer-squarespace-ghost-vps","الانتقال-من-squarespace-إلى-ghost-على-vps","migrar-squarespace-ghost-vps","Migrating from Squarespace to Ghost on a VPS","Squarespace raised prices 26% in July 2026. Migrate to self-hosted Ghost on a VPS: 3-year cost comparison, step-by-step export and import, 301 redirects.","2026-09-29T00:00:00+00:00","2026-10-22T01:57:45+00:00",{"id":178,"name":179,"slug":180,"color":181,"icon":180},5,"Comparison","comparatif","bg-info\u002F10 text-info",[183],{"id":178,"name":179,"slug":180,"color":181,"icon":180},"\u002Fblog\u002Fcovers\u002Fmigrer-squarespace-ghost-vps-poster.svg",{"categorySlug":34,"appSlug":35},{"id":187,"slug":188,"slugs":189,"title":193,"excerpt":194,"readTime":195,"views":196,"isPinned":19,"publishedAt":197,"updatedAt":198,"category":199,"categories":203,"featuredImage":30,"bgImage":31,"posterImage":205,"relatedSolution":30},280,"postfix-smtp-relay-on-vps-client-transactional-emails",{"fr":190,"en":188,"ar":191,"es":192},"smtp-relay-vps-emails-transactionnels-clients","إعداد-postfix-smtp-relay-على-vps-لبريد-المواقع","relay-smtp-postfix-en-vps-emails-transaccionales","Postfix SMTP Relay on VPS: Client Transactional Emails","Set up Postfix as an SMTP relay on a ServOrbit VPS: dedicated IPv4, SPF, DKIM and DMARC aligned for your entire cPanel client portfolio in under an hour.",8,1,"2026-08-18T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":17,"name":200,"slug":201,"color":202,"icon":201},"Business Email","emails","bg-cyan-500\u002F10 text-cyan-400",[204],{"id":17,"name":200,"slug":201,"color":202,"icon":201},"\u002Fblog\u002Fcovers\u002Fsmtp-relay-vps-emails-transactionnels-clients-poster.svg",1792763208962]