{"id":83819,"date":"2026-06-18T08:00:00","date_gmt":"2026-06-18T15:00:00","guid":{"rendered":"https:\/\/dhblog.dream.press\/blog\/?p=83819"},"modified":"2026-08-25T11:46:09","modified_gmt":"2026-08-25T18:46:09","slug":"n8n-self-hosted","status":"publish","type":"post","link":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/","title":{"rendered":"Self-Hosted n8n: How to Run n8n on Your Own Server"},"content":{"rendered":"<div class=\"tldr-block\" style=\"display: none;\">\n\t<div class=\"svg\">\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 119.25 37.8\">\n\t<g>\n\t\t<g>\n\t\t\t<path fill=\"#ffffff\" d=\"M23.4,6.93h-8.1v24.57h-7.2V6.93H0V0h23.4v6.93Z\" \/>\n\t\t\t<path fill=\"#ffffff\" d=\"M45,24.57v6.93h-18.45V0h7.2v24.57h11.25Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M90.9,15.75c0,8.91-6.61,15.75-15.3,15.75h-12.6V0h12.6c8.68,0,15.3,6.84,15.3,15.75ZM83.97,15.75c0-5.4-3.42-8.82-8.37-8.82h-5.4v17.64h5.4c4.95,0,8.37-3.42,8.37-8.82Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M105.57,21.15h-3.42v10.35h-7.2V0h12.6c5.98,0,10.8,4.81,10.8,10.8,0,3.87-2.34,7.38-5.81,9.13l6.71,11.56h-7.74l-5.94-10.35ZM102.15,14.85h5.4c1.98,0,3.6-1.75,3.6-4.05s-1.62-4.05-3.6-4.05h-5.4v8.1Z\" \/>\n\t\t<\/g>\n\t\t<path\n\t\t\tfill=\"#0173ec\"\n\t\t\td=\"M53.97,37.8h-5.4l1.8-13.27h7.2l-3.6,13.27ZM49.02,12.55c0-2.34,1.93-4.27,4.27-4.27s4.27,1.94,4.27,4.27-1.93,4.27-4.27,4.27-4.27-1.94-4.27-4.27Z\"\n\t\t \/>\n\t<\/g>\n<\/svg>\n\t<\/div>\n\t<div class=\"tldr-wrap\">\n\t\t\n\n<p class=\"wp-block-paragraph\">Self-hosted n8n is the free Community edition of the n8n automation platform running on a server you control: you pay no n8n licensing or execution fees for permitted uses, but you still cover the server and any domain, backup storage, and administration costs. n8n Cloud&#8217;s Starter plan includes 2,500 workflow executions a month (\u20ac20\/month, billed annually); the self-hosted Community edition applies no execution quota.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll need a VPS with root access (4 GB of RAM is a cautious starting allocation), Docker Compose, PostgreSQL, and a willingness to own updates and backups. This guide walks through the full 11-step deployment. Prefer to skip it? DreamHost VPS Hosting includes n8n in its one-click app library, pre-installed with PostgreSQL and automatic SSL.<\/p>\n\n\n\t<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ve been watching your Zapier bill climb for six months.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every new workflow adds another line item, and every successful action step counts as a task. The monthly invoice now costs more than your project management tool.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You start Googling alternatives and land on <strong>n8n<\/strong>, an automation platform you can self-host on your own virtual private server (VPS) for the price of a small server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No execution quota. No per-task pricing. No surprise bills when your automations take off.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And yep, we walk you through the whole thing, command by command, from a bare Ubuntu server to a running instance with HTTPS, backups, and a tested restore.<\/p>\n\n\n\n<h2 id=\"h-what-is-n8n-and-why-are-people-self-hosting-it\" class=\"wp-block-heading\">What Is n8n and Why Are People Self-Hosting It?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">n8n is a workflow automation platform that lets you connect apps, move data between services, and build complex automations through a visual editor. Think of it as the engine behind &#8220;when X happens, do Y and Z,&#8221; except you&#8217;re dragging nodes and drawing connections instead of writing code.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1310\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow.webp\" alt=\"Workflow diagram showing user form submission triggering AI agent to check manager status\" class=\"wp-image-81963 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-300x246.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-1024x838.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-768x629.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-1536x1258.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-600x491.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-1200x983.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-730x598.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-1460x1195.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-784x642.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-1568x1284.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_an_n8n_workflow-877x718.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1310;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The project has passed <a target=\"_blank\" href=\"https:\/\/github.com\/n8n-io\/n8n\">200,000 GitHub stars<\/a>, and its official Docker image shows over <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">100 million pulls<\/a>. A lot of servers out there are running n8n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The platform runs under a <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/privacy-and-security\/sustainable-use-license\">Sustainable Use License<\/a>, which is worth understanding before you commit. It&#8217;s not traditional open source (n8n itself says it doesn&#8217;t use the term, since OSI-approved licenses can&#8217;t restrict use), but it&#8217;s not locked down either. You can run it freely for your own internal business purposes. You can&#8217;t sell a product, service, or module whose value derives entirely or substantially from n8n functionality.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;In practice this means all use is allowed unless you are selling a product, service, or module in which the value derives entirely or substantially from n8n functionality.&#8221; \u2014 <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/privacy-and-security\/sustainable-use-license\">n8n&#8217;s license FAQ<\/a><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">People <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/self-hosting\/\">self-host<\/a> n8n because the economics flip once you move past basic usage. <a target=\"_blank\" href=\"https:\/\/n8n.io\/pricing\/\">n8n Cloud<\/a> starts at \u20ac20\/month (billed annually) for 2,500 executions on the Starter plan, and if you&#8217;re running any real volume, those limits show up fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On your own VPS? No execution quota, control over the data your n8n instance stores, and no n8n licensing or execution bill, though your server, domain, backup storage, and administration still carry costs. Executions themselves cost nothing extra; heavier volume does use more memory and storage, which is a sizing question (covered below), not a billing one.<\/p>\n\n\n\n<h3 id=\"h-what-can-you-automate-with-n8n\" class=\"wp-block-heading\">What Can You Automate With n8n?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">n8n&#8217;s 400+ integrations cover a wide range, and community-built nodes extend the list further. n8n is also one of many self-hosted alternatives to SaaS tools; the same logic applies to everything from CRM to project management.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some common setups:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CRM and lead routing.<\/strong> Sync contacts between your CRM, email platform, and Slack when new leads come in.<\/li>\n\n\n\n<li><strong>Webhook-triggered workflows.<\/strong> Respond to events from payment processors, form submissions, or GitHub commits in real time.<\/li>\n\n\n\n<li><strong>Data pipeline automation.<\/strong> Pull data from APIs, transform it, and push it into databases or spreadsheets on a schedule.<\/li>\n\n\n\n<li><strong>AI agent chains.<\/strong> Connect LLMs with your internal tools to build custom AI assistants that can search, summarize, and act on your data.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">(That last one is where your server resources start to matter. More on that in the specs section.)<\/p>\n\n\n\n<div class=\"article-newsletter article-newsletter--gradient\">\n\n\n<h2>Get Content Delivered Straight to Your Inbox<\/h2><p>Subscribe now to receive all the latest updates, delivered directly to your inbox.<\/p><form class=\"nwsl-form\" id=\"newsletter_block_\" novalidate><div class=\"messages\"><\/div><div class=\"form-group\"><label for=\"input_newsletter_block_\"><input type=\"email\"name=\"email\"id=\"input_newsletter_block_\"placeholder=\"Enter your email address\"novalidatedisabled=\"disabled\"\/><\/label><button type=\"submit\"class=\"btn btn--brand\"disabled=\"disabled\"><span>Sign Me Up!<\/span><svg width=\"21\" height=\"14\" viewBox=\"0 0 21 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<path d=\"M13.8523 0.42524L12.9323 1.34521C12.7095 1.56801 12.7132 1.9304 12.9404 2.14865L16.7241 5.7823H0.5625C0.251859 5.7823 0 6.03416 0 6.3448V7.6573C0 7.96794 0.251859 8.2198 0.5625 8.2198H16.7241L12.9405 11.8535C12.7132 12.0717 12.7095 12.4341 12.9323 12.6569L13.8523 13.5769C14.072 13.7965 14.4281 13.7965 14.6478 13.5769L20.8259 7.39879C21.0456 7.17913 21.0456 6.82298 20.8259 6.60327L14.6477 0.42524C14.4281 0.205584 14.0719 0.205584 13.8523 0.42524Z\" fill=\"white\"\/>\n<\/svg>\n<\/button><\/div><\/form><\/div>\n\n\n<h2 id=\"h-how-much-does-self-hosting-n8n-cost\" class=\"wp-block-heading\">How Much Does Self-Hosting n8n Cost?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The self-hosted Community edition has no n8n licensing or execution fees for permitted uses. Your total cost includes the server plus any domain, backup storage, and administration time. <a target=\"_blank\" href=\"https:\/\/expresstech.io\/the-real-cost-of-self-hosting-n8n-in-2026\/\">ExpressTech&#8217;s 2026 cost breakdown<\/a> puts a raw VPS running Docker at <strong>$4\u20135 per month<\/strong>, a Coolify-managed VPS at $5\u20138, and managed one-click n8n platforms at $3\u20137.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Those are ExpressTech&#8217;s third-party hosting estimates. For a first-party number: the plan we recommend below, DreamHost VPS Hosting Stack 4, is $8.99\/month for the first 3 months on monthly billing and auto-renews at $15.99\/month after that, as of August 2026, with the full term plus taxes charged at checkout (current pricing is on the <a href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/n8n\/\">n8n VPS page<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compare that to n8n&#8217;s own hosted and licensed plans, as listed on <a target=\"_blank\" href=\"https:\/\/n8n.io\/pricing\/\">n8n&#8217;s pricing page<\/a>. n8n prices in euros, and these are the annual-billing rates:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Plan<\/strong><\/td><td><strong>Monthly Cost<\/strong><\/td><td><strong>Execution Limit<\/strong><\/td><\/tr><tr><td>n8n Cloud Starter<\/td><td>\u20ac20\/month<\/td><td>2,500 executions<\/td><\/tr><tr><td>n8n Cloud Pro<\/td><td>\u20ac50\/month<\/td><td>10,000 executions<\/td><\/tr><tr><td>n8n Business (self-hosted license)<\/td><td>\u20ac667\/month<\/td><td>40,000 executions<\/td><\/tr><tr><td>Self-hosted Community edition on a VPS<\/td><td>No n8n licensing or execution fees for permitted uses; VPS, domain, backup storage, and administration costs may apply<\/td><td>No quota<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The gap widens when you factor in how each platform counts usage. n8n charges one execution per workflow run, &#8220;regardless of complexity,&#8221; and every plan includes unlimited steps. Zapier, by contrast, counts <a target=\"_blank\" href=\"https:\/\/help.zapier.com\/hc\/en-us\/articles\/8496196837261-How-is-task-usage-measured-in-Zapier\">every successful action step as a task<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So a workflow with four action steps running 100 times per day is 3,000 n8n executions per month, but roughly 12,000 Zapier tasks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Real numbers back this up. <a target=\"_blank\" href=\"https:\/\/expresstech.io\/the-real-cost-of-self-hosting-n8n-in-2026\/\">ExpressTech&#8217;s analysis<\/a> works through an example of four workflows totaling about 7,000 executions per month: that workload outgrows n8n Cloud Starter and needs the Pro tier (listed there at $60\/month on monthly billing), while a $3\u20137\/month self-hosted setup runs it without limits, a difference they put at <strong>$636\u2013684 per year<\/strong>.<\/p>\n\n\n\n<h3 id=\"h-the-hidden-costs-of-self-hosting\" class=\"wp-block-heading\">The Hidden Costs of Self-Hosting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The dollar savings are real. But self-hosting isn&#8217;t free in every sense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what it costs you:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Your time. <\/strong>Maintenance time varies with your workload and operating experience, but you&#8217;ll be responsible for updates, backups, monitoring, and restore tests. Heavier setups with AI-powered automations will demand more.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>OAuth setup friction.<\/strong> Connecting services like Google Workspace or Microsoft 365 requires configuring OAuth credentials. Allow extra setup time for each provider and follow its console documentation. (If you&#8217;ve ever watched a loading spinner while a consent screen decides whether to trust your app, you know the feeling.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLS you have to trust but verify.<\/strong> The Caddy proxy in the setup below obtains and renews a publicly trusted certificate automatically, using an issuer such as Let&#8217;s Encrypt or ZeroSSL. Automatic is not the same as unbreakable: after DNS or proxy changes, confirm the certificate still renews.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ramp-up if you&#8217;re new to servers.<\/strong> The walkthrough below assumes you can SSH into a server, edit a file, and run commands. If you&#8217;ve never done those things, budget learning time on top of the deployment itself.<\/p>\n\n\n\n<h2 id=\"h-what-server-specs-does-n8n-need\" class=\"wp-block-heading\">What Server Specs Does n8n Need?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">n8n itself is light. The closest thing to official sizing is the <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/deploy-as-an-oem-integration\/prerequisites\">example figures in n8n&#8217;s OEM deployment docs<\/a>, which n8n labels &#8220;for illustrative purposes only,&#8221; based on n8n Cloud: a memory range of 320 MB to 2 GB, a 512 MB to 4 GB SSD-backed database, and roughly 100 MB of memory for an idle instance. As a cautious starting allocation rather than an official n8n minimum, consider 2 GB for testing and 4 GB when adding PostgreSQL and production workflows. Monitor representative workflows and add memory when sustained pressure appears.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, remember that n8n is usually more constrained by memory than CPU. n8n&#8217;s own docs say it plainly: the platform &#8220;isn&#8217;t CPU intensive,&#8221; and &#8220;usually, memory requirements supersede CPU requirements.&#8221; What drives memory up is your workflows: data volume, Code nodes (which copy data before and after processing), and large binary files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s our quick napkin math for sizing headroom:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Size for execution concurrency and the volume of data each workflow processes, then monitor memory usage under a representative workload. Code nodes and large binary payloads can increase memory requirements, so leave headroom and scale the VPS when monitoring shows sustained pressure.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"1652\" height=\"952\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6.webp\" alt=\"Chart showing RAM guidance for self-hosting n8n: about 100 MB idle per n8n's illustrative example, 2 GB as a cautious starting allocation for testing, 4 GB for production with PostgreSQL, and 8 GB for additional headroom\" class=\"wp-image-88705 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6.webp 1652w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-300x173.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-1024x590.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-768x443.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-1536x885.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-600x346.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-1200x692.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-730x421.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-1460x841.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-784x452.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-1568x904.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/08\/n8n-self-hosted-ram-guidance-dreamops-7ea8b9d45b496e7bffc6e1b6-877x505.webp 877w\" data-sizes=\"(max-width: 1652px) 100vw, 1652px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1652px; --smush-placeholder-aspect-ratio: 1652\/952;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">New to VPS hosting? Start with DreamHost&#8217;s <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/beginners-guide-vps\/\">beginner&#8217;s guide to VPS<\/a> to understand the basics before sizing your server.<\/p>\n\n\n\n<h2 id=\"h-which-vps-should-you-choose-for-self-hosted-n8n\" class=\"wp-block-heading\">Which VPS Should You Choose for Self-Hosted n8n?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">n8n doesn&#8217;t publish fixed RAM tiers by workload. Size for execution concurrency and data volume, leave headroom for Docker and PostgreSQL, then monitor representative workflows and scale when memory pressure is sustained.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, here&#8217;s how we&#8217;d map that to DreamHost plans:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Plan<\/strong><\/td><td><strong>Specs<\/strong><\/td><td><strong>When to Choose It<\/strong><\/td><\/tr><tr><td>DreamHost VPS Hosting Stack 4<\/td><td>4 GB RAM, 2 vCPU, 75 GB NVMe SSD<\/td><td>An unbenchmarked but cautious 4 GB starting allocation for a first n8n server.<\/td><\/tr><tr><td>DreamHost VPS Hosting Stack 8<\/td><td>8 GB RAM, 2 vCPU, 150 GB NVMe SSD<\/td><td>The 8 GB option for additional memory headroom when monitoring shows sustained pressure, with double the RAM and storage.<\/td><\/tr><tr><td>DreamHost VPS Hosting Stack 16<\/td><td>16 GB RAM, 4 vCPU, 250 GB NVMe SSD<\/td><td>The 16 GB option for extra concurrency, larger data volumes, or adding Redis workers in queue mode.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A few specs worth paying attention to beyond RAM: n8n lists SSD storage as a database best practice. Memory needs usually outweigh CPU needs, but the actual bottleneck depends on workflow concurrency, data volume, and the nodes you use. Unmetered bandwidth matters if you&#8217;re running webhook-heavy workloads with a constant stream of incoming HTTP requests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose a hosting environment that lets you run Docker and configure the database, networking, persistent storage, and reverse proxy. Conventional <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/shared-vs-vps-hosting\/\">shared hosting<\/a> generally does not provide that level of control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DreamHost&#8217;s <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/\">VPS Hosting<\/a> plans check the essential boxes (NVMe SSD storage, unmetered bandwidth, full root access, and Docker support), and <a href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/n8n\/\">n8n is in the one-click app library<\/a>, pre-installed with PostgreSQL and automatic SSL if you&#8217;d rather skip the manual setup below.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Our pick for a first n8n server is Stack 4. As of August 2026, it costs $8.99\/month for the first 3 months on monthly billing and auto-renews at $15.99\/month, with the full term plus taxes charged at checkout; the <a href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/n8n\/\">n8n VPS page<\/a> always shows the current rates. That renewal price is the honest number to compare against n8n Cloud Starter&#8217;s \u20ac20\/month.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh, and one thing to file away in the back of your mind for later: <strong>as your usage grows, n8n supports queue mode<\/strong>, a scaling architecture that separates the main instance (UI, triggers, webhooks) from workflow execution, using Redis as a message broker and worker instances to run the jobs. <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/scaling\/enable-queue-mode\">n8n&#8217;s documentation<\/a> calls it the mode that &#8220;provides the best scalability.&#8221;<\/p>\n\n\n\n<h2 id=\"h-how-do-you-set-up-n8n-on-a-vps\" class=\"wp-block-heading\">How Do You Set Up n8n on a VPS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deploying a self-hosted n8n instance takes 11 steps: DNS, SSH hardening, a firewall, <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/what-is-docker\/\">Docker<\/a>, secrets, a Compose file for the three-container stack (n8n, PostgreSQL, and Caddy), the Caddyfile, launch and verification, updates, backups, and a restore test. Caddy is our reverse proxy: the server that sits between the internet and your application, handling TLS and routing. We include the commands for the core deployment and a manual backup-and-restore test.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1200\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_.webp\" alt=\"Architecture diagram showing n8n self-hosting setup with database, n8n app\" class=\"wp-image-81965 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-300x225.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-1024x768.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-768x576.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-1536x1152.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-600x450.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-1200x900.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-730x548.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-1460x1095.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-784x588.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-1568x1176.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_how_do_you_set_up_n8n_on_a_vps_-877x658.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1200;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The commands target Ubuntu 22.04 or newer, but replace the example domain, secret values, volume name, and dated backup filenames where instructed. The <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/install-options\/use-a-cloud-provider\/use-docker-compose\">n8n Docker Compose documentation<\/a> covers the same ground with a Traefik proxy if you&#8217;d rather follow n8n&#8217;s own template.<\/p>\n\n\n\n<h3 id=\"h-what-you-will-need-before-you-start\" class=\"wp-block-heading\">What You Will Need Before You Start<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A VPS with root access<\/strong> running Ubuntu 22.04 or newer, with at least 2 GB of RAM (4 GB is our cautious recommendation for production)<\/li>\n\n\n\n<li><strong>A domain name<\/strong> you can point at your server&#8217;s IP address (for TLS and accessing the n8n editor)<\/li>\n\n\n\n<li><strong>Basic terminal comfort <\/strong>\u2014 you should know how to SSH into a server, edit a file, and run commands<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One more prerequisite that isn&#8217;t on any official list: <strong>back up your <code>N8N_ENCRYPTION_KEY<\/code> the moment you generate it.<\/strong> That&#8217;s why step 5 has you create the key with <code>openssl rand -hex 32<\/code> before first launch instead of letting n8n generate one silently. This key encrypts all your stored credentials, including every API key, OAuth token, and database password you&#8217;ve connected. n8n&#8217;s <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">own Docker documentation<\/a> warns that if the key can&#8217;t be found at startup, n8n creates a new one and existing credentials can no longer be decrypted \u2014 meaning you&#8217;re rebuilding every single integration from scratch (and regretting your life choices). Copy it somewhere safe, separate from your database backups.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your provider only gave you a root login, create a deployment user first, from the provider console or a root SSH session, before the local SSH commands in step 2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>adduser deploy\nusermod -aG sudo deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Everything below runs as that user, with <code>sudo<\/code> where needed.<\/p>\n\n\n\n<h3 id=\"h-step-1-point-your-domain-at-the-server\" class=\"wp-block-heading\">Step 1: Point Your Domain at the Server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a DNS A record for a dedicated subdomain (<code>n8n.example.com<\/code> throughout this guide) pointing at your server&#8217;s IP address, exactly as <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/install-options\/use-a-cloud-provider\/use-docker-compose\">n8n&#8217;s Docker Compose guide<\/a> describes. Do this first: if DNS hasn&#8217;t propagated, Caddy can&#8217;t obtain a certificate, and your browser may show a security error instead of the n8n editor.<\/p>\n\n\n\n<h3 id=\"h-step-2-harden-ssh-access\" class=\"wp-block-heading\">Step 2: Harden SSH Access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On your <em>local<\/em> machine, generate a key pair (Ubuntu&#8217;s <a target=\"_blank\" href=\"https:\/\/ubuntu.com\/server\/docs\/how-to\/security\/openssh-server\/\">OpenSSH documentation<\/a> recommends ed25519) and copy it to the server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519\nssh-copy-id deploy@your_server_ip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm you can log in with the key. Then, on the server, turn off password and root logins, and check what sshd will actually enforce:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/ssh\/sshd_config.d\/00-hardening.conf &gt; \/dev\/null &lt;&lt;'EOF'\nPasswordAuthentication no\nPermitRootLogin no\nEOF\nsudo sshd -t\nsudo sshd -T | grep -E '^(passwordauthentication|permitrootlogin) '<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>00-<\/code> prefix is deliberate. OpenSSH uses the <em>first<\/em> value it reads for each keyword, per the <a target=\"_blank\" href=\"https:\/\/man.openbsd.org\/sshd_config\">sshd_config manual<\/a>, and cloud server images often ship earlier drop-ins in the same directory (cloud-init, for one, writes its SSH settings to <code>50-cloud-init.conf<\/code>). Name your file <code>99-hardening.conf<\/code> and one of those snippets can silently win. <code>sshd -t<\/code> checks the configuration for errors; <code>sshd -T<\/code> prints the effective settings after every file is merged. Confirm the last command prints <code>passwordauthentication no<\/code> and <code>permitrootlogin no<\/code> before you go any further. Then restart sshd:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart ssh.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ubuntu&#8217;s docs warn that a bad sshd config on a remote server can lock you out. Keep your current session open and test a fresh login in a second terminal before closing anything.<\/p>\n\n\n\n<h3 id=\"h-step-3-turn-on-the-firewall\" class=\"wp-block-heading\">Step 3: Turn On the Firewall<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ubuntu ships UFW (Uncomplicated Firewall) disabled by default. Allow SSH <em>before<\/em> enabling it, so the firewall can&#8217;t cut off your own session:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 22\/tcp\nsudo ufw allow 80\/tcp\nsudo ufw allow 443\/tcp\nsudo ufw --force enable\nsudo ufw status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Three ports, nothing else. One Docker-specific warning from <a target=\"_blank\" href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\">Docker&#8217;s own install docs<\/a>: ports that Docker publishes to the host bypass UFW rules entirely. That&#8217;s why the Compose file in step 6 publishes host ports only for Caddy: 80 and 443 are the only container ports published by Compose (SSH on 22 is also open), and n8n and PostgreSQL get no published host ports at all.<\/p>\n\n\n\n<h3 id=\"h-step-4-install-docker-and-docker-compose\" class=\"wp-block-heading\">Step 4: Install Docker and Docker Compose<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install Docker Engine from Docker&#8217;s official apt repository, not the <code>get.docker.com<\/code> convenience script, which Docker&#8217;s docs recommend only for testing and development. First the prerequisites and Docker&#8217;s signing key:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install ca-certificates curl\nsudo install -m 0755 -d \/etc\/apt\/keyrings\nsudo curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg -o \/etc\/apt\/keyrings\/docker.asc\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.asc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, register the repository itself. This writes the repository file from <a target=\"_blank\" href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\">Docker&#8217;s Ubuntu install guide<\/a>, filling in your Ubuntu release automatically:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/apt\/sources.list.d\/docker.sources &gt; \/dev\/null &lt;&lt;EOF\nTypes: deb\nURIs: https:\/\/download.docker.com\/linux\/ubuntu\nSuites: $(. \/etc\/os-release &amp;&amp; echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\")\nComponents: stable\nSigned-By: \/etc\/apt\/keyrings\/docker.asc\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then install and verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\nsudo docker run hello-world<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>hello-world<\/code> prints its confirmation message, Docker and the Compose plugin are ready.<\/p>\n\n\n\n<h3 id=\"h-step-5-create-the-project-directory-and-secrets\" class=\"wp-block-heading\">Step 5: Create the Project Directory and Secrets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create the project directory, then generate your encryption key \u2014 don&#8217;t let n8n invent one silently on first boot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/opt\/n8n-compose\ncd \/opt\/n8n-compose\nopenssl rand -hex 32<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Copy the output somewhere safe right now \u2014 off the server. Then put it, along with a strong database password, in a protected <code>.env<\/code> file next to your compose file (Docker Compose reads it automatically). Replace both placeholder values with your own:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/opt\/n8n-compose\/.env &gt; \/dev\/null &lt;&lt;'EOF'\nPOSTGRES_PASSWORD=choose_a_strong_password\nN8N_ENCRYPTION_KEY=paste_the_64_character_key_you_just_generated\nEOF\nsudo chmod 600 \/opt\/n8n-compose\/.env<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>chmod 600<\/code> matters: this file holds secrets, so only its owner (root) should be able to read it. In the compose file, <code>N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true<\/code> applies the same idea inside the container: per <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/basic-configuration\/use-environment-variables\/security\">n8n&#8217;s security variables reference<\/a>, it has n8n try to set 0600 permissions on its own settings file.<\/p>\n\n\n\n<h3 id=\"h-step-6-write-the-docker-compose-file\" class=\"wp-block-heading\">Step 6: Write the Docker Compose File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>\/opt\/n8n-compose\/docker-compose.yml<\/code> (for example with <code>sudo nano \/opt\/n8n-compose\/docker-compose.yml<\/code>) and paste the following, swapping in your own domain for <code>n8n.example.com<\/code> in both URL lines and setting your timezone:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  caddy:\n    image: caddy:2\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\/Caddyfile:\/etc\/caddy\/Caddyfile\n      - caddy_data:\/data\n      - caddy_config:\/config\n\n  n8n:\n    image: docker.n8n.io\/n8nio\/n8n:2.36.7\n    restart: unless-stopped\n    expose:\n      - \"5678\"\n    environment:\n      - DB_TYPE=postgresdb\n      - DB_POSTGRESDB_HOST=postgres\n      - DB_POSTGRESDB_DATABASE=n8n\n      - DB_POSTGRESDB_USER=n8n\n      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}\n      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}\n      - N8N_HOST=n8n.example.com\n      - N8N_PORT=5678\n      - N8N_PROTOCOL=https\n      - N8N_WEBHOOK_URL=https:\/\/n8n.example.com\/\n      - N8N_PROXY_HOPS=1\n      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true\n      - GENERIC_TIMEZONE=America\/New_York\n      - TZ=America\/New_York\n      - EXECUTIONS_DATA_MAX_AGE=168\n    depends_on:\n      postgres:\n        condition: service_healthy\n    volumes:\n      - n8n_data:\/home\/node\/.n8n\n\n  postgres:\n    image: postgres:18\n    restart: unless-stopped\n    environment:\n      - POSTGRES_USER=n8n\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n      - POSTGRES_DB=n8n\n      - PGDATA=\/var\/lib\/postgresql\/data\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U n8n -d n8n\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data\n\nvolumes:\n  caddy_data:\n  caddy_config:\n  n8n_data:\n  postgres_data:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Five details in there earn their keep:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The image is pinned to a specific version<\/strong> (2.36.7 is the current stable release as we write this, per <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/install-options\/use-a-cloud-provider\/use-docker-compose\">n8n&#8217;s install docs<\/a>), so upgrades only happen when you decide.<\/li>\n\n\n\n<li><strong>n8n publishes no host port.<\/strong> It is reachable by containers on the Compose network, including Caddy, but not through a published host port, so the editor can only ever be reached through the reverse proxy, never directly from the internet.<\/li>\n\n\n\n<li><strong>The healthcheck makes n8n wait for PostgreSQL.<\/strong> A bare <code>depends_on<\/code> only waits for the container to start, not for the database to accept connections. The <code>condition: service_healthy<\/code> pattern comes straight from <a target=\"_blank\" href=\"https:\/\/github.com\/n8n-io\/n8n-hosting\">n8n&#8217;s own example Postgres compose file<\/a>, which also deploys PostgreSQL 18.<\/li>\n\n\n\n<li><strong>The <code>N8N_WEBHOOK_URL<\/code> \/ <code>N8N_PROXY_HOPS<\/code> pair matters behind a proxy.<\/strong> n8n normally builds webhook URLs from its protocol, host, and port, and <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/basic-configuration\/configuration-examples\/configure-webhook-urls-with-reverse-proxy\">n8n&#8217;s docs<\/a> say that won&#8217;t work behind a reverse proxy, so you set the webhook URL manually so n8n can &#8220;register the correct webhook URLs with external services,&#8221; set <code>N8N_PROXY_HOPS<\/code> to 1, and make sure the proxy passes the X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto headers. (The same page notes <code>N8N_WEBHOOK_URL<\/code> replaces the older <code>WEBHOOK_URL<\/code>, which is deprecated from n8n 2.35.0.)<\/li>\n\n\n\n<li><strong><code>TZ<\/code> and <code>GENERIC_TIMEZONE<\/code> do different jobs.<\/strong> Per <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">n8n&#8217;s Docker docs<\/a>, <code>GENERIC_TIMEZONE<\/code> drives scheduling nodes like Schedule, while <code>TZ<\/code> sets the container&#8217;s system timezone (what commands like <code>date<\/code> report). Set both to the same value.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">(Start with PostgreSQL from day one. n8n defaults to SQLite, which works for testing, but n8n&#8217;s hosting templates recommend PostgreSQL for production, and migrating later is painful in the &#8220;I wish I&#8217;d done this right from the start&#8221; way.)<\/p>\n\n\n\n<h3 id=\"h-step-7-write-the-caddyfile\" class=\"wp-block-heading\">Step 7: Write the Caddyfile<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>\/opt\/n8n-compose\/Caddyfile<\/code> with your domain (again, replace <code>n8n.example.com<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>n8n.example.com {\n    reverse_proxy n8n:5678\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the whole reverse proxy config. Per <a target=\"_blank\" href=\"https:\/\/caddyserver.com\/docs\/automatic-https\">Caddy&#8217;s automatic HTTPS documentation<\/a>, Caddy obtains and renews a publicly trusted certificate automatically, using an issuer such as Let&#8217;s Encrypt or ZeroSSL, and redirects HTTP to HTTPS, provided your DNS A record points at the server and ports 80 and 443 are open (steps 1 and 3). Caddy is also one of the reverse proxies in <a target=\"_blank\" href=\"https:\/\/github.com\/n8n-io\/n8n-hosting\">n8n&#8217;s official hosting examples<\/a>.<\/p>\n\n\n\n<h3 id=\"h-step-8-launch-and-verify\" class=\"wp-block-heading\">Step 8: Launch and Verify<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt\/n8n-compose\nsudo docker compose up -d\nsudo docker compose ps<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wait until <code>ps<\/code> shows the postgres container healthy and n8n running, then check the front door from any machine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsS -o \/dev\/null -w '%{http_code}' https:\/\/n8n.example.com\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A 2xx code (or a 3xx redirect) means Caddy terminated TLS and n8n answered; <code>curl<\/code> exiting with an error instead means DNS, the certificate, or the containers need a look (<code>sudo docker compose logs caddy<\/code> and <code>sudo docker compose logs n8n<\/code> are the first places to check). Open <code>https:\/\/n8n.example.com<\/code> in a browser and create your owner account.<\/p>\n\n\n\n<h3 id=\"h-step-9-update-n8n-deliberately\" class=\"wp-block-heading\">Step 9: Update n8n Deliberately<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">n8n releases a new minor version most weeks, and its <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">update instructions<\/a> tell you to check the breaking-changes changelog before upgrading. When you&#8217;re ready: edit the version tag in <code>docker-compose.yml<\/code>, then<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt\/n8n-compose\nsudo docker compose pull\nsudo docker compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With a pinned tag, pulling alone changes nothing: you choose each upgrade by changing the tag, which is the point of pinning. Run a backup (step 10) before major version updates.<\/p>\n\n\n\n<h3 id=\"h-step-10-schedule-backups\" class=\"wp-block-heading\">Step 10: Schedule Backups<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Three things are required for a usable restore: the PostgreSQL database, the <code>n8n_data<\/code> volume, and the <code>.env<\/code> file that supplies <code>N8N_ENCRYPTION_KEY<\/code>. n8n&#8217;s <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">Docker docs<\/a> are explicit that even when you use PostgreSQL, the <code>\/home\/node\/.n8n<\/code> folder (our <code>n8n_data<\/code> volume) still holds essential data, including the encryption key material. Back up all three, and retain <code>docker-compose.yml<\/code> and <code>Caddyfile<\/code> so you can reconstruct the stack. The script below handles the database and the volume; copying the config files off-host comes right after. Create the script as a root-owned file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/opt\/n8n-compose\/backup.sh &gt; \/dev\/null &lt;&lt;'EOF'\n#!\/bin\/bash\nset -euo pipefail\ncd \/opt\/n8n-compose\nSTAMP=$(date +%Y-%m-%d)\nmkdir -p \/opt\/n8n-backups\ndocker compose exec -T postgres pg_dump -U n8n -d n8n &gt; \"\/opt\/n8n-backups\/n8n-db-${STAMP}.sql\"\ndocker run --rm -v n8n-compose_n8n_data:\/data -v \/opt\/n8n-backups:\/backup alpine \\\n  tar czf \"\/backup\/n8n-data-${STAMP}.tar.gz\" -C \/data .\nfind \/opt\/n8n-backups -name 'n8n-db-*.sql' -mtime +30 -delete\nfind \/opt\/n8n-backups -name 'n8n-data-*.tar.gz' -mtime +30 -delete\nEOF\nsudo chmod 700 \/opt\/n8n-compose\/backup.sh\nsudo \/opt\/n8n-compose\/backup.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notes on the script: <code>n8n-compose_n8n_data<\/code> is the volume name Compose creates for a project directory named <code>n8n-compose<\/code>; confirm yours with <code>sudo docker volume ls<\/code> and adjust if it differs. The two <code>find<\/code> lines keep 30 days of backups; set a different retention to match your storage and recovery needs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schedule it from root&#8217;s crontab. Root&#8217;s cron should only ever execute a root-owned script (<code>chmod 700<\/code>, with the <code>.env<\/code> at <code>600<\/code>), never a file another user can edit. Run <code>sudo crontab -e<\/code> and add one line for a daily 3 a.m. run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 3 * * * \/opt\/n8n-compose\/backup.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The script backs up the PostgreSQL database and the <code>n8n_data<\/code> volume on a schedule. Copy the <code>.env<\/code> (which contains your encryption key), Compose, and Caddy files off-host now and whenever they change. On the server, create a temporary protected archive:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tar -C \/opt\/n8n-compose -czf \/home\/deploy\/n8n-config.tar.gz .env docker-compose.yml Caddyfile\nsudo chown deploy:deploy \/home\/deploy\/n8n-config.tar.gz\nchmod 600 \/home\/deploy\/n8n-config.tar.gz<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then, from your local machine, pull down the config archive along with the backups, and delete the temporary server copy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scp deploy@your_server_ip:\/home\/deploy\/n8n-config.tar.gz .\nscp -r deploy@your_server_ip:\/opt\/n8n-backups .\nssh deploy@your_server_ip 'rm \/home\/deploy\/n8n-config.tar.gz'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A backup that only exists on the server it protects disappears with the server.<\/p>\n\n\n\n<h3 id=\"h-step-11-test-a-restore-on-a-scratch-vps\" class=\"wp-block-heading\">Step 11: Test a Restore on a Scratch VPS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is a backup-and-restore procedure so you can check that your backups are usable. Test this restore on a fresh scratch VPS \u2014 never on your production server. Provision a throwaway server, repeat step 4 (Docker) there, and copy over your project files (<code>docker-compose.yml<\/code>, <code>Caddyfile<\/code>, <code>.env<\/code>) and your latest dated backups into the same paths.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, swap the hostname: put a test hostname (say, <code>n8n-restore-test.example.com<\/code>, with an A record pointing at the scratch VPS) into <code>N8N_HOST<\/code>, <code>N8N_WEBHOOK_URL<\/code>, and the Caddyfile. Then, replacing the dated filenames with your own:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt\/n8n-compose\nsudo docker compose create\nsudo docker run --rm -v n8n-compose_n8n_data:\/data -v \/opt\/n8n-backups:\/backup alpine \\\n  sh -c \"cd \/data &amp;&amp; tar xzf \/backup\/n8n-data-2026-08-25.tar.gz\"\nsudo docker compose up -d --wait postgres\nsudo docker compose exec -T postgres psql -U n8n -d n8n &lt; \/opt\/n8n-backups\/n8n-db-2026-08-25.sql\nsudo docker compose run --rm n8n unpublish:workflow --all\nsudo docker compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>unpublish:workflow --all<\/code> line uses <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/use-the-command-line\">n8n&#8217;s built-in Server CLI<\/a> to unpublish every restored workflow before the instance starts, so restored schedules and triggers don&#8217;t fire against your production systems from the test box. Finish with the same <code>curl<\/code> check as step 8, against the test hostname.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Be honest with yourself about what a green check means: it confirms the database and volume restored and the stack starts cleanly. It doesn&#8217;t exercise your workflows through the editor, so log in on the test instance and spot-check the ones you can&#8217;t afford to lose.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-keep-a-self-hosted-n8n-instance-secure\" class=\"wp-block-heading\">How Do You Keep a Self-Hosted n8n Instance Secure?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A self-hosted n8n instance is as secure as the server it runs on, and you&#8217;re the one who controls that server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Security comes down to six things. None of them is complicated individually, but skipping any one of them leaves a real gap. The setup above already implements the first three.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>HTTPS through a reverse proxy.<\/strong> Never access the n8n editor over plain HTTP. The Caddy config in step 7 obtains and renews a publicly trusted certificate automatically, using an issuer such as Let&#8217;s Encrypt or ZeroSSL, and redirects HTTP to HTTPS.<\/li>\n\n\n\n<li><strong>Firewall lockdown.<\/strong> UFW allows only SSH (22), HTTP (80), and HTTPS (443). <em>Never<\/em> expose n8n&#8217;s default port 5678 directly to the internet. The compose file above enforces this by giving n8n no published host port, so only containers on the Compose network can reach it.<\/li>\n\n\n\n<li><strong>Docker network isolation.<\/strong> PostgreSQL and n8n talk over the internal Compose network. Your database port is never published on the host, so it&#8217;s never reachable from outside.<\/li>\n\n\n\n<li><strong>Strong authentication.<\/strong> Use a strong owner password, and turn on two-factor authentication; n8n&#8217;s <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/security\">security guide<\/a> lists 2FA among its recommended protections for self-hosted instances.<\/li>\n\n\n\n<li><strong>Regular updates.<\/strong> Update the version tag in your compose file, then pull and restart (step 9). Read the changelog first, because n8n updates can include breaking changes.<\/li>\n\n\n\n<li><strong>Backups you&#8217;ve actually restored.<\/strong> Steps 10 and 11 give you the schedule and the test. A backup you&#8217;ve never tested is a <em>hope<\/em>, not a plan.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">One more thing to watch that&#8217;s not strictly security-related but will make a big difference. n8n saves the input and output of every execution to its database by default. <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/scaling\/manage-execution-data\">Pruning is on by default<\/a>: n8n deletes executions older than 336 hours (14 days), or once you pass 10,000 stored executions. A busy instance can still bloat PostgreSQL in the meantime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your workflows are chatty, tighten it: set <code>EXECUTIONS_DATA_MAX_AGE=168<\/code> to prune execution data older than seven days (the compose file above already does), or skip storing successful runs entirely with <code>EXECUTIONS_DATA_SAVE_ON_SUCCESS=none<\/code>.<\/p>\n\n\n\n<h2 id=\"h-what-are-the-trade-offs-of-self-hosting-vs-n8n-cloud\" class=\"wp-block-heading\">What Are the Trade-Offs of Self-Hosting vs. n8n Cloud?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting n8n gives you an instance with no execution quota and control over the data it stores, for the cost of a small VPS plus your own administration. n8n Cloud gives you zero server maintenance, with execution caps by tier. The choice comes down to whether you want to own your automation infrastructure or pay someone else to run it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/install-options\/use-a-cloud-provider\/use-docker-compose\">n8n documentation puts it<\/a> this way: &#8220;n8n recommends self-hosting for expert users. Mistakes can lead to data loss, security issues, and downtime. If you aren&#8217;t experienced at managing servers, n8n recommends n8n Cloud.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how the two options compare:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Factor<\/strong><\/td><td><strong>Self-Hosted<\/strong><\/td><td><strong>n8n Cloud<\/strong><\/td><\/tr><tr><td>Monthly cost<\/td><td>Your VPS bill plus any domain, backup storage, and administration costs (DreamHost Stack 4: $8.99\/mo for 3 months, then $15.99\/mo, as of August 2026; ExpressTech&#8217;s 2026 third-party estimates: $4\u20138\/mo)<\/td><td>\u20ac20\u201350 (billed annually), by tier<\/td><\/tr><tr><td>Executions<\/td><td>No quota; capacity depends on your server&#8217;s resources<\/td><td>2,500 (Starter) or 10,000 (Pro)<\/td><\/tr><tr><td>Setup<\/td><td>The 11-step walkthrough above<\/td><td>Minutes<\/td><\/tr><tr><td>Maintenance<\/td><td>Updates, backups, and monitoring are yours<\/td><td>Handled by n8n<\/td><\/tr><tr><td>Data location<\/td><td>Your server<\/td><td>n8n&#8217;s infrastructure<\/td><\/tr><tr><td>Updates<\/td><td>Manual (update the tag, pull, restart)<\/td><td>Automatic<\/td><\/tr><tr><td>TLS<\/td><td>Caddy obtains and renews certificates automatically (issuer such as Let&#8217;s Encrypt or ZeroSSL)<\/td><td>Handled for you<\/td><\/tr><tr><td>Scaling<\/td><td>Add RAM, or use queue mode with Redis workers<\/td><td>Upgrade plan tier<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>There&#8217;s also a middle ground worth knowing about. <\/strong>Managed platforms like PikaPods (around $3.80\/month) and Elestio (around $17\/month, per <a target=\"_blank\" href=\"https:\/\/expresstech.io\/the-real-cost-of-self-hosting-n8n-in-2026\/\">ExpressTech&#8217;s comparison<\/a>) run self-hosted n8n without you managing the server yourself. These services can reduce server-administration work, although you should verify who handles n8n updates, backups, monitoring, and security.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But here&#8217;s the bigger picture. On any hosted plan, your execution capacity is a billing tier, and the platform sets the tiers. Prices, quotas, and features can change around workflows you&#8217;ve already built.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With self-hosting, the instance and the data it stores sit on infrastructure <em>you<\/em> control (connected services still receive whatever your workflows send them). Full control, full responsibility.<\/p>\n\n\n\n<h2 id=\"h-making-the-final-call\" class=\"wp-block-heading\">Making the Final Call<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting makes sense when three things line up:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You&#8217;re running enough automations that cloud execution caps would pinch<\/li>\n\n\n\n<li>You want your workflow data on infrastructure you control<\/li>\n\n\n\n<li>You (or someone on your team) is willing to own updates, backups, and monitoring<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Otherwise, n8n Cloud is a reasonable call. Paying for the Starter plan to avoid ever thinking about Docker logs is a fair trade, especially for a small team that just wants their automations to run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But once you&#8217;re ready to cross the self-hosting threshold, the math gets decisive fast. A 4 GB VPS is a practical, if unbenchmarked, starting point; production capacity depends on concurrency, data volume, and the nodes you use, so monitor the instance and scale it as demand grows. Start small, upgrade as your workflows grow, and keep full control of your stack.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That last part matters more than it might seem. You can always move up to a bigger server. It&#8217;s a lot harder to untangle yourself from a SaaS platform after it changes its pricing around the workflows you&#8217;ve already built.<\/p>\n\n\n\n\n<div class=\"article-cta-shared article-cta-small article-cta--product\">\n\t<div class=\"tr-img-wrap-outer jsLoading\"><img decoding=\"async\" class=\"js-img-lazy \" src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/themes\/blog2018\/assets\/img\/lazy-loading-transparent.webp\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a-877x522.webp 1x, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a.webp 2x\"  \/><\/div>\n\n\t<a href='https:\/\/www.dreamhost.com\/hosting\/vps\/' class='link-top' target='_blank' rel='noopener noreferrer'>\n\t\t<span>VPS<\/span>\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 384 512\" width=\"15\"><path d=\"M342.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L274.7 256 105.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\/><\/svg>\n\t<\/a>\n\n\t<div class=\"content-btm\">\n\t\t<h2 class=\"h2--md\">\n\t\t\tOwn Your Entire Stack. Apps, AI, Databases, and More.\n\t\t<\/h2>\n\t\t<p class=\"p--md\">\n\t\t\tKeep every credential and conversation on a server you control, with NVMe speed and unmetered bandwidth built in.\n\t\t<\/p>\n\n\t\t        <a\n            href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/\"\n                        class=\"btn btn--white-outline btn--sm btn--round\"\n                                    target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            >\n                            Explore VPS Hosting Plans                    <\/a>\n\n\t<\/div>\n<\/div>\n\n\n<h2 id=\"h-frequently-asked-questions-about-self-hosting-n8n\" class=\"wp-block-heading\">Frequently Asked Questions About Self-Hosting n8n<\/h2>\n\n\n\n<h3 id=\"h-is-n8n-really-free-to-self-host\" class=\"wp-block-heading\">Is n8n really free to self-host?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The n8n software is free to run on your own server under the Sustainable Use License. The self-hosted Community edition (the standard version n8n publishes on GitHub) has no n8n licensing or execution fees for permitted uses such as internal business automation. The &#8220;free&#8221; part is the software; you&#8217;ll still pay for your server, plus any domain, backup storage, and administration time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The license restricts selling a product, service, or module whose value derives entirely or substantially from n8n functionality. Review <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/privacy-and-security\/sustainable-use-license\">n8n&#8217;s license FAQ<\/a> if your intended use involves offering n8n-powered functionality to customers.<\/p>\n\n\n\n<h3 id=\"h-what-are-the-minimum-system-requirements-for-n8n\" class=\"wp-block-heading\">What are the minimum system requirements for n8n?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">n8n publishes example sizing rather than a hard minimum, and labels those figures illustrative (they come from its OEM deployment docs): roughly 100 MB of memory at idle, an example memory range of 320 MB\u20132 GB, and a 512 MB\u20134 GB SSD-backed database. As a cautious starting allocation rather than an official n8n minimum, consider 2 GB for testing and 4 GB when adding PostgreSQL and production workflows, then monitor and add memory when sustained pressure appears.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DreamHost&#8217;s VPS Hosting Stack 4 plan provides 4 GB of RAM with NVMe SSD storage and full root access for running self-hosted applications like n8n. See <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/\">VPS Hosting<\/a> plans for details.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use PostgreSQL instead of SQLite for production, and prefer SSD storage because n8n lists it as a database best practice.<\/p>\n\n\n\n<h3 id=\"h-can-i-run-n8n-locally-instead-of-on-a-vps\" class=\"wp-block-heading\">Can I run n8n locally instead of on a VPS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes \u2014 a single Docker command runs n8n on your own machine, and it&#8217;s a great way to test workflows before committing to a server. The catch is webhooks: workflows triggered by external services need your instance to be reachable from the internet, which a laptop behind a home router isn&#8217;t by default. Port forwarding, VPNs, and tunnels can work around that, each with its own setup and security trade-offs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">n8n offers a tunnel service to relay webhooks to a local instance, but its <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">Docker documentation<\/a> is blunt that the tunnel is &#8220;only meant for local development and testing&#8221; and shouldn&#8217;t be used in production. For anything that runs around the clock, use a VPS.<\/p>\n\n\n\n<h3 id=\"h-can-i-migrate-from-zapier-to-n8n\" class=\"wp-block-heading\">Can I migrate from Zapier to n8n?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t expect a one-click import. Plan to rebuild your workflows in n8n&#8217;s visual editor rather than importing them from Zapier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The good news: n8n has 400+ integrations, but check every app, trigger, and action your current workflows use before planning the migration. Simple workflows rebuild quickly; complex multi-step sequences take longer.<\/p>\n\n\n\n<h3 id=\"h-how-do-i-update-a-self-hosted-n8n-instance\" class=\"wp-block-heading\">How do I update a self-hosted n8n instance?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit the version tag in your <code>docker-compose.yml<\/code> to the release you want, then run <code>docker compose pull<\/code> followed by <code>docker compose up -d<\/code>. With a pinned tag like <code>docker.n8n.io\/n8nio\/n8n:2.36.7<\/code>, pulling alone changes nothing \u2014 you choose each upgrade by changing the tag, which is the point of pinning. (If you use the <code>latest<\/code> tag instead, a pull-and-restart is all it takes, but every restart becomes a surprise upgrade.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Back up your PostgreSQL database before major version updates. The backup script from the walkthrough above handles it, or run <code>pg_dump<\/code> in the PostgreSQL container directly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Careless updates break things, and n8n releases a new minor version most weeks. n8n&#8217;s own <a target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/n8nio\/n8n\">update instructions<\/a> tell you to check the breaking-changes changelog before upgrading, so read it before you pull. The restart itself is quick; reading the changelog is the part that deserves your time.<\/p>\n\n\n\n<h3 id=\"h-is-self-hosted-n8n-secure-enough-for-business-data\" class=\"wp-block-heading\">Is self-hosted n8n secure enough for business data?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting gives you control over where n8n stores workflow definitions, credentials, and execution data. However, connected services still receive any data your workflows send to them, and securing the server remains your responsibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Follow the six-point checklist from the security section above: HTTPS, firewall, Docker isolation, strong auth with 2FA, regular updates, and tested backups. The n8n team maintains a <a target=\"_blank\" href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/security\">security guide<\/a> covering additional production considerations, from security audits to two-factor authentication.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"headline\":\"Self-Hosted n8n: How to Run n8n on Your Own Server\",\"description\":\"Self-host n8n on a VPS: the Community edition has no n8n licensing or execution fees for permitted uses. Server specs, an 11-step Docker Compose setup with Caddy, security, backups, and when self-hosted beats n8n Cloud.\",\"datePublished\":\"2026-04-15\",\"dateModified\":\"2026-08-25\",\"author\":{\"@type\":\"Organization\",\"name\":\"DreamHost Blog\",\"url\":\"https:\/\/www.dreamhost.com\/blog\/\"},\"publisher\":{\"@type\":\"Organization\",\"name\":\"DreamHost\",\"url\":\"https:\/\/www.dreamhost.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\/\/www.dreamhost.com\/assets\/images\/dh-logo.svg\"}},\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/\"},\"keywords\":[\"n8n self hosted\",\"self host n8n\",\"n8n docker\",\"n8n VPS\",\"n8n hosting\",\"workflow automation\"]},{\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Is n8n really free to self-host?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The n8n software is free to run on your own server under the Sustainable Use License. The self-hosted Community edition (the standard version n8n publishes on GitHub) has no n8n licensing or execution fees for permitted uses such as internal business automation. You'll still pay for your server, plus any domain, backup storage, and administration time. The license restricts selling a product, service, or module whose value derives entirely or substantially from n8n functionality; review n8n's license FAQ if your intended use involves offering n8n-powered functionality to customers.\"}},{\"@type\":\"Question\",\"name\":\"What are the minimum system requirements for n8n?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"n8n publishes example sizing rather than a hard minimum, and labels those figures illustrative: roughly 100 MB of memory at idle, an example memory range of 320 MB\u20132 GB, and a 512 MB\u20134 GB SSD-backed database. As a cautious starting allocation rather than an official n8n minimum, consider 2 GB for testing and 4 GB when adding PostgreSQL and production workflows, then monitor and add memory when sustained pressure appears. Use PostgreSQL instead of SQLite for production, and prefer SSD storage because n8n lists it as a database best practice.\"}},{\"@type\":\"Question\",\"name\":\"Can I run n8n locally instead of on a VPS?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes \u2014 a single Docker command runs n8n on your own machine, which is a great way to test workflows. The catch is webhooks: workflows triggered by external services need your instance to be reachable from the internet, which a laptop behind a home router isn't by default; port forwarding, VPNs, and tunnels can work around that with their own trade-offs. n8n's tunnel service can relay webhooks to a local instance, but n8n's documentation states it's only meant for local development and testing, not production. For automations that run around the clock, use a VPS.\"}},{\"@type\":\"Question\",\"name\":\"Can I migrate from Zapier to n8n?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Don't expect a one-click import: plan to rebuild your workflows in n8n's visual editor rather than importing them from Zapier. n8n has 400+ integrations, but check every app, trigger, and action your current workflows use before planning the migration. Simple workflows rebuild quickly; complex multi-step sequences take longer.\"}},{\"@type\":\"Question\",\"name\":\"How do I update a self-hosted n8n instance?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Edit the version tag in your docker-compose.yml to the release you want, then run docker compose pull followed by docker compose up -d. With a pinned tag, pulling alone changes nothing \u2014 you choose each upgrade by changing the tag. Back up your PostgreSQL database before major version updates, and check n8n's breaking-changes changelog before upgrading; n8n releases a new minor version most weeks.\"}},{\"@type\":\"Question\",\"name\":\"Is self-hosted n8n secure enough for business data?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Self-hosting gives you control over where n8n stores workflow definitions, credentials, and execution data. However, connected services still receive any data your workflows send to them, and securing the server remains your responsibility. Securing a self-hosted instance requires HTTPS via a reverse proxy, a firewall, Docker network isolation, strong authentication with 2FA, regular updates, and tested backups.\"}}]},{\"@type\":\"HowTo\",\"name\":\"How to Set Up n8n on a VPS\",\"description\":\"Deploy self-hosted n8n using Docker Compose on an Ubuntu VPS with PostgreSQL and a Caddy reverse proxy, including backups and a restore test.\",\"tool\":[{\"@type\":\"HowToTool\",\"name\":\"VPS with Ubuntu 22.04 or newer\"},{\"@type\":\"HowToTool\",\"name\":\"Domain name you can point at the server\"},{\"@type\":\"HowToTool\",\"name\":\"SSH terminal access\"}],\"step\":[{\"@type\":\"HowToStep\",\"position\":1,\"name\":\"Point your domain at the server\",\"text\":\"Create a DNS A record for a dedicated subdomain pointing at your server's IP address.\"},{\"@type\":\"HowToStep\",\"position\":2,\"name\":\"Harden SSH access\",\"text\":\"Generate an ed25519 key pair, copy it to the server with ssh-copy-id, then disable password and root SSH logins in a 00-hardening.conf drop-in, testing the config with sshd -t and confirming the effective settings with sshd -T before restarting.\"},{\"@type\":\"HowToStep\",\"position\":3,\"name\":\"Turn on the firewall\",\"text\":\"Allow ports 22, 80, and 443 with UFW, allowing SSH before enabling the firewall so you aren't locked out.\"},{\"@type\":\"HowToStep\",\"position\":4,\"name\":\"Install Docker and Docker Compose\",\"text\":\"Install Docker Engine and the Compose plugin from Docker's official apt repository, then verify with hello-world.\"},{\"@type\":\"HowToStep\",\"position\":5,\"name\":\"Create the project directory and secrets\",\"text\":\"Create \/opt\/n8n-compose, generate an encryption key with openssl rand -hex 32, and store it with a database password in a .env file protected with chmod 600.\"},{\"@type\":\"HowToStep\",\"position\":6,\"name\":\"Write the Docker Compose file\",\"text\":\"Define three services \u2014 Caddy, n8n pinned to a specific version, and PostgreSQL with a healthcheck \u2014 publishing host ports only for Caddy.\"},{\"@type\":\"HowToStep\",\"position\":7,\"name\":\"Write the Caddyfile\",\"text\":\"A two-line Caddyfile reverse-proxies your domain to n8n:5678; Caddy obtains and renews a publicly trusted certificate automatically.\"},{\"@type\":\"HowToStep\",\"position\":8,\"name\":\"Launch and verify\",\"text\":\"Run docker compose up -d, then check the instance with curl -fsS -o \/dev\/null -w '%{http_code}' against your domain and create the owner account.\"},{\"@type\":\"HowToStep\",\"position\":9,\"name\":\"Update n8n deliberately\",\"text\":\"Check the breaking-changes changelog, edit the pinned version tag, then pull and restart.\"},{\"@type\":\"HowToStep\",\"position\":10,\"name\":\"Schedule backups\",\"text\":\"A root-owned script dumps the PostgreSQL database and archives the n8n_data volume daily via root's crontab, keeping 30 days; copy backups, the .env file, and config files off the server.\"},{\"@type\":\"HowToStep\",\"position\":11,\"name\":\"Test a restore on a scratch VPS\",\"text\":\"On a fresh scratch VPS, restore the volume and database, unpublish all workflows with n8n's CLI so restored triggers don't fire, then start the stack and verify.\"}]},{\"@type\":\"SoftwareApplication\",\"name\":\"n8n\",\"applicationCategory\":\"BusinessApplication\",\"operatingSystem\":\"Linux\",\"description\":\"A fair-code workflow automation platform with 400+ integrations for connecting apps, moving data, and building complex automations through a visual editor.\",\"url\":\"https:\/\/github.com\/n8n-io\/n8n\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\",\"description\":\"The self-hosted Community edition has no n8n licensing or execution fees for permitted uses such as internal business automation; you still pay for your own server infrastructure.\"},\"softwareVersion\":\"2.36.7\",\"author\":{\"@type\":\"Organization\",\"name\":\"n8n GmbH\",\"url\":\"https:\/\/n8n.io\"}}]}<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Self-hosting n8n costs $4\u201310\/month for unlimited workflow executions. Learn server specs, Docker Compose setup, security, and when self-hosted beats n8n Cloud.<\/p>\n","protected":false},"author":2,"featured_media":81962,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_yoast_wpseo_opengraph-title":"Self-Hosted n8n: How to Run n8n on Your Own Server","_yoast_wpseo_opengraph-description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","_yoast_wpseo_twitter-title":"Self-Hosted n8n: How to Run n8n on Your Own Server","_yoast_wpseo_twitter-description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","toc_headlines":"[[\"h-what-is-n8n-and-why-are-people-self-hosting-it\",\"What Is n8n and Why Are People Self-Hosting It?\"],[\"h-how-much-does-self-hosting-n8n-cost\",\"How Much Does Self-Hosting n8n Cost?\"],[\"h-what-server-specs-does-n8n-need\",\"What Server Specs Does n8n Need?\"],[\"h-which-vps-should-you-choose-for-self-hosted-n8n\",\"Which VPS Should You Choose for Self-Hosted n8n?\"],[\"h-how-do-you-set-up-n8n-on-a-vps\",\"How Do You Set Up n8n on a VPS?\"],[\"h-how-do-you-keep-a-self-hosted-n8n-instance-secure\",\"How Do You Keep a Self-Hosted n8n Instance Secure?\"],[\"h-what-are-the-trade-offs-of-self-hosting-vs-n8n-cloud\",\"What Are the Trade-Offs of Self-Hosting vs. n8n Cloud?\"],[\"h-making-the-final-call\",\"Making the Final Call\"],[\"h-frequently-asked-questions-about-self-hosting-n8n\",\"Frequently Asked Questions About Self-Hosting n8n\"]]","hide_toc":false,"show_updated_at":"1","footnotes":""},"categories":[14839,807],"tags":[],"class_list":["post-83819","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-vps-hosting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Self-Hosted n8n: How to Run n8n on Your Own Server<\/title>\n<meta name=\"description\" content=\"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Self-Hosted n8n: How to Run n8n on Your Own Server\" \/>\n<meta property=\"og:description\" content=\"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/\" \/>\n<meta property=\"og:site_name\" content=\"DreamHost Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DreamHost\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-18T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-25T18:46:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220_x_628_ogimage_self_host_n8n.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Dallas Kashuba\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Self-Hosted n8n: How to Run n8n on Your Own Server\" \/>\n<meta name=\"twitter:description\" content=\"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/dallas\" \/>\n<meta name=\"twitter:site\" content=\"@dreamhost\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dallas Kashuba\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Self-Hosted n8n: How to Run n8n on Your Own Server","description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/","og_locale":"en_US","og_type":"article","og_title":"Self-Hosted n8n: How to Run n8n on Your Own Server","og_description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","og_url":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/","og_site_name":"DreamHost Blog","article_publisher":"https:\/\/www.facebook.com\/DreamHost\/","article_published_time":"2026-06-18T15:00:00+00:00","article_modified_time":"2026-08-25T18:46:09+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220_x_628_ogimage_self_host_n8n.webp","type":"image\/webp"}],"author":"Dallas Kashuba","twitter_card":"summary_large_image","twitter_title":"Self-Hosted n8n: How to Run n8n on Your Own Server","twitter_description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","twitter_creator":"@http:\/\/twitter.com\/dallas","twitter_site":"@dreamhost","twitter_misc":{"Written by":"Dallas Kashuba","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#article","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/"},"author":{"name":"Dallas Kashuba","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/418697d2a49f38f84e7051458118d483"},"headline":"Self-Hosted n8n: How to Run n8n on Your Own Server","datePublished":"2026-06-18T15:00:00+00:00","dateModified":"2026-08-25T18:46:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/"},"wordCount":5127,"publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460_x_1095_blog_hero_self_host_n8n.webp","articleSection":["AI","VPS Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/","url":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/","name":"Self-Hosted n8n: How to Run n8n on Your Own Server","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#primaryimage"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460_x_1095_blog_hero_self_host_n8n.webp","datePublished":"2026-06-18T15:00:00+00:00","dateModified":"2026-08-25T18:46:09+00:00","description":"Self-host n8n on a VPS with no execution quota. Follow our 11-step Docker Compose setup with Caddy, PostgreSQL, backups, security, and real costs.","breadcrumb":{"@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#primaryimage","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460_x_1095_blog_hero_self_host_n8n.webp","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460_x_1095_blog_hero_self_host_n8n.webp","width":1460,"height":1095,"caption":"How To Run n8n on Your Own Server"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dreamhost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Self-Hosted n8n: How to Run n8n on Your Own Server"}]},{"@type":"WebSite","@id":"https:\/\/www.dreamhost.com\/blog\/#website","url":"https:\/\/www.dreamhost.com\/blog\/","name":"DreamHost Blog","description":"","publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dreamhost.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dreamhost.com\/blog\/#organization","name":"DreamHost","url":"https:\/\/www.dreamhost.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","contentUrl":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","width":1200,"height":168,"caption":"DreamHost"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DreamHost\/","https:\/\/x.com\/dreamhost","https:\/\/www.instagram.com\/dreamhost\/","https:\/\/www.linkedin.com\/company\/dreamhost\/","https:\/\/www.youtube.com\/user\/dreamhostusa"]},{"@type":"Person","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/418697d2a49f38f84e7051458118d483","name":"Dallas Kashuba","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","caption":"Dallas Kashuba"},"description":"Dallas Kashuba co-founded DreamHost while attending Harvey Mudd College and has spent nearly three decades building infrastructure at scale. Today he serves as an advisor, board member, and investor for various tech startups, with a consistent focus on user privacy, open source, and data portability. When he's not thinking about the Open Web, he's probably making music. Follow Dallas on X.","sameAs":["http:\/\/www.idallas.com\/","https:\/\/x.com\/http:\/\/twitter.com\/dallas"],"url":"https:\/\/www.dreamhost.com\/blog\/author\/dallas\/"}]}},"lang":"en","translations":{"en":83819,"es":82128,"uk":82113,"ru":82143,"pt":82098,"pl":82107,"de":82110,"nl":82104,"fr":82140,"it":82100},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/83819","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"version-history":[{"count":6,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/83819\/revisions"}],"predecessor-version":[{"id":88706,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/83819\/revisions\/88706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media\/81962"}],"wp:attachment":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media?parent=83819"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/categories?post=83819"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/tags?post=83819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}