[{"data":1,"prerenderedAt":151},["ShallowReactive",2],{"seo-verification":3,"blog-hosting-ghost-on-your-own-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":29,"intro":31,"sections":32,"ctaTitle":97,"ctaBody":98,"ctaButton":99,"ctaUrl":100,"relatedPosts":101},72,"hosting-ghost-on-your-own-vps",{"fr":10,"en":8,"ar":11},"heberger-ghost","استضافة-ghost-على-خادمك-الـ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.",9,0,false,"2026-04-09T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":21,"appSlug":30},"ghost","Ghost is the modern publishing platform designed for creators: a fast blog, built-in newsletters and native paid subscriptions. With Ghost v6 (July 2026), newsletter monetisation has evolved and Stripe configuration has changed. Self-hosted on a VPS, you avoid Ghost(Pro) and Substack commissions and keep full control over your audience. This guide covers the complete installation, TLS reverse proxy with Caddy, updates via Ghost CLI and troubleshooting the most common startup errors.",[33,37,48,51,76,79,82,85,88,91,94],{"type":34,"title":35,"body":36},"h2","Why self-host Ghost on a VPS","Ghost combines what WordPress does laboriously and what Substack charges dearly for: a clean editor, excellent native performance (Node.js), integrated member and paid-subscription management via Stripe, and newsletter sending without a plugin. But Ghost(Pro) bills by audience, and newsletter platforms take a commission on your revenue.\n\nBy hosting it on your VPS, you keep 100% of your paying subscribers (excluding Stripe fees), you customise the theme without restriction, and you control your email list — your most valuable asset. With Ghost v6, creators monetising their newsletters also benefit from automatic VAT collection via Stripe Tax, with no dependency on a third-party service.",{"type":38,"title":39,"items":40},"ul","The benefits of a self-hosted Ghost",[41,42,43,44,45,46,47],"No platform commission on your paid subscriptions (excluding Stripe)","Native performance: loading time is measured from the reader's own connection — it depends on the operator, the time of day and the route taken","Integrated newsletters and members, without a stack of plugins","Full customisation of the Handlebars theme and complete API access","Control of your subscriber list and your data","A fixed VPS cost regardless of the number of readers","Ghost v6: integrated VAT\u002Ftax collection via Stripe Tax for monetised creators",{"type":34,"title":49,"body":50},"Realistic prerequisites","Ghost v6 runs on **Node.js 20 LTS** minimum (Node 22 recommended for performance). Plan for a VPS with at least 1 vCPU and 2 GB of RAM for a blog with comfortable traffic; move up to 4 GB if your audience grows fast or if you send high-volume newsletters. For production use, reserve at least 20 GB of disk for media and the database.\n\nThe recommended production database is **MySQL 8** (SQLite is supported for development only — see the troubleshooting section). You also need a transactional SMTP service (Mailgun, Postmark, Brevo) for reliable delivery of newsletters and member authentication emails, a `blog.yourdomain.com` domain pointed at your VPS IP, and **Caddy** or Nginx for the HTTPS reverse proxy. Caddy is preferred: it provisions and renews Let's Encrypt certificates without extra configuration.",{"type":52,"title":53,"steps":54},"steps","Installation via Ghost CLI (recommended method)",[55,58,61,64,67,70,73],{"title":56,"body":57},"Prepare the server","On Debian\u002FUbuntu, install Node.js 20, MySQL 8, Nginx (required by Ghost CLI for its compatibility check) and Caddy. Create a dedicated user (not root):\n\n```bash\nadduser --disabled-login ghost-user\nsu - ghost-user\n```",{"title":59,"body":60},"Install Ghost CLI","```bash\nnpm install ghost-cli@latest -g\n```\n\nGhost CLI manages installation, database migrations, updates and PM2 process-manager restarts.",{"title":62,"body":63},"Create the directory and run the install","```bash\nmkdir -p \u002Fvar\u002Fwww\u002Fghost\ncd \u002Fvar\u002Fwww\u002Fghost\nghost install\n```\n\nThe wizard asks for your blog URL (e.g. `https:\u002F\u002Fblog.yourdomain.com`), MySQL credentials, SMTP settings and whether to configure Nginx. Answer **no** to the Nginx step if you are using Caddy — you will configure it in the next step.",{"title":65,"body":66},"Configure the TLS reverse proxy with Caddy","Create or edit your `Caddyfile`:\n\n```bash\nblog.yourdomain.com {\n    reverse_proxy localhost:2368\n    encode gzip\n    header \u002Fghost\u002F* Cache-Control \"no-store\"\n    header \u002Fmembers\u002F* Cache-Control \"no-store\"\n}\n```\n\nCaddy obtains and renews the Let's Encrypt certificate automatically. Ghost listens locally on port 2368; only Caddy is exposed on ports 80 and 443.",{"title":68,"body":69},"Secure the first access","Open `\u002Fghost` immediately after installation: Ghost displays its account-creation wizard (name, email, password). Complete it without delay — until the wizard is finished, anyone reaching this URL can become the owner of the blog.",{"title":71,"body":72},"Connect your SMTP service","In **Settings → Email**, verify that your SMTP credentials are correct and send a test email. Newsletter delivery and member login emails go through this configuration — a malformed `MAIL_FROM` (without a verified domain) is one of the most common causes of silent failures at sign-up.",{"title":74,"body":75},"Connect Stripe and activate subscriptions","In **Settings → Members**, connect your Stripe account to enable paid subscriptions. Define your tiers, monthly and annual prices, then publish your first article and send your first newsletter.",{"type":34,"title":77,"body":78},"Starting Caddy and verifying the reverse proxy","Once the `Caddyfile` is written, start or reload Caddy to apply the configuration:\n\n```bash\ncaddy run --config \u002Fetc\u002Fcaddy\u002FCaddyfile\n```\n\nIf Caddy is managed as a systemd service (which is the case after an APT install), prefer the graceful reload command:\n\n```bash\nsystemctl reload caddy\n```\n\nCaddy immediately contacts Let's Encrypt to obtain a TLS certificate for your domain via the HTTP-01 challenge. Within 30 seconds, `https:\u002F\u002Fblog.yourdomain.com` should respond. Verify the certificate state:\n\n```bash\ncurl -sv https:\u002F\u002Fblog.yourdomain.com\u002F 2>&1 | grep -E 'SSL|subject|issuer'\n```\n\nIf the command shows `issuer: O=Let's Encrypt`, the certificate is valid. If you get `connection refused`, check that Ghost is running on port 2368 with `ghost status` from the installation directory. If port 443 is closed in your firewall, open it before starting Caddy: `ufw allow 443`.",{"type":34,"title":80,"body":81},"Ghost v6 and Stripe Tax: the new tax_id_collection field","Ghost v6 introduces support for the `tax_id_collection` field in the Stripe API. This field enables Stripe Tax to automatically collect the buyer's VAT or tax identification number at the point of payment, in line with European and global tax regulations.\n\n**For existing instances migrated to Ghost v6**, this feature is a configuration change on the Stripe side, not in Ghost itself. Two things to verify:\n\n1. In the Stripe Dashboard, enable **Stripe Tax** and configure your tax rules by country.\n2. In **Stripe → Checkout → Settings**, enable tax ID collection if required for your market.\n\nGhost v5 instances upgrading to v6 without adjusting their Stripe settings will continue to work, but the new fiscal compliance features will remain inactive until you configure Stripe Tax on your side.",{"type":34,"title":83,"body":84},"Updating Ghost with Ghost CLI","Ghost CLI simplifies both minor and major updates. From the installation directory:\n\n```bash\ncd \u002Fvar\u002Fwww\u002Fghost\nghost update\n```\n\nTo target a specific version, for example when migrating from v5 to v6:\n\n```bash\nghost update 6.x.x\n```\n\nGhost CLI stops the PM2 process, applies database migrations, updates the files and restarts Ghost. If a migration fails, Ghost CLI performs an automatic rollback and displays the error detail in the terminal.\n\nBefore any major update (v5 → v6), two preventive steps are essential: back up the content directory `\u002Fvar\u002Fwww\u002Fghost\u002Fcontent` (media and custom themes) and export the MySQL database:\n\n```bash\nmysqldump -u ghost -p ghost_db > ghost_backup_$(date +%F).sql\n```\n\nFinally, verify the installed version after the update:\n\n```bash\nghost version\n```\n\nAn incorrect version number after an update usually indicates a permissions issue on the `\u002Fvar\u002Fwww\u002Fghost` directory — check that the dedicated user is the owner of the folder.",{"type":34,"title":86,"body":87},"Troubleshooting: common startup errors","**Ghost starts but returns a blank page or a 500 error**\nCheck the logs with `ghost log`. The most common cause is an incorrect `url` value in `config.production.json` — Ghost generates all its internal links from this value, and an HTTP URL when Caddy is serving over HTTPS causes redirect loops.\n\n**Error \"ER_NOT_SUPPORTED_AUTH_MODE\" at startup**\nGhost v6 requires MySQL 8 with the `mysql_native_password` authentication plugin. If your MySQL defaults to `caching_sha2_password`, modify the user:\n\n```bash\nALTER USER 'ghost'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';\nFLUSH PRIVILEGES;\n```\n\n**SQLite in production: why it is not an option**\nGhost accepts SQLite in development mode, but this engine is not supported in production: it does not handle concurrent access, and high-volume newsletters or traffic spikes cause irreversible database locks. Migrate to MySQL before going live.\n\n**Theme upload fails in production**\nGhost limits theme upload sizes. If an upload fails silently or returns a 413 error, adjust the limit on the Caddy side:\n\n```bash\nblog.yourdomain.com {\n    request_body {\n        max_size 50MB\n    }\n    reverse_proxy localhost:2368\n}\n```\n\n**MAIL_FROM misconfigured: members not receiving emails**\nThe `mail.from` field in `config.production.json` must carry an address whose domain is verified with your SMTP provider (active SPF and DKIM records). An unverified domain results in silent failures at sign-up or SMTP rejections that Ghost rarely surfaces clearly in its logs.",{"type":89,"body":90},"tip","Place Cloudflare in proxy mode in front of Caddy to absorb traffic spikes: almost all of Ghost's public content is static and caches very well. Exclude `\u002Fghost\u002F`, `\u002Fmembers\u002F` and `\u002Fapi\u002F` from the cache via Page Rules or a custom cache rule — these routes must always reach Ghost directly for member authentication and admin to work correctly.",{"type":89,"title":92,"body":93},"Automatic backups","Ghost's dynamic content (media, custom themes) lives in `\u002Fvar\u002Fwww\u002Fghost\u002Fcontent`. Add a cron job that backs up this directory and a daily MySQL export to remote storage. Ghost CLI does not back up automatically.\n\n```bash\n# Daily MySQL export — add to crontab\n0 2 * * * mysqldump -u ghost -p ghost_db | gzip > \u002Fbackups\u002Fghost-$(date +%F).sql.gz\n```",{"type":89,"title":95,"body":96},"Official documentation","For advanced configuration and options specific to the tool, refer to the \u003Ca href=\"https:\u002F\u002Fghost.org\u002Fdocs\" target=\"_blank\" rel=\"noopener noreferrer\">official Ghost documentation\u003C\u002Fa>. This guide covers going live on a VPS; the vendor's docs remain the reference for fine-tuning, major updates and specific use cases.","Your independent media outlet, on your VPS","The ServOrbit Cloud VPS offers the Node.js stack and the MySQL database ideal for running Ghost and collecting subscriptions with no platform commission. Template ready to deploy.","Launch my Ghost blog","\u002Fmarketplace\u002Fcms-websites\u002Fghost",[102,118,134],{"id":103,"slug":104,"slugs":105,"title":108,"excerpt":109,"readTime":110,"views":15,"isPinned":16,"publishedAt":111,"category":112,"categories":113,"featuredImage":26,"bgImage":27,"posterImage":115,"relatedSolution":116},71,"hosting-nextcloud-on-your-own-vps",{"fr":106,"en":104,"ar":107},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","Self-Host Nextcloud on VPS: Complete Guide, NC 34 and Security","Deploy Nextcloud 34.0.2 on your VPS with Docker and Redis. Complete guide: missing NC 34.0.0 apps, PostgreSQL oc_filecache_extended constraint, and 2FA CVEs.",12,"2026-04-10T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[114],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":21,"appSlug":117},"nextcloud",{"id":119,"slug":120,"slugs":121,"title":124,"excerpt":125,"readTime":126,"views":15,"isPinned":16,"publishedAt":127,"category":128,"categories":129,"featuredImage":26,"bgImage":27,"posterImage":131,"relatedSolution":132},73,"host-wordpress-on-your-own-vps",{"fr":122,"en":120,"ar":123},"heberger-wordpress","استضافة-wordpress-على-خادم-vps-الخاص-بك","Host WordPress on your own VPS","Host WordPress on your VPS for maximum performance and control: Docker, MariaDB, caching, reverse proxy and SSL.",3,"2026-04-08T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[130],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-wordpress-poster.svg",{"categorySlug":21,"appSlug":133},"wordpress",{"id":135,"slug":136,"slugs":137,"title":140,"excerpt":141,"readTime":142,"views":15,"isPinned":16,"publishedAt":143,"category":144,"categories":148,"featuredImage":26,"bgImage":27,"posterImage":150,"relatedSolution":26},37,"deploy-your-applications-with-nginx-proxy-manager-on-a-vps",{"fr":138,"en":136,"ar":139},"deployer-avec-nginx-proxy-manager","انشر-تطبيقاتك-باستخدام-nginx-proxy-manager-على-خادم-vps","Deploy your applications with Nginx Proxy Manager on a VPS","Manage domains, SSL and reverse proxy for several services on a VPS with Nginx Proxy Manager: installation, Docker networks, 502 troubleshooting and configuration.",10,"2026-05-14T00:00:00+00:00",{"id":126,"name":145,"slug":146,"color":147,"icon":146},"Deployment","deploiement","bg-success\u002F10 text-success",[149],{"id":126,"name":145,"slug":146,"color":147,"icon":146},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-nginx-proxy-manager-poster.svg",1787661719767]