{"id":81915,"date":"2026-06-18T07:00:00","date_gmt":"2026-06-18T14:00:00","guid":{"rendered":"https:\/\/dhblog.dream.press\/blog\/?p=81915"},"modified":"2026-06-18T07:00:15","modified_gmt":"2026-06-18T14:00:15","slug":"self-host-supabase","status":"publish","type":"post","link":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/","title":{"rendered":"How To Self-Host Supabase on a VPS"},"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\"><a href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/supabase\/\" target=\"_blank\" rel=\"noreferrer noopener\">Self-hosting Supabase<\/a> means running a 12-container stack on a virtual private server (VPS) using Docker Compose. You get predictable costs ($12\u2013$25\/month), full data ownership, and no usage overages, but you give up automated backups, dashboard logging, and managed email in exchange. Plan on 8 GB RAM for a production deployment and about one to two hours a month for routine maintenance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not ready to manage everything manually? Tools like Coolify and Dokploy can handle the stack for you with less overhead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DreamHost, a leading web hosting provider, offers <a href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\" target=\"_blank\" rel=\"noreferrer noopener\">self-managed VPS plans<\/a> with NVMe SSD storage and full root access, a good fit for self-hosted backends like Supabase.<\/p>\n\n\n\t<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ve been using Supabase Cloud for a few months, and the bill keeps creeping up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every extra bit of database egress adds a line item. Every 10,000 monthly active users pushes you closer to an overage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Pro plan that started at $25 a month now looks more like $70.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Somewhere between the pricing page and your actual invoice, the economics stopped feeling like a steal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting is the obvious alternative, but &#8220;obvious&#8221; is doing a lot of work there. Supabase isn&#8217;t a single binary you drop on a server. It&#8217;s a full backend stack \u2014 a Postgres database, an authentication service, a REST API, real-time subscriptions, storage, edge functions, and a dashboard \u2014 all wired together and running as a small fleet of <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/what-is-docker\/\">Docker containers<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Running that fleet on your own server costs between <strong>$12 and $25 per month<\/strong> for a VPS with enough RAM to hold everything in memory. That&#8217;s <em>two streaming subscriptions<\/em> a month for a backend that won&#8217;t bill you extra when traffic spikes.<\/p>\n\n\n\n<h2 id=\"h-what-is-supabase-and-why-are-people-self-hosting-it\" class=\"wp-block-heading\">What Is Supabase, and Why Are People Self-Hosting It?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase is an open-source Backend as a Service (BaaS) platform that packages a Postgres database, authentication, a REST API, realtime subscriptions, storage, and edge functions into a single deployment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s the Firebase alternative that runs on your own infrastructure if you want it to. The GitHub repository has crossed <a target=\"_blank\" href=\"https:\/\/github.com\/supabase\/supabase\">100,000 stars<\/a> as of May 2026, and the platform powers backends for enterprises like Mozilla, PwC, Johnson &amp; Johnson, and 1Password.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The question is whether you want to own the operational work Supabase Cloud handles for you or pay someone else to do it. We&#8217;re talking backups, logs, email delivery, and updates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">People <a href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/supabase\/\" target=\"_blank\" rel=\"noreferrer noopener\">self-host Supabase<\/a> for three reasons:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>They want predictable costs that don&#8217;t scale with usage.<\/li>\n\n\n\n<li>They want their data on infrastructure they control.&nbsp;<\/li>\n\n\n\n<li>They want out of the vendor lock-in trap that made Firebase so painful to leave.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase itself is refreshingly candid about who should and shouldn&#8217;t self-host. The <a target=\"_blank\" href=\"https:\/\/supabase.com\/docs\/guides\/self-hosting\">official self-hosting docs<\/a> say it plainly: &#8220;Self-hosted Supabase is community-supported. You won&#8217;t receive the same level of official support as Supabase Cloud customers.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Translation: If something breaks at 2 AM, you&#8217;re on your own.<\/p>\n\n\n\n<h3 id=\"h-what-supabase-actually-gives-you-out-of-the-box\" class=\"wp-block-heading\">What Supabase Actually Gives You Out of the Box<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1295\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase.webp\" alt=\"Supabase stack showing core services: Postgres, REST API, auth, realtime, storage, functions, and API gateway.\" class=\"wp-image-81918 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-300x243.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-1024x829.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-768x622.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-1536x1243.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-600x486.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-1200x971.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-730x591.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-1460x1182.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-784x635.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-1568x1269.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_what_runs_inside_supabase-877x710.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\/1295;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If you thought Supabase was just \u201cPostgres with a REST API,&#8221; it&#8217;s not. The self-hosted stack runs <strong>about 12 containers<\/strong> in parallel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The parts you\u2019ll touch most often are pretty straightforward:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Postgres.<\/strong> The database at the core of everything. Supabase uses a modern <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/postgresql-vs-mysql\/\">PostgreSQL<\/a> build with extensions for auth, realtime, and full-text search.<\/li>\n\n\n\n<li><strong>PostgREST.<\/strong> Auto-generates a REST API from your Postgres schema. A table becomes an endpoint, and you don\u2019t write any backend code to make that happen.<\/li>\n\n\n\n<li><strong>Auth (formerly GoTrue).<\/strong> Handles signups, logins, password resets, OAuth, and JWT issuance.<\/li>\n\n\n\n<li><strong>Realtime.<\/strong> Pushes database changes to connected clients over WebSockets.<\/li>\n\n\n\n<li><strong>Storage.<\/strong> S3-compatible object storage with access control tied to your database.<\/li>\n\n\n\n<li><strong>Edge Functions.<\/strong> Deno-based serverless functions that run close to your users.<\/li>\n\n\n\n<li><strong>Supabase Studio.<\/strong> The dashboard where you browse tables, run SQL, and manage auth users.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You also get Kong as the API gateway, imgproxy for image handling, Supavisor for connection pooling, and Logflare for analytics. Put it all together, and you\u2019re looking at a full backend stack, not a simple app.<\/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-it-cost-to-self-host-supabase\" class=\"wp-block-heading\">How Much Does It Cost to Self-Host Supabase?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Supabase on a VPS costs <strong>$12\u2013$25 per month<\/strong>, covering the server, storage, and bandwidth. The Supabase software itself is free.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pull up your last Supabase Cloud invoice for a second. The line item that sneaks up on people isn&#8217;t the base $25. It&#8217;s database egress and additional storage, which the Pro plan meters separately (<a target=\"_blank\" href=\"https:\/\/www.supascale.app\/blog\/the-true-cost-of-selfhosting-supabase-a-breakdown\">Supascale&#8217;s 2026 cost breakdown<\/a> walks through the line items).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compare that to <a href=\"https:\/\/supabase.com\/pricing\" target=\"_blank\">Supabase Cloud<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Plan<\/strong><\/th><th><strong>Base Cost<\/strong><\/th><th><strong>What You Get<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Free<\/td><td>$0<\/td><td>500 MB database<br>50K monthly active users<br>1 GB storage<br>Pauses after 7 days of inactivity<\/td><\/tr><tr><td>Pro<\/td><td>$25\/month<\/td><td>8 GB database<br>100K monthly active users<br>100 GB storage<br>250 GB egress<\/td><\/tr><tr><td>Team<\/td><td>$599\/month<\/td><td>Priority support<br>Single Sign-On (SSO)<br>Audit logs<br>Usage-based scaling<\/td><\/tr><tr><td>Self-hosted VPS<\/td><td>$12-$25\/month<\/td><td>Unlimited (bound only by server capacity)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The base Pro price looks comparable, but real-world usage pushes it higher fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supascale&#8217;s analysis shows most small-to-medium production apps land at $100\u2013$200\/month on Pro once compute add-ons and usage overages factor in \u2014 Supabase&#8217;s compute tiers alone run from $10\/month up to $3,730\/month for the 16XL instance. Apps with 100K\u2013200K monthly active users can push well above that, and at 500K MAUs bills can reach $1,000\u2013$2,000\/month.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Free tier is free \u2014 until you try to use it for production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Projects pause automatically after <strong>seven days of inactivity<\/strong>, which means your staging environment dies every week and your side projects break every time you take a vacation. According to <a target=\"_blank\" href=\"https:\/\/uibakery.io\/blog\/supabase-pricing\">UI Bakery&#8217;s 2026 pricing breakdown<\/a>, this is the most common reason people leave the Free plan sooner than expected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting flips the equation. Your costs stay tied to your infrastructure, not your usage. Running 50,000 MAUs costs the same as running 500,000, limited only by what your VPS can handle. No egress fees, no storage overages, no compute add-ons.<\/p>\n\n\n\n<h3 id=\"h-self-hosting-isn-t-just-a-vps-bill\" class=\"wp-block-heading\">Self-Hosting Isn&#8217;t Just a VPS Bill<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The VPS bill isn&#8217;t the only cost to self-host. You\u2019ll also be spending in other ways:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Your time.<\/strong> Plan on one to two hours per month for routine maintenance, such as security updates, Docker image pulls, checking logs, and verifying backups. Allow more time if you add features or scale.<\/li>\n\n\n\n<li><strong>Email delivery.<\/strong> Supabase Cloud handles auth emails (e.g., password resets, magic links, email verification) as a managed service. Self-hosted doesn&#8217;t. You&#8217;ll need an SMTP provider like SendGrid, Mailgun, or AWS SES. Plan on $0-$30\/month depending on volume.<\/li>\n\n\n\n<li><strong>Object storage for files.<\/strong> The Storage service defaults to the local filesystem, which is <em>fine for testing and a ticking time bomb in production<\/em>. You&#8217;ll need S3-compatible object storage \u2014 AWS S3, Backblaze B2, Wasabi, or <a target=\"_blank\" href=\"https:\/\/help.dreamhost.com\/hc\/en-us\/articles\/214823108-DreamObjects-overview\">DreamHost&#8217;s DreamObjects<\/a> all work. Budget $5\u2013$20\/month for a small-to-mid production app.<\/li>\n\n\n\n<li><strong>Backup infrastructure.<\/strong> Self\u2011hosting doesn\u2019t come with automatic backups, so you\u2019ll need to set them up yourself. Write a <code>`simple pg_dump`<\/code> cron job and store the output somewhere reliable. Don\u2019t skip this part; your future self will thank you.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-what-server-specs-does-supabase-need\" class=\"wp-block-heading\">What Server Specs Does Supabase Need?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase is memory-hungry. Running 12 containers simultaneously, most of them database-adjacent, means RAM matters more than CPU. The practical minimum is <strong>4 GB<\/strong> for a development instance with optional services disabled. Production deployments want <strong>8 GB<\/strong> or more.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The reason is the container count, not any single service. Postgres wants shared buffers. PostgREST wants a connection pool. GoTrue needs a small footprint for the Go runtime. Realtime holds WebSocket connections open. Edge Runtime spins up V8 isolates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Individually, each service is modest. Combined, they add up fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you haven&#8217;t provisioned a VPS before, start with our <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/beginners-guide-vps\/\">beginner&#8217;s guide to VPS<\/a> before sizing your server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At DreamHost, our <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\">Self-Managed VPS<\/a> Stack 8 plan provides 8 GB of RAM with NVMe SSD storage and full root access, the right size for a standard Supabase deployment running all optional services.<\/p>\n\n\n\n<h3 id=\"h-what-vps-size-does-supabase-need\" class=\"wp-block-heading\">What VPS Size Does Supabase Need?<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Workload<\/strong><\/th><th><strong>RAM<\/strong><\/th><th><strong>CPU<\/strong><\/th><th><strong>Good For<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Dev \/ light<\/td><td>4 GB<\/td><td>2 cores<\/td><td>Testing, small side projects, Analytics and Realtime disabled<\/td><\/tr><tr><td>Production standard<\/td><td>8 GB<\/td><td>4 cores<\/td><td>Small SaaS apps, mobile app backends, all services enabled<\/td><\/tr><tr><td>Heavy<\/td><td>16 GB+<\/td><td>4-8 cores<\/td><td>Higher traffic, large Postgres workloads, Edge Functions at scale<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can also strip optional services from the Docker Compose file to shrink the footprint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t need real-time subscriptions? <em>Skip the Realtime container.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not using Edge Functions? <em>Remove the Edge Runtime.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analytics not critical? <em>Cut Logflare.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A stripped-down stack could fit more comfortably on a 4 GB VPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">NVMe storage matters more than you&#8217;d think. Postgres is constantly reading and writing, and SSD latency directly affects how fast queries run. Older SATA drives or spinning disks will slow you down long before the database gets interesting.<\/p>\n\n\n\n<h2 id=\"h-how-does-the-self-hosted-supabase-setup-work\" class=\"wp-block-heading\">How Does the Self-Hosted Supabase Setup Work?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"762\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack.webp\" alt=\"Five-step process to boot stack: provision VPS, install Docker, clone repo, generate secrets, run Docker Compose.\" class=\"wp-image-81919 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-300x143.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-1024x488.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-768x366.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-1536x732.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-600x286.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-1200x572.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-730x348.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-1460x695.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-784x373.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-1568x747.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_five_steps_to_boot_the_stack-877x418.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\/762;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The full deployment is about five steps and takes one to two hours if you&#8217;re comfortable in a terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what you need to do:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Provision a VPS<\/strong> with Ubuntu 22.04 or newer, 8 GB RAM, and SSH access.<\/li>\n\n\n\n<li><strong>Install <\/strong><a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/what-is-docker\/\"><strong>Docker<\/strong><\/a><strong> and Docker Compose<\/strong> on the server.<\/li>\n\n\n\n<li><strong>Clone the Supabase repository<\/strong> and copy the example environment file: <code>`git clone https:\/\/github.com\/supabase\/supabase &amp;&amp; cp supabase\/docker\/.env.example supabase\/docker\/.env`<\/code><\/li>\n\n\n\n<li><strong>Generate and set secrets.<\/strong> Run Supabase&#8217;s <code>`generate-keys.sh`<\/code> script to produce your <code>JWT_SECRET<\/code>, <code>ANON_KEY<\/code>, and <code>SERVICE_ROLE_KEY<\/code>, then set <code>POSTGRES_PASSWORD<\/code> and dashboard credentials in the .env file.<\/li>\n\n\n\n<li><strong>Run <code>`docker compose up -d`<\/code><\/strong> from the docker directory, and the full stack boots.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll know it worked when <code>`docker compose ps`<\/code> shows every service in a <code>`running` <\/code>or <code>`healthy`<\/code> state, and <code>`curl http:\/\/localhost:8000\/rest\/v1\/`<\/code> returns a JSON response from PostgREST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If any container is in <code>`restarting`<\/code> or <code>`exited`<\/code>, check that container&#8217;s logs first. Postgres is the usual culprit, and the cause is usually a missing or malformed env var.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a target=\"_blank\" href=\"https:\/\/supabase.com\/docs\/guides\/self-hosting\/docker\">official Supabase Docker self-hosting docs<\/a> walk through every environment variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kong, the API gateway, sits in front of everything and handles routing. In production, you&#8217;ll typically put a reverse proxy (a server that sits between the internet and your application, handling SSL and routing) like Caddy or Nginx in front of Kong to terminate HTTPS and restrict dashboard access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Save your <code>JWT_SECRET<\/code>, <code>ANON_KEY<\/code>, and <code>SERVICE_ROLE_KEY<\/code> somewhere reliable the moment they&#8217;re generated. Losing them isn&#8217;t catastrophic because you can regenerate, but rotating forces every active user session to expire and every client app to get new keys.<\/p>\n\n\n\n<h3 id=\"h-what-you-ll-need-to-self-host-supabase\" class=\"wp-block-heading\">What You&#8217;ll Need to Self-Host Supabase<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A VPS running Ubuntu 22.04+ with at least 8 GB RAM and root\/SSH access<\/li>\n\n\n\n<li>A domain name pointed to your server&#8217;s IP<\/li>\n\n\n\n<li>Docker and Docker Compose installed<\/li>\n\n\n\n<li>An SMTP provider configured for auth emails (SendGrid, Mailgun, AWS SES)<\/li>\n\n\n\n<li>S3-compatible object storage for production file uploads (optional but recommended)<\/li>\n\n\n\n<li>Basic terminal comfort and about one to two hours<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-how-do-you-keep-a-self-hosted-supabase-instance-secure\" class=\"wp-block-heading\">How Do You Keep a Self-Hosted Supabase Instance Secure?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Supabase security lives on three pillars specific to the platform, plus the standard VPS hygiene.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1274\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database.webp\" alt=\"Three database security vulnerabilities: exposed JWT secret, unprotected tables, and super-admin key compromise access controls.\" class=\"wp-image-81920 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-300x239.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-1024x815.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-768x612.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-1536x1223.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-600x478.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-1200x956.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-730x581.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-1460x1163.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-784x624.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-1568x1249.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_three_things_that_can_expose_your_database-877x698.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\/1274;\" \/><\/figure>\n\n\n\n<h3 id=\"h-the-jwt-secret\" class=\"wp-block-heading\">The JWT Secret<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\" id=\"h-the-jwt-secret-every-authorization-token-that-supabase-issues-is-signed-with-your-jwt-secret-if-it-leaks-attackers-can-forge-tokens-that-impersonate-any-user\">Every authorization token that Supabase issues is signed with your <code>JWT_SECRET<\/code>. If it leaks, attackers can forge tokens that impersonate any user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a target=\"_blank\" href=\"https:\/\/supabase.com\/docs\/guides\/auth\/oauth-server\/token-security\">Supabase token security docs<\/a> explain how it works: &#8220;A shared secret that is in the hands of a malicious actor can be used to impersonate your users [and] give them access to privileged actions or data, and it is difficult to detect or identify when or how a shared secret has been given to a malicious actor.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treat the <code>JWT_SECRET<\/code> like a production database password because, functionally, that&#8217;s exactly what it is. Store it in a secrets manager, not a `.env` file in Git, and <em>never<\/em> in your frontend bundle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The recommended production path is <strong>asymmetric signing keys<\/strong> (RS256 or ECC). They&#8217;re harder to leak by accident than a shared secret, and Supabase supports both.<\/p>\n\n\n\n<h3 id=\"h-row-level-security\" class=\"wp-block-heading\">Row Level Security<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase&#8217;s PostgREST service exposes every table in your database as a REST endpoint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without Row Level Security policies on each table, every authenticated user can read and write every row. This is the single biggest self-hosting mistake new users make.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enable RLS on every table from day one, including the tables you think don&#8217;t need.<\/p>\n\n\n\n<h3 id=\"h-service-role-key\" class=\"wp-block-heading\">Service Role Key<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>SERVICE_ROLE_KEY<\/code> is a super-admin key that bypasses Row-Level Security entirely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s meant for backend-to-backend calls where you explicitly need to skip user-level permissions. The key must never appear in frontend code, public repos, or client app bundles. If it leaks, your entire database is exposed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond Supabase-specific concerns, standard server hardening applies. Enable a firewall that only exposes ports 22 (SSH), 80 (HTTP), and 443 (HTTPS). Run everything behind a reverse proxy with HTTPS. Restrict Supabase Studio to known IPs and keep the server patched. Our <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/cloud-security-tips\/\">cloud security tips<\/a> cover the general hardening checklist, so you want to have a look.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One last thing: rotating the JWT secret invalidates every active user session immediately. Plan a maintenance window, and <em>don&#8217;t<\/em> rotate on a Friday afternoon \u2014 or <em>you\u2019re gonna have a bad time<\/em>.<\/p>\n\n\n\n<h2 id=\"h-what-are-the-trade-offs-of-self-hosted-vs-supabase-cloud\" class=\"wp-block-heading\">What Are the Trade-Offs of Self-Hosted vs. Supabase Cloud?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Supabase and Supabase Cloud aren&#8217;t interchangeable. Each wins on different axes.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Feature<\/strong><\/th><th><strong>Self-Hosted<\/strong><\/th><th><strong>Supabase Cloud<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Monthly cost<\/td><td>$12-$25 VPS + add-ons<\/td><td>$25 base + usage overages<\/td><\/tr><tr><td>Scaling beyond the base<\/td><td>Bounded by your VPS<\/td><td>Automatic (for a price)<\/td><\/tr><tr><td>Automated backups<\/td><td>DIY (pg_dump cron)<\/td><td>Daily automated + PITR<\/td><\/tr><tr><td>Logs (PostgREST, Edge Functions)<\/td><td>DIY observability stack<\/td><td>Built into dashboard<\/td><\/tr><tr><td>Edge Functions editing<\/td><td>CLI only<\/td><td>In-dashboard editor<\/td><\/tr><tr><td>Email delivery<\/td><td>DIY SMTP provider<\/td><td>Managed<\/td><\/tr><tr><td>Support<\/td><td>Community (GitHub, Discord)<\/td><td>Paid tiers with SLA<\/td><\/tr><tr><td>Data location<\/td><td>Wherever you want<\/td><td>Supabase&#8217;s cloud regions<\/td><\/tr><tr><td>Compliance<\/td><td>You own it<\/td><td>Pro+ required<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/self-hosting\/\">Self-hosting<\/a> makes sense when predictable costs matter more than managed convenience, when you need data physically on infrastructure you control, or when you&#8217;re running multiple projects that would each cost $25+ per month on Cloud.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloud wins when ops capacity is scarce and when automated backups and SLA-backed uptime are non-negotiable. It\u2019s also a good choice when your team is small and the total cost of ownership math actually favors managed hosting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also a middle ground.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tools like <strong>Coolify, Dokploy, and Railway<\/strong> can deploy and manage Supabase on your VPS, handling updates, backups, and some observability without the full manual Docker Compose approach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Simply put, you get most of the self-hosted economics with less of the ops overhead. None of them match Cloud&#8217;s dashboard polish, but all of them cost less than Cloud at scale.<\/p>\n\n\n\n<h2 id=\"h-should-you-actually-self-host-supabase\" class=\"wp-block-heading\">Should You Actually Self-Host Supabase?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Supabase isn&#8217;t a cost decision as much as an <em>operational<\/em> one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The VPS is cheap. What you&#8217;re actually signing up for is owning the backups, the logs, and the auth email plumbing. For most small teams, that trade makes sense only when Cloud&#8217;s pricing starts to sting or when data residency stops being a nice\u2011to\u2011have and becomes a requirement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re not ready for the full manual setup, tools like Coolify and Dokploy sit in the middle. They&#8217;ll manage the stack on your VPS with less overhead than raw Docker Compose and at a lower cost than Cloud once you scale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Month one of self-hosting is the rough one. You\u2019ll tweak resource limits you didn\u2019t know existed, discover failure modes nobody documented, and write the runbook you wish someone else had handed you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Months two through 12 get quiet. You pull updates with Docker Compose, run a nightly <code>pg_dump<\/code> to S3, and your invoice stays flat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best way to find out which side of this you&#8217;re on: spin up a $12 VPS, run a non-production Supabase instance for a week, and let the experience make the call for you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The economics will tell you the rest.<\/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\/self-managed-vps\/' class='link-top' target='_blank' rel='noopener noreferrer'>\n\t\t<span>Self-Managed 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\/self-managed-vps\/\"\n                        class=\"btn btn--white-outline btn--sm btn--round\"\n                                    target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            >\n                            Explore Self-Managed VPS Plans                    <\/a>\n\n\t<\/div>\n<\/div>\n\n\n<h2 id=\"h-frequently-asked-questions-about-self-hosting-supabase\" class=\"wp-block-heading\">Frequently Asked Questions About Self-Hosting Supabase<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not sure if self\u2011hosting Supabase is the right move? Below are some questions most people ask before taking the leap.<\/p>\n\n\n\n<h3 id=\"h-is-self-hosted-supabase-really-free\" class=\"wp-block-heading\">Is self-hosted Supabase really free?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Supabase is free, <a href=\"https:\/\/www.dreamhost.com\/blog\/open-source-vs-proprietary\/\" target=\"_blank\">open-source software<\/a> licensed under Apache 2.0. Your actual costs are the VPS, an optional SMTP provider for auth emails, and optional S3-compatible storage for production file uploads. Budget roughly $15 to $50 per month all-in for a small production deployment.<\/p>\n\n\n\n<h3 id=\"h-what-server-do-i-need-to-self-host-supabase\" class=\"wp-block-heading\">What server do I need to self-host Supabase?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The recommended production spec is <strong>8 GB of RAM, 4 CPU cores, and NVMe SSD storage<\/strong>. The full Supabase stack runs about a dozen containers, and most of them hold working memory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can run a minimal development instance on 4 GB if you disable Analytics, Realtime, and Edge Runtime in your Docker Compose file. <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\">DreamHost&#8217;s Self-Managed VPS<\/a> Stack 8 plan provides 8 GB RAM with full root access; see our <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/\">VPS hosting<\/a> plans for the full range.<\/p>\n\n\n\n<h3 id=\"h-what-features-are-missing-from-self-hosted-supabase\" class=\"wp-block-heading\">What features are missing from self-hosted Supabase?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The biggest gaps are automated database backups, point-in-time recovery, dashboard-based edge function editing, unified logging for PostgREST and Edge Functions, and managed email delivery. You can build replacements for all of them (e.g., <code>`pg_dump`<\/code> cron jobs, a custom observability stack, an SMTP provider), but nothing is out of the box. The Supabase Studio dashboard works on self-hosted, but the Cloud dashboard has more polish and newer features first.<\/p>\n\n\n\n<h3 id=\"h-how-do-i-update-a-self-hosted-supabase-instance\" class=\"wp-block-heading\">How do I update a self-hosted Supabase instance?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run <code>`docker compose pull`<\/code> to fetch the latest images, then <code>`docker compose up -d`<\/code> to restart with the new versions. The whole update takes about five minutes on a healthy instance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Back up your Postgres database with <code>`pg_dump`<\/code> before any major version update, pin your Docker images to specific version tags in production, and read the Supabase release notes for breaking changes. Auth and storage services occasionally require migration steps.<\/p>\n\n\n\n<h3 id=\"h-can-i-migrate-from-supabase-cloud-to-self-hosted\" class=\"wp-block-heading\">Can I migrate from Supabase Cloud to self-hosted?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, but it takes more than a database export. The Postgres data migrates with <code>`pg_dump`<\/code> from Cloud and <code>`pg_restore`<\/code> on self-hosted. Auth users, storage objects, and edge functions each have their own migration paths.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plan for a few hours of work for a small project and longer for complex schemas.<\/p>\n\n\n<p><script type=\"application\/ld+json\"><br \/>\n{<br \/>\n  \"@context\": \"https:\/\/schema.org\",<br \/>\n  \"@graph\": [<br \/>\n    {<br \/>\n      \"@type\": \"HowTo\",<br \/>\n      \"name\": \"How To Self-Host Supabase on a VPS\",<br \/>\n      \"step\": [<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Provision a VPS\",<br \/>\n          \"text\": \"Provision a VPS with Ubuntu 22.04 or newer, 8 GB RAM, and SSH access.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Install Docker and Docker Compose\",<br \/>\n          \"text\": \"Install Docker and Docker Compose on the server.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Clone the Supabase repository\",<br \/>\n          \"text\": \"Clone the Supabase repository and copy the example environment file: git clone https:\/\/github.com\/supabase\/supabase && cp supabase\/docker\/.env.example supabase\/docker\/.env\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Generate and set secrets\",<br \/>\n          \"text\": \"Generate and set secrets. Run Supabase's `sh utils\/generate-keys.sh` script from the docker directory to produce your JWT_SECRET, ANON_KEY, and SERVICE_ROLE_KEY, then set POSTGRES_PASSWORD and dashboard credentials in the .env file.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Boot the stack\",<br \/>\n          \"text\": \"Run docker compose up -d from the docker directory, and the full stack boots.\"<br \/>\n        }<br \/>\n      ]<br \/>\n    },<br \/>\n    {<br \/>\n      \"@type\": \"FAQPage\",<br \/>\n      \"mainEntity\": [<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Is self-hosted Supabase really free?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Self-hosted Supabase is free, open-source software licensed under Apache 2.0. Your actual costs are the VPS, an optional SMTP provider for auth emails, and optional S3-compatible storage for production file uploads. Budget roughly $15 to $50 per month all-in for a small production deployment.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"What server do I need to self-host Supabase?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"The recommended production spec is 8 GB of RAM, 4 CPU cores, and NVMe SSD storage. The full Supabase stack runs about 12 containers, and most of them hold working memory.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"What features are missing from self-hosted Supabase?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"The biggest gaps are automated database backups, point-in-time recovery, dashboard-based edge function editing, unified logging for PostgREST and Edge Functions, and managed email delivery.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"How do I update a self-hosted Supabase instance?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Run docker compose pull to fetch the latest images, then docker compose up -d to restart with the new versions. The whole update takes about five minutes on a healthy instance.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Can I migrate from Supabase Cloud to self-hosted?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes, but it takes more than a database export. The Postgres data migrates with pg_dump from Cloud and pg_restore on self-hosted.\"<br \/>\n          }<br \/>\n        }<br \/>\n      ]<br \/>\n    }<br \/>\n  ]<br \/>\n}<br \/>\n<\/script><\/p>","protected":false},"excerpt":{"rendered":"<p>Self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. Here&#8217;s what it costs, what you give up, and how to tell if it&#8217;s the right call.<\/p>\n","protected":false},"author":2,"featured_media":81917,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"toc_headlines":"[[\"h-what-is-supabase-and-why-are-people-self-hosting-it\",\"What Is Supabase, and Why Are People Self-Hosting It?\"],[\"h-how-much-does-it-cost-to-self-host-supabase\",\"How Much Does It Cost to Self-Host Supabase?\"],[\"h-what-server-specs-does-supabase-need\",\"What Server Specs Does Supabase Need?\"],[\"h-how-does-the-self-hosted-supabase-setup-work\",\"How Does the Self-Hosted Supabase Setup Work?\"],[\"h-how-do-you-keep-a-self-hosted-supabase-instance-secure\",\"How Do You Keep a Self-Hosted Supabase Instance Secure?\"],[\"h-what-are-the-trade-offs-of-self-hosted-vs-supabase-cloud\",\"What Are the Trade-Offs of Self-Hosted vs. Supabase Cloud?\"],[\"h-should-you-actually-self-host-supabase\",\"Should You Actually Self-Host Supabase?\"],[\"h-frequently-asked-questions-about-self-hosting-supabase\",\"Frequently Asked Questions About Self-Hosting Supabase\"]]","hide_toc":false,"footnotes":""},"categories":[550,804],"tags":[],"class_list":["post-81915","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-web-hosting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How To Self-Host Supabase on a VPS - DreamHost<\/title>\n<meta name=\"description\" content=\"Self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. Here&#039;s what it costs, what you give up, and how to tell if it&#039;s the right call.\" \/>\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\/self-host-supabase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Self-Host Supabase on a VPS for $12\u2013$25\/Month\" \/>\n<meta property=\"og:description\" content=\"Learn how to self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. This article covers what you give up and how to tell if self-hosting is the right call.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/\" \/>\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-18T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-18T14:00:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220x628_ogimage_how_to_self_host_supabase_on_a_vps.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-Host Supabase on a VPS for $12\u2013$25\/Month\" \/>\n<meta name=\"twitter:description\" content=\"Learn how to self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. This article covers what you give up and how to tell if self-hosting is the right call.\" \/>\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=\"14 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How To Self-Host Supabase on a VPS - DreamHost","description":"Self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. Here's what it costs, what you give up, and how to tell if it's the right call.","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\/self-host-supabase\/","og_locale":"en_US","og_type":"article","og_title":"Self-Host Supabase on a VPS for $12\u2013$25\/Month","og_description":"Learn how to self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. This article covers what you give up and how to tell if self-hosting is the right call.","og_url":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/","og_site_name":"DreamHost Blog","article_publisher":"https:\/\/www.facebook.com\/DreamHost\/","article_published_time":"2026-06-18T14:00:00+00:00","article_modified_time":"2026-06-18T14:00:15+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220x628_ogimage_how_to_self_host_supabase_on_a_vps.webp","type":"image\/webp"}],"author":"Dallas Kashuba","twitter_card":"summary_large_image","twitter_title":"Self-Host Supabase on a VPS for $12\u2013$25\/Month","twitter_description":"Learn how to self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. This article covers what you give up and how to tell if self-hosting is the right call.","twitter_creator":"@http:\/\/twitter.com\/dallas","twitter_site":"@dreamhost","twitter_misc":{"Written by":"Dallas Kashuba","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#article","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/"},"author":{"name":"Dallas Kashuba","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/f6a12ad459538e8e418cf31b8b603814"},"headline":"How To Self-Host Supabase on a VPS","datePublished":"2026-06-18T14:00:00+00:00","dateModified":"2026-06-18T14:00:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/"},"wordCount":2895,"publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_how_to_self_host_supabase_on_a_vps.webp","articleSection":["Tutorials","Web Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/","url":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/","name":"How To Self-Host Supabase on a VPS - DreamHost","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#primaryimage"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_how_to_self_host_supabase_on_a_vps.webp","datePublished":"2026-06-18T14:00:00+00:00","dateModified":"2026-06-18T14:00:15+00:00","description":"Self-host Supabase on a VPS for $12\u201325 per month and skip usage overages. Here's what it costs, what you give up, and how to tell if it's the right call.","breadcrumb":{"@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#primaryimage","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_how_to_self_host_supabase_on_a_vps.webp","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_how_to_self_host_supabase_on_a_vps.webp","width":1460,"height":1095,"caption":"How To Self-Host Supabase on a VPS"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dreamhost.com\/blog\/self-host-supabase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dreamhost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How To Self-Host Supabase on a VPS"}]},{"@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\/f6a12ad459538e8e418cf31b8b603814","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"},"sameAs":["http:\/\/www.idallas.com\/","https:\/\/x.com\/http:\/\/twitter.com\/dallas"],"url":"https:\/\/www.dreamhost.com\/blog\/author\/dallas\/"}]}},"lang":"en","translations":{"en":81915},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81915","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"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/comments?post=81915"}],"version-history":[{"count":6,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81915\/revisions"}],"predecessor-version":[{"id":81931,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81915\/revisions\/81931"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media\/81917"}],"wp:attachment":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media?parent=81915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/categories?post=81915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/tags?post=81915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}