<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abhishek Jaiswal</title>
    <description>The latest articles on DEV Community by Abhishek Jaiswal (@abhijais1).</description>
    <link>https://dev.to/abhijais1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3894003%2F29bb8169-05aa-4f30-8373-408b8a5ebb97.jpg</url>
      <title>DEV Community: Abhishek Jaiswal</title>
      <link>https://dev.to/abhijais1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhijais1"/>
    <language>en</language>
    <item>
      <title>Where to host Uptime Kuma in 2026: five options, priced</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Tue, 03 Nov 2026 10:23:39 +0000</pubDate>
      <link>https://dev.to/abhijais1/where-to-host-uptime-kuma-in-2026-five-options-priced-c6j</link>
      <guid>https://dev.to/abhijais1/where-to-host-uptime-kuma-in-2026-five-options-priced-c6j</guid>
      <description>&lt;p&gt;Uptime Kuma runs well anywhere that gives it an always-on container and a disk that survives a restart. In 2026 the practical choices are Ownkube (about $5 a month, one click), Fly.io (from about $2.34), Railway (from the $5 Hobby fee), Render (from $7.25) and a VPS you run yourself.&lt;/p&gt;

&lt;p&gt;Heroku and Replit are out: Uptime Kuma's own README lists them as unsupported, because their filesystems don't keep the data file.&lt;/p&gt;

&lt;p&gt;Wherever you run it, keep it off the platform your apps run on, since a monitor that goes down with your apps can't tell you they are down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our picks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One click, HTTPS and a persistent volume set up for you, on a prepaid bill&lt;/td&gt;
&lt;td&gt;Ownkube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The lowest line item and you are fine writing a &lt;code&gt;fly.toml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A template deploy on a platform you already use&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A flat price and you already run services on Render&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full control, and you already patch a server&lt;/td&gt;
&lt;td&gt;Your own VPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No server at all&lt;/td&gt;
&lt;td&gt;A hosted monitor such as UptimeRobot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Uptime Kuma needs from a host
&lt;/h2&gt;

&lt;p&gt;Uptime Kuma is a single Node.js process. It stores monitors, check history and settings in a SQLite file, so the host needs four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A disk that survives restarts and redeploys. Uptime Kuma's README warns that network file systems such as NFS are not supported, so use a local or block volume.&lt;/li&gt;
&lt;li&gt;A process that never sleeps. Free tiers that spin down on idle stop your monitors without telling you.&lt;/li&gt;
&lt;li&gt;One instance. SQLite allows one writer, so you run one copy, not a scaled group.&lt;/li&gt;
&lt;li&gt;A public hostname with HTTPS, for the dashboard and for status pages your users will open.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The options at a glance
&lt;/h2&gt;

&lt;p&gt;Prices are approximate list prices from each provider's pricing page, as of November 2026, for one small instance with a 1 to 2 GB volume.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Disk&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Who patches the server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ownkube.io/templates/uptime-kuma" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;About $5, metered per minute&lt;/td&gt;
&lt;td&gt;2 GiB volume, no storage charge&lt;/td&gt;
&lt;td&gt;One click from the Marketplace&lt;/td&gt;
&lt;td&gt;Ownkube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fly.io/pricing/" rel="noopener noreferrer"&gt;Fly.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;About $2.34 (256 MB Machine plus 1 GB volume)&lt;/td&gt;
&lt;td&gt;Fly Volume, $0.15 per GB&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fly launch&lt;/code&gt; and a &lt;code&gt;fly.toml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://railway.com/pricing" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$5 Hobby fee, which includes $5 of usage&lt;/td&gt;
&lt;td&gt;Volume, about $0.15 per GB&lt;/td&gt;
&lt;td&gt;Template&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://render.com/pricing" rel="noopener noreferrer"&gt;Render&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$7.25 (Starter instance plus 1 GB disk)&lt;/td&gt;
&lt;td&gt;Persistent disk, $0.25 per GB&lt;/td&gt;
&lt;td&gt;Docker image service&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your own VPS&lt;/td&gt;
&lt;td&gt;The server, plus your time&lt;/td&gt;
&lt;td&gt;Local disk&lt;/td&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The options, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ownkube
&lt;/h3&gt;

&lt;p&gt;Uptime Kuma is in the Ownkube Marketplace. One deploy creates the app from the official image, mounts a 2 GiB persistent volume for the SQLite file, and gives it an &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname with automatic HTTPS. There is no Postgres to pay for, since Uptime Kuma doesn't use one.&lt;/p&gt;

&lt;p&gt;It costs about $5 a month: CPU and memory billed per minute, and the volume carries no storage charge. It runs in Mumbai or Germany. You can add your own domain for the status page.&lt;/p&gt;

&lt;p&gt;Finish setup right after deploy, since the first person to open the dashboard creates the admin account. And leave sleep off: a sleeping app runs no checks, so your monitors would stop until someone opened the dashboard.&lt;/p&gt;

&lt;p&gt;Billing is a prepaid wallet. Pay as you go starts with a $5 top-up, and unused credit never expires. See the &lt;a href="https://ownkube.io/templates/uptime-kuma" rel="noopener noreferrer"&gt;Uptime Kuma template&lt;/a&gt;, or &lt;a href="https://app.ownkube.io/dashboard?deploy=uptime-kuma" rel="noopener noreferrer"&gt;deploy it now&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fly.io
&lt;/h3&gt;

&lt;p&gt;Fly.io has the cheapest line here. A &lt;code&gt;shared-cpu-1x&lt;/code&gt; Machine with 256 MB is $2.19 a month running all month, and a 1 GB volume adds $0.15. You write a &lt;code&gt;fly.toml&lt;/code&gt; that mounts the volume at &lt;code&gt;/app/data&lt;/code&gt;, then run &lt;code&gt;fly deploy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A large set of monitors needs more memory than 256 MB, which moves the line up. Volumes bill on provisioned size even while the Machine is stopped. Fly.io also runs in many regions, which helps with the placement question below. See &lt;a href="https://ownkube.io/compare/fly-io-pricing-explained" rel="noopener noreferrer"&gt;Fly.io pricing explained&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Railway
&lt;/h3&gt;

&lt;p&gt;Railway has Uptime Kuma templates that attach a volume for you. The Hobby plan is $5 a month and includes $5 of usage. Memory bills at about $10 per GB a month, CPU at about $20 per vCPU a month, and volumes at about $0.15 per GB.&lt;/p&gt;

&lt;p&gt;A small instance can fit inside the included usage. A heavier one pushes past it, so check the usage page after the first week. See &lt;a href="https://ownkube.io/compare/railway-pricing-explained" rel="noopener noreferrer"&gt;Railway pricing explained&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render
&lt;/h3&gt;

&lt;p&gt;Render can run the official Docker image with a persistent disk. Disks need a paid instance, so the floor is a $7 Starter instance plus $0.25 per GB of disk.&lt;/p&gt;

&lt;p&gt;Render's docs note two catches. A service with a disk loses zero-downtime deploys, so each deploy briefly takes the monitor offline. It also can't scale past one instance, which doesn't matter for SQLite. See &lt;a href="https://ownkube.io/compare/render-pricing-explained" rel="noopener noreferrer"&gt;Render pricing explained&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your own VPS
&lt;/h3&gt;

&lt;p&gt;Uptime Kuma's own install guide is Docker Compose on a server, and it is the most common setup. You get full control and the lowest unit cost if you already run a box.&lt;/p&gt;

&lt;p&gt;You also own everything else: OS updates, the reverse proxy and certificates, firewall rules, disk backups, and noticing when the server itself has died, which a monitor running on that server can't do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put the monitor somewhere else
&lt;/h2&gt;

&lt;p&gt;If Uptime Kuma runs on the same platform, region or server as the apps it checks, an outage there takes the monitor down too. Your status page goes dark while users are looking for it, and no alert goes out.&lt;/p&gt;

&lt;p&gt;That holds for Ownkube as much as anyone. If your apps run on Ownkube in Germany, put Uptime Kuma on a different provider, or at least in Mumbai. If your apps run on Render or Fly.io, Ownkube is a reasonable separate home for the monitor.&lt;/p&gt;

&lt;p&gt;The same logic applies to alerts. Send them somewhere that doesn't depend on the monitored apps, such as email, Slack, Discord or Telegram, all of which Uptime Kuma supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to self-host Uptime Kuma
&lt;/h2&gt;

&lt;p&gt;If you only need a handful of HTTP checks and don't care about owning the data, a hosted monitor is less work. UptimeRobot's free plan covers 50 monitors at a 5-minute interval, with commercial use allowed. Its cheapest paid plan, Solo, checks every 60 seconds for $9 a month billed yearly.&lt;/p&gt;

&lt;p&gt;Self-hosting wins when you want 20-second checks without a per-monitor price, private TCP or keyword checks, branded status pages, or simply to keep the history yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick checklist before you choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm the data directory sits on a volume that survives a redeploy.&lt;/li&gt;
&lt;li&gt;Turn off any idle sleep or spin-down.&lt;/li&gt;
&lt;li&gt;Run one instance only.&lt;/li&gt;
&lt;li&gt;Put the monitor on a different provider or region from your apps.&lt;/li&gt;
&lt;li&gt;Decide how you will back up the data file.&lt;/li&gt;
&lt;li&gt;Send a test alert to every channel before you rely on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I run Uptime Kuma on Heroku?
&lt;/h3&gt;

&lt;p&gt;No. Uptime Kuma's README lists Heroku as unsupported. Heroku's filesystem is reset on every restart, so the SQLite file and all your monitors would be lost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Uptime Kuma run on a free tier?
&lt;/h3&gt;

&lt;p&gt;Not reliably. Free tiers that sleep stop the checks, and the ones that don't sleep usually have no persistent disk. Plan on a small paid instance with a volume.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much memory does Uptime Kuma need?
&lt;/h3&gt;

&lt;p&gt;Memory grows with the number of monitors and how often they check. Start small, watch the memory chart for the first week, and size up if it climbs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does Uptime Kuma cost on Ownkube?
&lt;/h3&gt;

&lt;p&gt;About $5 a month: its CPU and memory billed per minute, with the 2 GiB volume included at no storage charge. Pay as you go starts with a $5 top-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Ownkube is a good home for Uptime Kuma when you want it running in one click with HTTPS and a persistent volume, and you are not watching apps on Ownkube in the same region. It runs alongside the rest of the Marketplace, and the same wallet pays for your apps and databases too. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>monitoring</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>Hosting that redeploys on every GitHub push: five low-maintenance options in 2026</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Tue, 03 Nov 2026 10:23:38 +0000</pubDate>
      <link>https://dev.to/abhijais1/hosting-that-redeploys-on-every-github-push-five-low-maintenance-options-in-2026-14hl</link>
      <guid>https://dev.to/abhijais1/hosting-that-redeploys-on-every-github-push-five-low-maintenance-options-in-2026-14hl</guid>
      <description>&lt;p&gt;Ownkube, Render, Railway and Heroku all rebuild and redeploy your app on every push to a GitHub branch with no pipeline to write. Fly.io gets you there through a GitHub Actions workflow you keep yourself.&lt;/p&gt;

&lt;p&gt;What keeps maintenance low is everything around the push: whether a bad build stops itself, whether you hear about errors before users do, and whether the database backs itself up. We compare the five on those, then price a small backend (an API, a worker, an hourly job and Postgres) on three of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our picks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Push to deploy for the whole backend, with logs, metrics and alerts included and a prepaid bill&lt;/td&gt;
&lt;td&gt;Ownkube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed instance prices and deploys that wait for CI to pass&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The fastest setup and a preview environment for every pull request&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review apps and the add-on marketplace&lt;/td&gt;
&lt;td&gt;Heroku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apps close to users on several continents, and you don't mind owning a workflow file&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The five at a glance
&lt;/h2&gt;

&lt;p&gt;Prices are approximate list prices from each provider's pricing page, as of November 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Deploys on push&lt;/th&gt;
&lt;th&gt;Waits for CI&lt;/th&gt;
&lt;th&gt;Per-PR previews&lt;/th&gt;
&lt;th&gt;Workers and cron&lt;/th&gt;
&lt;th&gt;Postgres from&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ownkube.io/pricing" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Yes, GitHub and GitLab&lt;/td&gt;
&lt;td&gt;No, deploy from a branch CI merges into&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, both built in&lt;/td&gt;
&lt;td&gt;$4 a month plus $0.25 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://render.com/pricing" rel="noopener noreferrer"&gt;Render&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, both built in&lt;/td&gt;
&lt;td&gt;$6 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://railway.com/pricing" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, cron per service&lt;/td&gt;
&lt;td&gt;Metered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.heroku.com/pricing" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, review apps&lt;/td&gt;
&lt;td&gt;Worker dynos, Scheduler add-on&lt;/td&gt;
&lt;td&gt;$5 a month (1 GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fly.io/pricing/" rel="noopener noreferrer"&gt;Fly.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Through a GitHub Actions workflow&lt;/td&gt;
&lt;td&gt;Your workflow decides&lt;/td&gt;
&lt;td&gt;Through a GitHub Action&lt;/td&gt;
&lt;td&gt;Process groups, scheduled Machines&lt;/td&gt;
&lt;td&gt;About $38 a month managed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What low maintenance actually takes
&lt;/h2&gt;

&lt;p&gt;Redeploying on push handles one chore. These are the others that come back every week if the platform skips them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Builds without a Dockerfile
&lt;/h3&gt;

&lt;p&gt;If every repo needs a hand-written Dockerfile, you maintain base images and build steps across all of them. Ownkube, Render, Railway and Heroku all build common Node, Python, Go and Ruby apps without one. On Ownkube that is the automatic build, and it switches to your Dockerfile when the repo has one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rollouts that stop a bad build
&lt;/h3&gt;

&lt;p&gt;On Ownkube, health checks gate every rollout: new containers have to pass before the old ones stop, so a build that crashes on boot leaves the last good version serving. If a bad change does ship, rollback goes to any of the last 3 builds on Pay as you go and the last 10 on a plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs, metrics and alerts
&lt;/h3&gt;

&lt;p&gt;Logs and CPU and memory charts come with every Ownkube app, and public web apps add request rates and p95 latency, all kept 7 days on Pay as you go, 30 on Personal and 90 on Team. Alert rules on CPU, memory or restarts email the organization owner when they fire and again when they clear. On Heroku the same visibility usually means one or two paid add-ons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database backups
&lt;/h3&gt;

&lt;p&gt;A redeploy brings code back from Git, but not data. Managed Postgres on Ownkube takes 7-day backups with point-in-time restore on Personal and Team, turned on per database. Pay as you go databases have no backups, so that is the line to upgrade for before real users arrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The options, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ownkube
&lt;/h3&gt;

&lt;p&gt;Ownkube is a cloud for personal software. You connect a GitHub or GitLab repo, pick a branch, and every push builds and deploys to an &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname with TLS.&lt;/p&gt;

&lt;p&gt;Web apps, workers, scheduled jobs, Postgres and a Valkey cache sit side by side in one environment, and they reach each other by private name. Billing is a prepaid wallet: apps meter CPU and memory per minute (about $18 per vCPU and $6 per GiB a month), or sit on a flat Spark box from $5.&lt;/p&gt;

&lt;p&gt;Ownkube doesn't wait for CI checks, has no per-PR previews, and runs in two regions, Mumbai and Germany. The &lt;a href="https://ownkube.io/blog/preview-environments-per-pr" rel="noopener noreferrer"&gt;preview environments guide&lt;/a&gt; covers what a per-branch setup looks like today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render
&lt;/h3&gt;

&lt;p&gt;Render's auto-deploy can run on every commit or only after CI checks pass, which is the cleanest CI gate of the five. Instances are flat-priced from $7 a month, so the bill is predictable and an idle service costs the same as a busy one. See &lt;a href="https://ownkube.io/compare/render-alternatives" rel="noopener noreferrer"&gt;Render alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Railway
&lt;/h3&gt;

&lt;p&gt;Railway has the fastest first deploy, can wait for GitHub checks, and spins up an environment per pull request. It meters usage per second, which suits many small services. See &lt;a href="https://ownkube.io/compare/railway-pricing-explained" rel="noopener noreferrer"&gt;Railway pricing explained&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Heroku
&lt;/h3&gt;

&lt;p&gt;Heroku's GitHub integration deploys on push, can wait for CI, and builds review apps for pull requests. Workers are dynos at the same price as web dynos, and cron runs through the Scheduler add-on. See &lt;a href="https://ownkube.io/compare/heroku-alternatives" rel="noopener noreferrer"&gt;Heroku alternatives&lt;/a&gt; for the dyno math.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fly.io
&lt;/h3&gt;

&lt;p&gt;Fly.io deploys with &lt;code&gt;fly deploy&lt;/code&gt;. Deploy-on-push means a GitHub Actions workflow and an API token you manage, which gives you full control over the pipeline and one more file to maintain. It is the pick when apps need to run close to users on several continents. See &lt;a href="https://ownkube.io/compare/fly-io-alternatives" rel="noopener noreferrer"&gt;Fly.io alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small backend, priced
&lt;/h2&gt;

&lt;p&gt;The stack is an API, a queue worker, a job that runs 5 minutes every hour, and a Postgres with about 5 GB of data. The Ownkube lines assume the API averages 0.1 vCPU and holds 512 MiB, the worker 0.1 vCPU and 256 MiB, since metered CPU follows actual use.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Ownkube&lt;/th&gt;
&lt;th&gt;Render&lt;/th&gt;
&lt;th&gt;Heroku&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Metered, about $5&lt;/td&gt;
&lt;td&gt;Starter, $7&lt;/td&gt;
&lt;td&gt;Basic dyno, $7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker&lt;/td&gt;
&lt;td&gt;Metered, about $3&lt;/td&gt;
&lt;td&gt;Starter, $7&lt;/td&gt;
&lt;td&gt;Basic dyno, $7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hourly job&lt;/td&gt;
&lt;td&gt;Metered, under $1&lt;/td&gt;
&lt;td&gt;Cron job, billed per run&lt;/td&gt;
&lt;td&gt;Scheduler, one-off dyno per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;DB 0.5 box $4 plus 5 GB, $5.25&lt;/td&gt;
&lt;td&gt;256 MB plus 5 GB, $7.50&lt;/td&gt;
&lt;td&gt;Essential-1 (10 GB), $9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;about $14, plus bandwidth&lt;/td&gt;
&lt;td&gt;about $22, plus cron runs&lt;/td&gt;
&lt;td&gt;about $23, plus Scheduler runs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Render and Heroku figures are approximate, as of November 2026, on Render's Hobby workspace. The database sizes are not identical: Ownkube's DB 0.5 has 0.5 GiB of memory against Render's 256 MB. A busier API moves the Ownkube line up, and a Spark box fixes it at a flat price if you prefer. Try your own sizes on the &lt;a href="https://ownkube.io/tools/cost-calculator" rel="noopener noreferrer"&gt;cost calculator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up on Ownkube
&lt;/h2&gt;

&lt;p&gt;Create a web app from the &lt;a href="https://app.ownkube.io/dashboard" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;, connect your GitHub or GitLab account when it asks, and pick the repository and branch. Set a root directory if the app lives in a monorepo folder such as &lt;code&gt;apps/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add a Postgres database in the same environment and link it to the app, which hands the app its connection string as a secret variable (&lt;code&gt;okctl deploy link&lt;/code&gt; does the same from the terminal). Add a &lt;code&gt;/health&lt;/code&gt; route so rollouts can tell when the app is ready.&lt;/p&gt;

&lt;p&gt;From then on every push to the branch builds and deploys. To pause deploys during an incident, run &lt;code&gt;okctl deploy auto-deploy &amp;lt;id&amp;gt; --enabled=false&lt;/code&gt;. To have CI gate deploys, point the deployment at a release branch that your CI merges into once tests pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to pick Ownkube
&lt;/h2&gt;

&lt;p&gt;Pick Railway, Render or Heroku if every pull request needs its own live preview without setup. Pick Render if deploys must wait for GitHub checks natively. Pick Fly.io if your users are far from both Mumbai and Germany.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick checklist before you choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Push a commit that crashes on boot and confirm the old version keeps serving.&lt;/li&gt;
&lt;li&gt;Roll back once, on purpose, before you need to.&lt;/li&gt;
&lt;li&gt;Find where logs and metrics live, and how long they are kept.&lt;/li&gt;
&lt;li&gt;Turn on database backups and test a restore.&lt;/li&gt;
&lt;li&gt;Price the worker and the cron job, not only the web app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which hosting platforms redeploy automatically from GitHub?
&lt;/h3&gt;

&lt;p&gt;Ownkube, Render, Railway, Heroku, DigitalOcean App Platform, Vercel and Netlify all redeploy on push from a connected GitHub repo. Fly.io does it through a GitHub Actions workflow. Ownkube also redeploys from GitLab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I stop a push from deploying on Ownkube?
&lt;/h3&gt;

&lt;p&gt;Yes. Turn auto-deploy off for the app with &lt;code&gt;okctl deploy auto-deploy &amp;lt;id&amp;gt; --enabled=false&lt;/code&gt;, and turn it back on when you are ready. Pushes made while it is off don't deploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the cheapest way to host a backend with a worker and a small database?
&lt;/h3&gt;

&lt;p&gt;On metered pricing, a mostly idle API and worker cost a few dollars each, so the database is usually the biggest line. In our example the whole backend comes to about $14 a month on Ownkube. See &lt;a href="https://ownkube.io/compare/managed-postgres-pricing" rel="noopener noreferrer"&gt;managed Postgres pricing&lt;/a&gt; for the database line across eight providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Ownkube suits a small team that wants builds, rollouts, rollbacks, logs, alerts and Postgres backups to come with the app, paid from a wallet where unused credit never expires. If an app later has to run in your own or a customer's AWS account, it moves there with no rewrite, and its logs and metrics come with it. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How to deploy a Ruby on Rails app on Ownkube</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 15:37:45 +0000</pubDate>
      <link>https://dev.to/abhijais1/how-to-deploy-a-ruby-on-rails-app-on-ownkube-2393</link>
      <guid>https://dev.to/abhijais1/how-to-deploy-a-ruby-on-rails-app-on-ownkube-2393</guid>
      <description>&lt;p&gt;A &lt;a href="https://guides.rubyonrails.org/" rel="noopener noreferrer"&gt;Rails&lt;/a&gt; app needs three things from a host: a place to run &lt;a href="https://puma.io/" rel="noopener noreferrer"&gt;Puma&lt;/a&gt;, a Postgres database it can reach, and a way to run &lt;code&gt;db:migrate&lt;/code&gt; before traffic hits the new code. Ownkube covers all three without a cloud account or hand-written YAML.&lt;/p&gt;

&lt;p&gt;This walks through deploying a standard Rails app on Ownkube Compute: configuring Puma, wiring up a &lt;a href="https://ownkube.io/blog/add-managed-postgres-database" rel="noopener noreferrer"&gt;managed Postgres&lt;/a&gt;, setting &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt; and &lt;code&gt;SECRET_KEY_BASE&lt;/code&gt;, precompiling assets, and running migrations as a job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push a Rails app with a &lt;code&gt;Dockerfile&lt;/code&gt;, and Ownkube builds and deploys it behind automatic TLS.&lt;/li&gt;
&lt;li&gt;Add an Ownkube-managed Postgres database and set &lt;code&gt;DATABASE_URL&lt;/code&gt; from its connection string.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt; (or &lt;code&gt;SECRET_KEY_BASE&lt;/code&gt;) and &lt;code&gt;RAILS_ENV=production&lt;/code&gt; as environment variables in the dashboard, not in the repo.&lt;/li&gt;
&lt;li&gt;Precompile assets in the Docker build step, and run &lt;code&gt;db:migrate&lt;/code&gt; as a one-off job, so it runs once per release instead of on every container start.&lt;/li&gt;
&lt;li&gt;Metered billing fits Rails well: Puma sits mostly idle between requests, so the CPU line barely moves outside real traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Prepare the app for production
&lt;/h2&gt;

&lt;p&gt;Rails is opinionated enough that most of the setup is standard Rails. Confirm the basics before you deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config/database.yml&lt;/code&gt; reads its production connection from &lt;code&gt;ENV["DATABASE_URL"]&lt;/code&gt;, which is the Rails default.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;config/environments/production.rb&lt;/code&gt; has &lt;code&gt;config.assets.compile = false&lt;/code&gt; and &lt;code&gt;config.public_file_server.enabled&lt;/code&gt; set to match your asset pipeline (Propshaft or Sprockets, either works).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Gemfile&lt;/code&gt; includes &lt;code&gt;pg&lt;/code&gt; for the Postgres adapter and &lt;code&gt;puma&lt;/code&gt; as the app server.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/database.yml&lt;/span&gt;
&lt;span class="ss"&gt;production:
  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;
  &lt;span class="ss"&gt;url: &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV["DATABASE_URL"] %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Write a Dockerfile
&lt;/h2&gt;

&lt;p&gt;Ownkube deploys from a Dockerfile. A &lt;a href="https://docs.docker.com/build/building/multi-stage/" rel="noopener noreferrer"&gt;multi-stage build&lt;/a&gt; keeps the final image small and lets you precompile assets during the build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ruby:3.3-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-qq&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; build-essential libpq-dev git curl &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; Gemfile Gemfile.lock ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;bundle config &lt;span class="nb"&gt;set &lt;/span&gt;without &lt;span class="s1"&gt;'development test'&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bundle &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--jobs&lt;/span&gt; 4 &lt;span class="nt"&gt;--retry&lt;/span&gt; 3

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Precompile assets. SECRET_KEY_BASE_DUMMY lets this run without real secrets at build time.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;SECRET_KEY_BASE_DUMMY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rails assets:precompile

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.3-slim&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-qq&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; libpq-dev curl &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /usr/local/bundle /usr/local/bundle&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app /app&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; RAILS_ENV=production&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; RAILS_LOG_TO_STDOUT=true&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; RAILS_SERVE_STATIC_FILES=true&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["bundle", "exec", "puma", "-C", "config/puma.rb"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puma's default &lt;code&gt;config/puma.rb&lt;/code&gt; reads the port and worker count from environment variables already, so leave it as Rails generated it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/puma.rb&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"PORT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workers&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"WEB_CONCURRENCY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;threads_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"RAILS_MAX_THREADS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;
&lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="n"&gt;threads_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threads_count&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Push the repo and create the app
&lt;/h2&gt;

&lt;p&gt;Connect the repository from the Ownkube dashboard (&lt;code&gt;app.ownkube.io&lt;/code&gt;) to deploy on every push, or deploy the current directory with the &lt;code&gt;okctl&lt;/code&gt; CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl login
okctl up &lt;span class="nt"&gt;--name&lt;/span&gt; rails-app &lt;span class="nt"&gt;--port&lt;/span&gt; 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ownkube builds the image from your Dockerfile, allocates a hostname on &lt;code&gt;*.ownkube.app&lt;/code&gt;, and issues TLS automatically, so you have a working HTTPS URL the moment it deploys. On Personal and Team you can also serve it from a domain you own. See &lt;a href="https://ownkube.io/docs/networking/custom-domains" rel="noopener noreferrer"&gt;Custom domains&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a managed Postgres database
&lt;/h2&gt;

&lt;p&gt;Create a database box from the dashboard: &lt;strong&gt;New &amp;gt; Database &amp;gt; Postgres&lt;/strong&gt;. It provisions a private (in-region) Postgres box starting at $4 a month plus storage at $0.25 per GB, with backups and point-in-time recovery available on Personal and Team.&lt;/p&gt;

&lt;p&gt;The database runs as a single private instance by default; opt-in public access and, on Team, high availability are per-database options when you need them.&lt;/p&gt;

&lt;p&gt;Link the database to the Rails app. Ownkube writes its connection string into the app as a secret &lt;code&gt;DATABASE_URL&lt;/code&gt; variable and redeploys it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;rails-app &amp;lt;database-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;config/database.yml&lt;/code&gt; already reads from &lt;code&gt;ENV["DATABASE_URL"]&lt;/code&gt;, no further Rails configuration is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Set your secrets
&lt;/h2&gt;

&lt;p&gt;Rails needs its master key or secret key base to decrypt credentials and sign sessions. Set it as a &lt;a href="https://ownkube.io/blog/manage-secrets-env-vars" rel="noopener noreferrer"&gt;secret environment variable&lt;/a&gt; in the dashboard and keep &lt;code&gt;config/master.key&lt;/code&gt; out of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;rails-app &lt;span class="nv"&gt;RAILS_MASTER_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;config/master.key&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--secret&lt;/span&gt;
okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;rails-app &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use &lt;code&gt;SECRET_KEY_BASE&lt;/code&gt; directly instead of the encrypted credentials file, set that instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;rails-app &lt;span class="nv"&gt;SECRET_KEY_BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rails secret&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--secret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment variables set through Ownkube are encrypted at rest and only injected into the running container.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Run migrations as a job
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;db:migrate&lt;/code&gt; as a one-off &lt;a href="https://ownkube.io/docs/deployments/jobs" rel="noopener noreferrer"&gt;job&lt;/a&gt; instead of on every container start. Create a &lt;strong&gt;Job&lt;/strong&gt; deployment from the same repository, set its command to &lt;code&gt;bundle exec rails db:migrate&lt;/code&gt;, and leave the schedule empty. Variables are set per deployment, so give the job the same &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt; and &lt;code&gt;RAILS_ENV&lt;/code&gt; and link the same database to it.&lt;/p&gt;

&lt;p&gt;Then trigger a run whenever a release includes new migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;rails-migrate &amp;lt;database-id&amp;gt;
okctl deploy job-runs trigger rails-migrate
okctl deploy job-runs list rails-migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The run's output is on the job's &lt;strong&gt;Logs&lt;/strong&gt; tab. The web app and the job deploy independently, so keep each migration safe for the version already running: add columns and tables in one release, and drop old ones in a later one.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Scale and watch it run
&lt;/h2&gt;

&lt;p&gt;A fresh Rails app usually starts fine on a small metered ceiling, for example a 500m CPU limit and 1 GiB of memory, set on the sliders under &lt;strong&gt;Settings → Resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Turn on &lt;a href="https://ownkube.io/blog/autoscale-cpu-memory" rel="noopener noreferrer"&gt;horizontal autoscaling&lt;/a&gt; if traffic is uneven, so Ownkube adds Puma instances under load and scales back down when it is quiet. On Ownkube Compute you turn it on through your coding agent (the &lt;code&gt;update_deployment&lt;/code&gt; MCP tool) or the API, with a minimum and maximum replica count and a CPU target such as 70%.&lt;/p&gt;

&lt;p&gt;Logs and metrics for the app and the database box are both in the dashboard, so a slow migration or a Puma worker that keeps restarting shows up in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to your own AWS later
&lt;/h2&gt;

&lt;p&gt;If a customer contract requires the app to run in a named AWS account, your own or the customer's, the same Dockerfile and Rails app move there with no rewrite. Ownkube provisions the instance, wires up the same deploy flow, and brings the logs, metrics, and health checks with it.&lt;/p&gt;

&lt;p&gt;Railway, by contrast, only runs on Railway's infrastructure. Our &lt;a href="https://ownkube.io/compare/railway-alternatives" rel="noopener noreferrer"&gt;Railway alternatives guide&lt;/a&gt; compares Railway with the other options.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Ownkube support Rails credentials and Active Storage?
&lt;/h3&gt;

&lt;p&gt;Yes. Encrypted credentials work through &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt; as shown above. Active Storage works against any S3-compatible bucket you configure; Ownkube does not provide managed object storage directly, so point it at your own bucket.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a Dockerfile, or can Ownkube detect Rails automatically?
&lt;/h3&gt;

&lt;p&gt;A Dockerfile gives you full control over the Ruby version, native gems, and the asset precompile step, and is the most reliable path for Rails. Simpler apps without native dependencies can also deploy straight from source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Sidekiq or another background worker alongside the web app?
&lt;/h3&gt;

&lt;p&gt;Yes. Deploy the worker as a second Ownkube app pointed at the same Postgres connection string (and a Valkey cache box from $2 a month if you need Redis for the queue), so the web app and worker scale independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if my wallet balance runs out mid-month?
&lt;/h3&gt;

&lt;p&gt;The app pauses and its data, including the Postgres box, is kept. Adding credit or the next monthly plan load resumes it. Unused wallet credit rolls over and never expires, so credit from a quiet month carries into the next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I roll back a bad deploy?
&lt;/h3&gt;

&lt;p&gt;Yes. Ownkube keeps prior image versions and supports zero-downtime rollback from the dashboard or &lt;code&gt;okctl&lt;/code&gt;, so a code issue does not require a manual recovery. A rollback restores the previous image, and a migration that already ran stays applied, so keep migrations additive.&lt;/p&gt;

&lt;p&gt;For the always-current version of this walkthrough, see the &lt;a href="https://ownkube.io/docs/deploy/rails" rel="noopener noreferrer"&gt;Deploy Ruby on Rails&lt;/a&gt; guide in the docs. If you edit in &lt;a href="https://ownkube.io/agents/zed" rel="noopener noreferrer"&gt;Zed&lt;/a&gt; or work from &lt;a href="https://ownkube.io/agents/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, connect it to Ownkube's MCP server and it can deploy the app and read its logs for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Rails wants a real database, a way to run migrations, and an app server that survives restarts, and Ownkube gives you all three without provisioning a cloud account first. Push the Dockerfile, attach a managed Postgres, set your secrets, and run migrations as a job. See &lt;a href="https://ownkube.io/pricing" rel="noopener noreferrer"&gt;Ownkube pricing&lt;/a&gt; for the per-minute wallet model, from $5 a month. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to deploy a Next.js app on Ownkube</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 15:22:38 +0000</pubDate>
      <link>https://dev.to/abhijais1/how-to-deploy-a-nextjs-app-on-ownkube-2h5b</link>
      <guid>https://dev.to/abhijais1/how-to-deploy-a-nextjs-app-on-ownkube-2h5b</guid>
      <description>&lt;p&gt;A Next.js app in a container needs one setting most tutorials skip: &lt;code&gt;output: "standalone"&lt;/code&gt;, which trims the build down to only the files &lt;code&gt;next start&lt;/code&gt; actually needs instead of the full &lt;code&gt;node_modules&lt;/code&gt; tree. Get that right and the rest of a Next.js deploy on Ownkube is a normal git push.&lt;/p&gt;

&lt;p&gt;This walks through deploying a Next.js app (App Router or Pages Router, both work) on Ownkube Compute: the standalone build, environment variables split between build time and runtime, an optional managed Postgres for apps using an ORM, and automatic TLS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;output: "standalone"&lt;/code&gt; in &lt;code&gt;next.config.js&lt;/code&gt; so the Docker image ships a minimal server instead of the whole &lt;code&gt;node_modules&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Push the app with a &lt;code&gt;Dockerfile&lt;/code&gt;, and Ownkube builds it, deploys it, and issues TLS automatically on your &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt; variables get baked into the build; everything else is a runtime environment variable set in the dashboard.&lt;/li&gt;
&lt;li&gt;Add an Ownkube-managed Postgres database if you use Prisma or another ORM, and point the connection string at it.&lt;/li&gt;
&lt;li&gt;Turn on horizontal autoscaling once traffic is uneven, since Next.js's SSR path is CPU-bound per request in a way static pages are not.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Enable standalone output
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;next.config.js&lt;/code&gt;, add the &lt;a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/output" rel="noopener noreferrer"&gt;standalone output mode&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.js&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changes what &lt;code&gt;next build&lt;/code&gt; produces. It emits a self-contained &lt;code&gt;.next/standalone&lt;/code&gt; folder with only the files the server needs, plus a minimal &lt;code&gt;server.js&lt;/code&gt; entry point, so the runtime no longer needs the full project and &lt;code&gt;node_modules&lt;/code&gt;. That keeps the final Docker image small.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Write a Dockerfile
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://docs.docker.com/build/building/multi-stage/" rel="noopener noreferrer"&gt;multi-stage build&lt;/a&gt; keeps dependencies out of the final image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deps&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json package-lock.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=deps /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="c"&gt;# NEXT_PUBLIC_* values must be present at build time; they end up in the client bundle&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; NEXT_PUBLIC_API_URL&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/.next/standalone ./&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/.next/static ./.next/static&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/public ./public&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build stage takes &lt;code&gt;NEXT_PUBLIC_API_URL&lt;/code&gt; as a build argument because Next.js inlines &lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt; variables into the client JavaScript at build time. A value set only at runtime in the dashboard will not reach client-side code; it has to be present when &lt;code&gt;npm run build&lt;/code&gt; runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Push the repo and create the app
&lt;/h2&gt;

&lt;p&gt;Connect the repository from the Ownkube dashboard (&lt;code&gt;app.ownkube.io&lt;/code&gt;) to deploy on every push, or deploy the current directory with the &lt;code&gt;okctl&lt;/code&gt; CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl login
okctl up &lt;span class="nt"&gt;--name&lt;/span&gt; nextjs-app &lt;span class="nt"&gt;--port&lt;/span&gt; 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ownkube builds the image, allocates a hostname on &lt;code&gt;*.ownkube.app&lt;/code&gt;, and issues TLS automatically, so there is no reverse proxy or certificate to set up by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Set your environment variables
&lt;/h2&gt;

&lt;p&gt;Split variables by when Next.js actually needs them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Server-only, read at runtime by API routes or Server Components&lt;/span&gt;
okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;nextjs-app &lt;span class="nv"&gt;AUTH_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 32&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--secret&lt;/span&gt;

&lt;span class="c"&gt;# Client-visible, baked into the bundle at build time, so set it as a build argument (see step 2)&lt;/span&gt;
okctl deploy build-args nextjs-app &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="nv"&gt;NEXT_PUBLIC_API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://nextjs-app.ownkube.app/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment variables set through Ownkube are encrypted at rest and only injected into the running container, which is why a &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; value goes in as a build argument instead. Anything without the &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; prefix stays server-side and never ships to the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Add a managed Postgres database, if you use an ORM
&lt;/h2&gt;

&lt;p&gt;A Next.js app using &lt;a href="https://www.prisma.io/docs/orm/prisma-migrate" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, Drizzle, or another ORM for a database-backed API route needs a real Postgres instance. Create a database box from the dashboard: &lt;strong&gt;New &amp;gt; Database &amp;gt; Postgres&lt;/strong&gt;, walked through in full in &lt;a href="https://ownkube.io/blog/add-managed-postgres-database" rel="noopener noreferrer"&gt;add a managed Postgres database to your app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It provisions a private (in-region) Postgres box starting at $4 a month plus storage at $0.25 per GB, with backups and point-in-time recovery available on Personal and Team. The database runs as a single instance by default; you can turn on opt-in public access and, on Team, high availability (a primary plus up to two standby instances) per database when you need them.&lt;/p&gt;

&lt;p&gt;Link the database to the app, and Ownkube writes its connection string into the app as a secret &lt;code&gt;DATABASE_URL&lt;/code&gt; variable and redeploys it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;nextjs-app &amp;lt;database-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Prisma, generate the client in the build stage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# In the build stage, after copying the schema&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npx prisma generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;prisma migrate deploy&lt;/code&gt; as a one-off &lt;a href="https://ownkube.io/docs/deployments/jobs" rel="noopener noreferrer"&gt;job&lt;/a&gt; instead of in the build. Variables reach the running container rather than the build, and the database is private to its region, so the build cannot reach it.&lt;/p&gt;

&lt;p&gt;The slim standalone image leaves out the Prisma CLI and your &lt;code&gt;prisma&lt;/code&gt; folder, so give the job its own Dockerfile that installs dependencies and copies the schema, set its command to &lt;code&gt;npx prisma migrate deploy&lt;/code&gt;, and link the same database to it. Then trigger it when a release includes new migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;nextjs-migrate &amp;lt;database-id&amp;gt;
okctl deploy job-runs trigger nextjs-migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A purely static or content-fetching Next.js app can skip a database entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Scale and watch it run
&lt;/h2&gt;

&lt;p&gt;A fresh Next.js app usually starts fine on a small metered ceiling, for example a 500m CPU limit and 512 MiB of memory, set on the sliders under &lt;strong&gt;Settings → Resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Turn on &lt;a href="https://ownkube.io/blog/autoscale-cpu-memory" rel="noopener noreferrer"&gt;horizontal autoscaling&lt;/a&gt; if traffic is uneven, so Ownkube adds server instances under load and scales back down when it is quiet. On Ownkube Compute you turn it on through your coding agent (the &lt;code&gt;update_deployment&lt;/code&gt; MCP tool) or the API, with a minimum and maximum replica count and a CPU target such as 70%.&lt;/p&gt;

&lt;p&gt;Server-side rendering and API routes are CPU work per request in a way a purely static export is not, so an SSR-heavy app benefits more from autoscaling headroom than a mostly-static one.&lt;/p&gt;

&lt;p&gt;Metered billing charges CPU and memory on actual per-minute usage, so a quiet Next.js app between visits barely moves the wallet. Logs and metrics for the app live in the dashboard, so a slow render or a route that keeps erroring shows up in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to your own AWS later
&lt;/h2&gt;

&lt;p&gt;If the app needs to run inside your own AWS account later, for compliance reasons or because a client wants their name on the infrastructure, the same Dockerfile and Next.js app move over with no rewrite. Ownkube provisions the instance, wires up the same deploy flow, and brings the logs, metrics, and health checks with it.&lt;/p&gt;

&lt;p&gt;Railway only runs your app on its own infrastructure. Our &lt;a href="https://ownkube.io/compare/railway-alternatives" rel="noopener noreferrer"&gt;Railway alternatives guide&lt;/a&gt; compares Railway with the other options.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need &lt;code&gt;output: "standalone"&lt;/code&gt;, or does the default build work?
&lt;/h3&gt;

&lt;p&gt;The default build works, but it expects the full project and &lt;code&gt;node_modules&lt;/code&gt; present at runtime, which makes for a much larger Docker image and a slower deploy. Standalone output is the setting almost every Next.js Docker guide converges on, and it is the one used in the Dockerfile above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Ownkube support the App Router and Server Actions?
&lt;/h3&gt;

&lt;p&gt;Yes, both the App Router and the older Pages Router run the same way, since &lt;code&gt;next start&lt;/code&gt; in the standalone build serves whatever the app builds. Server Actions run as part of the same Node process and read server-side environment variables normally.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle a value that is different between preview and production?
&lt;/h3&gt;

&lt;p&gt;Set the environment variable per app in the dashboard or with &lt;code&gt;okctl vars set &amp;lt;app&amp;gt; NAME=VALUE&lt;/code&gt;, and use a separate Ownkube app for each environment you want isolated, each with its own hostname, environment variables, and (if needed) database.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if my wallet balance runs out mid-month?
&lt;/h3&gt;

&lt;p&gt;The app pauses and any attached database keeps its data. Adding credit or the next monthly plan load resumes it. Unused wallet credit rolls over and never expires.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use a custom domain?
&lt;/h3&gt;

&lt;p&gt;An automatic &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname with TLS is provisioned for every app the moment it deploys, so you always have a working URL with no configuration. On Personal and Team you can also add your own domain to the app. You set two DNS records and Ownkube issues and renews the certificate. See &lt;a href="https://ownkube.io/docs/networking/custom-domains" rel="noopener noreferrer"&gt;Custom domains&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I host Next.js on Vercel instead?
&lt;/h3&gt;

&lt;p&gt;For a personal, non-commercial frontend, Vercel's Hobby plan is free and runs Next.js well. A commercial project needs Pro at $20 per developer seat a month. &lt;a href="https://ownkube.io/compare/is-vercel-free" rel="noopener noreferrer"&gt;Is Vercel free?&lt;/a&gt; covers the Hobby rules. Ownkube fits when the app needs a long-running server, workers or Postgres next to it.&lt;/p&gt;

&lt;p&gt;For the always-current version of this walkthrough, see the &lt;a href="https://ownkube.io/docs/deploy/nextjs" rel="noopener noreferrer"&gt;Deploy Next.js&lt;/a&gt; guide in the docs. &lt;a href="https://ownkube.io/hosting/nodejs" rel="noopener noreferrer"&gt;Node.js hosting&lt;/a&gt; covers the other Node frameworks, and if you work in &lt;a href="https://ownkube.io/agents/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; or &lt;a href="https://ownkube.io/agents/github-copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;, the editor can deploy the app and check its build logs through Ownkube's MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Next.js wants a slim server image, a clean split between build-time and runtime configuration, and a database only when the app actually uses one, and Ownkube gives you all three without provisioning a cloud account first. Set standalone output, push the Dockerfile, set your environment variables, and the hostname and TLS are already waiting. See &lt;a href="https://ownkube.io/pricing" rel="noopener noreferrer"&gt;Ownkube pricing&lt;/a&gt; for the per-minute wallet model, from $5 a month. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to deploy a FastAPI app on Ownkube</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 15:07:31 +0000</pubDate>
      <link>https://dev.to/abhijais1/how-to-deploy-a-fastapi-app-on-ownkube-4m3p</link>
      <guid>https://dev.to/abhijais1/how-to-deploy-a-fastapi-app-on-ownkube-4m3p</guid>
      <description>&lt;p&gt;&lt;a href="https://fastapi.tiangolo.com/" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt; is fast to run locally with &lt;code&gt;uvicorn app.main:app --reload&lt;/code&gt;, and the production version of that command is not much longer. Production adds three things: a process manager that restarts a crashed worker, config read from environment variables instead of a &lt;code&gt;.env&lt;/code&gt; file in the repo, and a health check for the platform to poll. Ownkube handles the rest from a git push.&lt;/p&gt;

&lt;p&gt;This walks through deploying a FastAPI app on Ownkube Compute: running Gunicorn with Uvicorn workers, configuring settings through &lt;a href="https://ownkube.io/blog/manage-secrets-env-vars" rel="noopener noreferrer"&gt;environment variables&lt;/a&gt;, adding a health check endpoint, and turning on &lt;a href="https://ownkube.io/blog/autoscale-cpu-memory" rel="noopener noreferrer"&gt;autoscaling&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push a FastAPI app with a &lt;code&gt;Dockerfile&lt;/code&gt;, and Ownkube builds it, deploys it, and issues TLS automatically on your &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname.&lt;/li&gt;
&lt;li&gt;Run Gunicorn with &lt;code&gt;uvicorn.workers.UvicornWorker&lt;/code&gt; in production rather than Uvicorn's dev server directly, so a crashed worker restarts instead of taking the app down.&lt;/li&gt;
&lt;li&gt;Load configuration through a Pydantic &lt;code&gt;BaseSettings&lt;/code&gt; class and set the real values as environment variables in the dashboard, never in the repo.&lt;/li&gt;
&lt;li&gt;Add a Postgres database only if the app needs one; a stateless API can skip it entirely.&lt;/li&gt;
&lt;li&gt;Expose a &lt;code&gt;/health&lt;/code&gt; route and turn on horizontal autoscaling once traffic is uneven.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Structure the app for a container
&lt;/h2&gt;

&lt;p&gt;A typical FastAPI project layout works as-is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
  __init__.py
  main.py
  config.py
  routers/
requirements.txt
Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load configuration through &lt;code&gt;pydantic-settings&lt;/code&gt; so every value has a typed default and a clear environment variable name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/config.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic_settings&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseSettings&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseSettings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;database_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;cors_origins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;env_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;  &lt;span class="c1"&gt;# read only from real environment variables in production
&lt;/span&gt;
&lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a health check route, a few lines that give Ownkube something reliable to check the container against:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/main.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Write a Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PYTHONUNBUFFERED=1&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["gunicorn", "app.main:app", \&lt;/span&gt;
     "--worker-class", "uvicorn.workers.UvicornWorker", \
     "--bind", "0.0.0.0:8000", \
     "--workers", "4", \
     "--timeout", "60"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.gunicorn.org/" rel="noopener noreferrer"&gt;Gunicorn&lt;/a&gt; in front of &lt;a href="https://www.uvicorn.org/" rel="noopener noreferrer"&gt;Uvicorn&lt;/a&gt; workers is the standard production pairing: Gunicorn manages the worker pool and restarts a worker that dies, and each worker runs Uvicorn's ASGI event loop. Running &lt;code&gt;uvicorn&lt;/code&gt; directly with no process manager is fine for a demo. A container that needs to survive a bad request or an unhandled exception wants the supervisor.&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;requirements.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn[standard]
gunicorn
pydantic-settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Push the repo and create the app
&lt;/h2&gt;

&lt;p&gt;Connect the repository from the Ownkube dashboard (&lt;code&gt;app.ownkube.io&lt;/code&gt;) to deploy on every push, or deploy the current directory with the &lt;code&gt;okctl&lt;/code&gt; CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl login
okctl up &lt;span class="nt"&gt;--name&lt;/span&gt; fastapi-app &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ownkube builds the image, allocates a hostname on &lt;code&gt;*.ownkube.app&lt;/code&gt;, and issues TLS automatically. If the repo has no Dockerfile, Ownkube's automatic build detects Python and builds an image for you, though a Dockerfile gives more control over the worker command above.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a managed Postgres database, if you need one
&lt;/h2&gt;

&lt;p&gt;Plenty of FastAPI services are stateless: they call out to another API and return a response, and nothing needs to persist. If that describes your app, skip this step.&lt;/p&gt;

&lt;p&gt;If the app does need a database, create a database box from the dashboard: &lt;strong&gt;New &amp;gt; Database &amp;gt; Postgres&lt;/strong&gt;. It provisions a private (in-region) Postgres box starting at $4 a month plus storage at $0.25 per GB, with backups and point-in-time recovery available on Personal and Team. The database runs as a single instance by default; opt-in public access and, on Team, high availability are per-database options.&lt;/p&gt;

&lt;p&gt;Link the database to the app. Ownkube writes its connection string into the app as a secret &lt;code&gt;DATABASE_URL&lt;/code&gt; variable and redeploys it. Read it through settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;fastapi-app &amp;lt;database-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/config.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseSettings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;database_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The linked URL starts with &lt;code&gt;postgresql://&lt;/code&gt;, and SQLAlchemy's async engine wants the &lt;code&gt;postgresql+asyncpg://&lt;/code&gt; scheme, so swap it when you create the engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.ext.asyncio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_async_engine&lt;/span&gt;

&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_async_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;database_url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgresql://&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgresql+asyncpg://&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;pool_pre_ping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Set your configuration as environment variables
&lt;/h2&gt;

&lt;p&gt;Anything the Pydantic &lt;code&gt;Settings&lt;/code&gt; class reads should come from the dashboard instead of a committed &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;fastapi-app &lt;span class="nv"&gt;ENVIRONMENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="nv"&gt;CORS_ORIGINS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://yourapp.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment variables set through Ownkube are encrypted at rest and only injected into the running container, so secrets like API keys or a database password never live in the repo or the image.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Scale and watch it run
&lt;/h2&gt;

&lt;p&gt;A fresh FastAPI service usually starts fine on a small metered ceiling, for example a 500m CPU limit and 512 MiB of memory, set on the sliders under &lt;strong&gt;Settings → Resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Turn on horizontal autoscaling once traffic is uneven, so Ownkube adds Uvicorn worker instances under load and scales back down when it is quiet. On Ownkube Compute you turn it on through your coding agent (the &lt;code&gt;update_deployment&lt;/code&gt; MCP tool) or the API, with a minimum and maximum replica count and a CPU target such as 70%.&lt;/p&gt;

&lt;p&gt;Metered billing suits an API that idles between bursts: it charges CPU and memory on actual per-minute usage, so a service that sits quiet overnight barely draws the wallet down.&lt;/p&gt;

&lt;p&gt;If the service instead runs hot around the clock, for example a worker consuming a queue continuously, a flat Spark box is a steadier price than metering a constant load. Logs and metrics for the app live in the dashboard, so a worker that keeps restarting or a slow endpoint shows up in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to your own AWS later
&lt;/h2&gt;

&lt;p&gt;If the service needs to run inside your own or a customer's AWS account, the same Dockerfile and FastAPI app move there with no rewrite. Ownkube provisions the instance, wires up the same deploy flow, and brings the logs, metrics, and health checks with it. Railway only runs on its own infrastructure. Our &lt;a href="https://ownkube.io/compare/railway-alternatives" rel="noopener noreferrer"&gt;Railway alternatives guide&lt;/a&gt; compares Railway with the other options.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I use Uvicorn directly or Gunicorn with Uvicorn workers?
&lt;/h3&gt;

&lt;p&gt;Use Gunicorn with &lt;code&gt;uvicorn.workers.UvicornWorker&lt;/code&gt; in production. Gunicorn manages the worker pool, restarts a worker that crashes, and gives you a &lt;code&gt;--workers&lt;/code&gt; count to tune; running Uvicorn alone has none of that supervision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Ownkube support WebSockets?
&lt;/h3&gt;

&lt;p&gt;Yes, a Uvicorn worker handles WebSocket connections the same way it does in any other deployment. Keep in mind that autoscaling adds new instances rather than new connections to an existing one, so a long-lived WebSocket workload should size &lt;code&gt;--workers&lt;/code&gt; and the autoscale ceiling with connection count in mind as well as CPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Ownkube know my app is healthy?
&lt;/h3&gt;

&lt;p&gt;Health checks on the app's &lt;strong&gt;Settings&lt;/strong&gt; tab poll &lt;code&gt;/health&lt;/code&gt; by default, and Ownkube restarts the container when the liveness check keeps failing. A lightweight &lt;code&gt;/health&lt;/code&gt; route that does not touch the database gives it a fast, reliable signal, separate from a &lt;code&gt;/status&lt;/code&gt; endpoint that might check dependencies and take longer to answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if my wallet balance runs out mid-month?
&lt;/h3&gt;

&lt;p&gt;The app pauses and any attached database keeps its data. Adding credit or the next monthly plan load resumes it. Unused wallet credit rolls over and never expires.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run a background worker alongside the API?
&lt;/h3&gt;

&lt;p&gt;Yes. Deploy it as a second Ownkube app or as a &lt;a href="https://ownkube.io/blog/run-scheduled-cron-jobs" rel="noopener noreferrer"&gt;scheduled job&lt;/a&gt; if the work runs on a cadence rather than continuously, and point it at the same Postgres connection string if it shares data with the API.&lt;/p&gt;

&lt;p&gt;For the always-current version of this walkthrough, see the &lt;a href="https://ownkube.io/docs/deploy/fastapi" rel="noopener noreferrer"&gt;Deploy FastAPI&lt;/a&gt; guide in the docs. &lt;a href="https://ownkube.io/agents/codex" rel="noopener noreferrer"&gt;Codex&lt;/a&gt; and &lt;a href="https://ownkube.io/agents/windsurf" rel="noopener noreferrer"&gt;Windsurf&lt;/a&gt; can also run the deploy through Ownkube's MCP server, from the same session where you wrote the API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;FastAPI wants a process manager that survives a crashed worker, config that stays out of the repo, and a place to add a database only when the app actually needs one, and Ownkube gives you all three without provisioning a cloud account first. Push the Dockerfile, set your environment variables, and turn on autoscaling when traffic gets uneven.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://ownkube.io/pricing" rel="noopener noreferrer"&gt;Ownkube pricing&lt;/a&gt; for the per-minute wallet model, from $5 a month. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>python</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to deploy a Django app on Ownkube</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:52:24 +0000</pubDate>
      <link>https://dev.to/abhijais1/how-to-deploy-a-django-app-on-ownkube-lip</link>
      <guid>https://dev.to/abhijais1/how-to-deploy-a-django-app-on-ownkube-lip</guid>
      <description>&lt;p&gt;A &lt;a href="https://docs.djangoproject.com/en/stable/" rel="noopener noreferrer"&gt;Django&lt;/a&gt; app in production needs four things from a host: a real WSGI server in front of it, a Postgres database it can reach, static files served correctly, and a way to run migrations before code that needs them takes traffic. Ownkube covers all four without a cloud account or hand-written YAML.&lt;/p&gt;

&lt;p&gt;This walks through deploying a standard Django app on Ownkube Compute: swapping the dev server for Gunicorn, wiring up a &lt;a href="https://ownkube.io/blog/add-managed-postgres-database" rel="noopener noreferrer"&gt;managed Postgres&lt;/a&gt;, handling static files with WhiteNoise, and running &lt;code&gt;migrate&lt;/code&gt; as a job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push a Django app with a &lt;code&gt;Dockerfile&lt;/code&gt;, and Ownkube builds it, deploys it, and issues TLS automatically on your &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname.&lt;/li&gt;
&lt;li&gt;Add an Ownkube-managed Postgres database and point &lt;code&gt;DATABASE_URL&lt;/code&gt; at it with &lt;code&gt;dj-database-url&lt;/code&gt; or the equivalent.&lt;/li&gt;
&lt;li&gt;Serve static files with WhiteNoise instead of standing up a separate static host, and run &lt;code&gt;collectstatic&lt;/code&gt; in the Docker build.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;SECRET_KEY&lt;/code&gt;, &lt;code&gt;DJANGO_SETTINGS_MODULE&lt;/code&gt;, and &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt; as environment variables in the dashboard, not in the repo.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;migrate&lt;/code&gt; as a one-off job, so it runs once per release instead of on every container start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Prepare settings for production
&lt;/h2&gt;

&lt;p&gt;Most of this is standard Django. Point the database and static file settings at environment variables instead of hardcoded values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# settings.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dj_database_url&lt;/span&gt;

&lt;span class="n"&gt;DEBUG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;SECRET_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ALLOWED_HOSTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALLOWED_HOSTS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dj_database_url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn_max_age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;STATIC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;STATIC_ROOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/app/staticfiles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;STORAGES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;staticfiles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BACKEND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whitenoise.storage.CompressedManifestStaticFilesStorage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;MIDDLEWARE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django.middleware.security.SecurityMiddleware&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whitenoise.middleware.WhiteNoiseMiddleware&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# ...the rest of your middleware
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;whitenoise&lt;/code&gt;, &lt;code&gt;gunicorn&lt;/code&gt;, &lt;code&gt;psycopg[binary]&lt;/code&gt;, and &lt;code&gt;dj-database-url&lt;/code&gt; to &lt;code&gt;requirements.txt&lt;/code&gt;. &lt;a href="https://whitenoise.readthedocs.io/" rel="noopener noreferrer"&gt;WhiteNoise&lt;/a&gt; lets a small app serve its own CSS and JS without a separate static file host or CDN.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Write a Dockerfile
&lt;/h2&gt;

&lt;p&gt;Ownkube deploys from a Dockerfile when the repo has one, so you get full control over the Python version and the build steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-qq&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; libpq-dev build-essential &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Collect static files at build time, before SECRET_KEY exists at runtime&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;build-only &lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sqlite:///build.db &lt;span class="se"&gt;\
&lt;/span&gt;    python manage.py collectstatic &lt;span class="nt"&gt;--noinput&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PYTHONUNBUFFERED=1&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.gunicorn.org/" rel="noopener noreferrer"&gt;Gunicorn&lt;/a&gt;'s worker count is a starting point. A CPU-bound app usually wants workers close to &lt;code&gt;(2 x vCPU) + 1&lt;/code&gt;; an I/O-bound app that mostly waits on the database can run more workers per vCPU than that rule suggests.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Push the repo and create the app
&lt;/h2&gt;

&lt;p&gt;Connect the repository from the Ownkube dashboard (&lt;code&gt;app.ownkube.io&lt;/code&gt;) to deploy on every push, or deploy the current directory with the &lt;code&gt;okctl&lt;/code&gt; CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl login
okctl up &lt;span class="nt"&gt;--name&lt;/span&gt; django-app &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ownkube builds the image from your Dockerfile, allocates a hostname on &lt;code&gt;*.ownkube.app&lt;/code&gt;, and issues TLS automatically, so there is no load balancer or certificate to configure by hand. Running &lt;code&gt;okctl up&lt;/code&gt; again ships the next version.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a managed Postgres database
&lt;/h2&gt;

&lt;p&gt;Create a database box from the dashboard: &lt;strong&gt;New &amp;gt; Database &amp;gt; Postgres&lt;/strong&gt;. It provisions a private (in-region) Postgres box starting at $4 a month plus storage at $0.25 per GB, with backups and point-in-time recovery available on Personal and Team.&lt;/p&gt;

&lt;p&gt;The database runs as a single private instance by default, which is the normal shape for a small to mid-size Django app; opt-in public access and, on Team, high availability are per-database options when you need them.&lt;/p&gt;

&lt;p&gt;Link the database to the app. Ownkube writes its connection string into the app as a secret &lt;code&gt;DATABASE_URL&lt;/code&gt; variable and redeploys it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;django-app &amp;lt;database-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dj_database_url.config()&lt;/code&gt; in &lt;code&gt;settings.py&lt;/code&gt; reads it directly, so there is no further Django-side configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Set your secrets
&lt;/h2&gt;

&lt;p&gt;Django needs &lt;code&gt;SECRET_KEY&lt;/code&gt; to sign sessions and cookies, and it will refuse to run with &lt;code&gt;DEBUG=False&lt;/code&gt; and an empty &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt;. Set these as &lt;a href="https://ownkube.io/blog/manage-secrets-env-vars" rel="noopener noreferrer"&gt;environment variables&lt;/a&gt; in the dashboard and keep them out of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;django-app &lt;span class="nv"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import secrets; print(secrets.token_urlsafe(50))'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--secret&lt;/span&gt;
okctl vars &lt;span class="nb"&gt;set &lt;/span&gt;django-app &lt;span class="nv"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myproject.settings &lt;span class="nv"&gt;ALLOWED_HOSTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"django-app.ownkube.app"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment variables set through Ownkube are encrypted at rest and only injected into the running container.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Run migrations as a job
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;migrate&lt;/code&gt; as a one-off &lt;a href="https://ownkube.io/docs/deployments/jobs" rel="noopener noreferrer"&gt;job&lt;/a&gt; instead of on every container start. Create a &lt;strong&gt;Job&lt;/strong&gt; deployment from the same repository, set its command to &lt;code&gt;python manage.py migrate --noinput&lt;/code&gt;, and leave the schedule empty. Variables are set per deployment, so give the job the same &lt;code&gt;SECRET_KEY&lt;/code&gt; and &lt;code&gt;DJANGO_SETTINGS_MODULE&lt;/code&gt; and link the same database to it.&lt;/p&gt;

&lt;p&gt;Then trigger a run whenever a release includes new migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;okctl deploy &lt;span class="nb"&gt;link &lt;/span&gt;django-migrate &amp;lt;database-id&amp;gt;
okctl deploy job-runs trigger django-migrate
okctl deploy job-runs list django-migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The run's output is on the job's &lt;strong&gt;Logs&lt;/strong&gt; tab. The web app and the job deploy independently, so keep each migration safe for the version already running: add columns and tables in one release, and drop old ones in a later one.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Scale and watch it run
&lt;/h2&gt;

&lt;p&gt;A fresh Django app usually starts fine on a small metered ceiling, for example a 500m CPU limit and 1 GiB of memory, set on the sliders under &lt;strong&gt;Settings → Resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Turn on &lt;a href="https://ownkube.io/blog/autoscale-cpu-memory" rel="noopener noreferrer"&gt;horizontal autoscaling&lt;/a&gt; if traffic is uneven, so Ownkube adds Gunicorn instances under load and scales back down when it is quiet. On Ownkube Compute you turn it on through your coding agent (the &lt;code&gt;update_deployment&lt;/code&gt; MCP tool) or the API, with a minimum and maximum replica count and a CPU target such as 70%.&lt;/p&gt;

&lt;p&gt;Metered billing fits a typical Django app well: it charges CPU and memory on actual per-minute usage, and a Django app sitting between requests barely registers on the CPU line.&lt;/p&gt;

&lt;p&gt;Logs and metrics for the app and the database box both live in the dashboard, so a slow migration or a worker that keeps restarting shows up in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to your own AWS later
&lt;/h2&gt;

&lt;p&gt;If a client's security review asks for the app to run in a named AWS account, your own or theirs, the same Dockerfile and Django app move there with no rewrite. Ownkube provisions the instance, wires up the same deploy flow, and brings the logs, metrics, and health checks with it.&lt;/p&gt;

&lt;p&gt;Railway, by contrast, only runs your workload on its own infrastructure. Our &lt;a href="https://ownkube.io/compare/railway-alternatives" rel="noopener noreferrer"&gt;Railway alternatives guide&lt;/a&gt; compares Railway with the other options.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Ownkube support Django's admin site and management commands?
&lt;/h3&gt;

&lt;p&gt;Yes. The admin works like any other Django view once &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt; and static files are configured. One-off management commands run as a one-off job, started from the job's &lt;strong&gt;Runs&lt;/strong&gt; tab or with &lt;code&gt;okctl deploy job-runs trigger&lt;/code&gt;, instead of inside a running web container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a Dockerfile, or can Ownkube detect Django automatically?
&lt;/h3&gt;

&lt;p&gt;A Dockerfile gives you control over the Python version, system packages like &lt;code&gt;libpq-dev&lt;/code&gt;, and the &lt;code&gt;collectstatic&lt;/code&gt; build step, and is the most reliable path for Django. Simpler apps without native dependencies can also deploy straight from source using Ownkube's automatic build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Celery or another background worker alongside the web app?
&lt;/h3&gt;

&lt;p&gt;Yes. Deploy the worker as a second Ownkube app pointed at the same Postgres connection string, and add a Valkey cache box from $2 a month if you need Redis as the broker, so the web app and worker scale independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if my wallet balance runs out mid-month?
&lt;/h3&gt;

&lt;p&gt;The app pauses and its data, including the Postgres box, is kept. Adding credit or the next monthly plan load resumes it. Unused wallet credit rolls over and never expires, so credit from a quiet month carries into the next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I roll back a bad deploy?
&lt;/h3&gt;

&lt;p&gt;Yes. Ownkube keeps prior image versions and supports zero-downtime rollback from the dashboard or &lt;code&gt;okctl&lt;/code&gt;, so a broken release or settings change does not require a manual recovery. A rollback restores the previous image, and a migration that already ran stays applied, which is one more reason to keep migrations additive.&lt;/p&gt;

&lt;p&gt;For the always-current version of this walkthrough, see the &lt;a href="https://ownkube.io/docs/deploy/django" rel="noopener noreferrer"&gt;Deploy Django&lt;/a&gt; guide in the docs. To hand the deploy to an assistant, connect &lt;a href="https://ownkube.io/agents/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; or &lt;a href="https://ownkube.io/agents/claude-desktop" rel="noopener noreferrer"&gt;Claude Desktop&lt;/a&gt; to Ownkube's MCP server and ask it to deploy the app, add Postgres and read the logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Django wants a real database, a way to run migrations, and a place to serve static files without standing up a separate CDN, and Ownkube gives you all three without provisioning a cloud account first. Push the Dockerfile, attach a managed Postgres, set your secrets, and run migrations as a job. See &lt;a href="https://ownkube.io/pricing" rel="noopener noreferrer"&gt;Ownkube pricing&lt;/a&gt; for the per-minute wallet model, from $5 a month. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Kubernetes alternatives for small teams in 2026</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:37:18 +0000</pubDate>
      <link>https://dev.to/abhijais1/kubernetes-alternatives-for-small-teams-in-2026-2o1h</link>
      <guid>https://dev.to/abhijais1/kubernetes-alternatives-for-small-teams-in-2026-2o1h</guid>
      <description>&lt;p&gt;Kubernetes is the standard way large organizations run containers, and it earns that place: it schedules thousands of workloads across machines, rolls out new versions safely, heals what crashes, and gives many teams one shared API.&lt;/p&gt;

&lt;p&gt;A team of three to twenty engineers with a handful of services needs the outcomes, and much less of the machinery. This post lists what Kubernetes actually gives you, what it costs a small team to own, and the alternatives that deliver the same outcomes with less to run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most small teams need five things from Kubernetes: rolling deploys, restarts on crash, autoscaling, private networking between services, and HTTPS on a hostname. Every alternative below provides them.&lt;/li&gt;
&lt;li&gt;The cost of Kubernetes for a small team is mostly time: upgrades on the release cycle, cluster add-ons, YAML, and someone who knows how it all fits together.&lt;/li&gt;
&lt;li&gt;A managed developer platform (a PaaS) is the shortest path. Managed container services suit teams already deep in one cloud. A self-hosted PaaS or Docker Compose on one server is cheapest in cash and costs you the operations.&lt;/li&gt;
&lt;li&gt;Keep Kubernetes when you have a platform team, custom operators, strict placement or compliance needs, or many teams sharing one cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What does Kubernetes give you?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you need&lt;/th&gt;
&lt;th&gt;How Kubernetes does it&lt;/th&gt;
&lt;th&gt;How a simpler platform does it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ship a new version safely&lt;/td&gt;
&lt;td&gt;Rolling updates with readiness probes&lt;/td&gt;
&lt;td&gt;Rolling deploys with health checks, one-click rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep the app running&lt;/td&gt;
&lt;td&gt;Restarts failed containers, reschedules on node loss&lt;/td&gt;
&lt;td&gt;Restarts the process, moves it on host failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handle more traffic&lt;/td&gt;
&lt;td&gt;Horizontal autoscaling on CPU or memory&lt;/td&gt;
&lt;td&gt;Autoscaling on CPU or memory, set in a form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services talk to each other&lt;/td&gt;
&lt;td&gt;Service discovery and cluster DNS&lt;/td&gt;
&lt;td&gt;A private network inside the project or environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS on a hostname&lt;/td&gt;
&lt;td&gt;An ingress controller plus certificate automation&lt;/td&gt;
&lt;td&gt;Automatic TLS on a generated or custom hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config and secrets&lt;/td&gt;
&lt;td&gt;ConfigMaps and Secrets&lt;/td&gt;
&lt;td&gt;Environment variables with a secret toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled tasks&lt;/td&gt;
&lt;td&gt;CronJobs&lt;/td&gt;
&lt;td&gt;Scheduled jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything in the right-hand column is a feature you turn on. Everything in the middle column is something you install, configure, upgrade and debug.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Kubernetes cost a small team?
&lt;/h2&gt;

&lt;p&gt;The cluster bill is the visible part. The larger cost is attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrades never stop
&lt;/h3&gt;

&lt;p&gt;Kubernetes ships three minor releases a year, and each is supported for about fourteen months. Staying on a supported version means an upgrade, with its deprecations, every few months.&lt;/p&gt;

&lt;h3&gt;
  
  
  The add-ons are yours
&lt;/h3&gt;

&lt;p&gt;An ingress controller, certificate automation, DNS automation, a metrics stack, log shipping, a secrets operator and an autoscaler for nodes each have their own release cycle and failure modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  YAML is the interface
&lt;/h3&gt;

&lt;p&gt;Every app needs deployments, services, ingress rules, autoscalers and policies, usually templated through Helm charts that someone has to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Someone has to understand it
&lt;/h3&gt;

&lt;p&gt;When a rollout hangs at 2 a.m., the team needs a person who can read events, describe pods and reason about the scheduler. For many small teams that person is the CTO, or a DevOps hire at a full salary.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ownkube.io/compare/devops-engineer-salary-cost" rel="noopener noreferrer"&gt;DevOps engineer cost guide&lt;/a&gt; prices that role, and the &lt;a href="https://ownkube.io/tools/devops-hire-vs-platform-calculator" rel="noopener noreferrer"&gt;hire vs platform calculator&lt;/a&gt; compares it with a platform.&lt;/p&gt;

&lt;p&gt;At scale that work pays for itself. At five services, it is overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the alternatives to Kubernetes?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. A managed developer platform
&lt;/h3&gt;

&lt;p&gt;Render, Railway, Fly.io, Heroku and Ownkube run your containers for you. You connect a repository, pick a service type (web app, worker, cron job), add a database, and the platform handles builds, rollouts, TLS, scaling and logs. This is the shortest path from code to production and the one most small teams should try first.&lt;/p&gt;

&lt;p&gt;The trade-offs are pricing models and how much control you keep, which the &lt;a href="https://ownkube.io/compare/railway-alternatives" rel="noopener noreferrer"&gt;Railway alternatives guide&lt;/a&gt; and &lt;a href="https://ownkube.io/compare/railway-vs-render-vs-northflank" rel="noopener noreferrer"&gt;Railway vs Render vs Northflank&lt;/a&gt; compare in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Managed container services from a cloud provider
&lt;/h3&gt;

&lt;p&gt;AWS ECS with Fargate, Google Cloud Run and Azure Container Apps run containers without a cluster to manage. They fit teams that already live in one cloud and want its networking, identity and billing. You still assemble the pieces: load balancers, certificates, secrets, log routing and a deploy pipeline are separate services you wire together, often in infrastructure-as-code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A self-hosted PaaS on your own server
&lt;/h3&gt;

&lt;p&gt;Coolify, Dokploy, CapRover and Dokku give you a Heroku-style interface on a server you rent. Kamal deploys containers to your servers over SSH. The cash cost is the server, and the operations (OS patches, backups, disk space, the PaaS itself) are yours. The &lt;a href="https://ownkube.io/compare/coolify-alternatives" rel="noopener noreferrer"&gt;Coolify alternatives guide&lt;/a&gt; compares them.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Docker Compose on one server
&lt;/h3&gt;

&lt;p&gt;A single server running Docker Compose behind a reverse proxy is the simplest production setup there is. It is a good choice for internal tools and early products. It has no rolling deploys or failover by default, so a bad deploy or a dead server is downtime until you fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. HashiCorp Nomad
&lt;/h3&gt;

&lt;p&gt;Nomad schedules containers and plain binaries across machines with a much smaller surface than Kubernetes. It suits teams that want a real scheduler across several servers and are comfortable running it, usually alongside Consul for service discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I choose?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Good fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small team, a few services, want to ship today&lt;/td&gt;
&lt;td&gt;A managed developer platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Already standardized on one cloud, have infrastructure-as-code&lt;/td&gt;
&lt;td&gt;ECS with Fargate, Cloud Run or Container Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tight cash budget, someone enjoys running servers&lt;/td&gt;
&lt;td&gt;A self-hosted PaaS or Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several servers, want a scheduler, prefer a small tool&lt;/td&gt;
&lt;td&gt;Nomad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform team, many teams, custom operators, strict placement rules&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When is Kubernetes the right call?
&lt;/h2&gt;

&lt;p&gt;Keep or adopt Kubernetes when at least one of these is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a platform team whose job is the cluster.&lt;/li&gt;
&lt;li&gt;Many product teams share infrastructure and need one API with quotas and policy.&lt;/li&gt;
&lt;li&gt;You rely on operators or custom resources that only exist for Kubernetes.&lt;/li&gt;
&lt;li&gt;Compliance or customers require workloads in specific accounts, regions or machines with fine-grained control.&lt;/li&gt;
&lt;li&gt;You run GPU or batch workloads that need the scheduler's placement features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Kubernetes overkill for a startup?
&lt;/h3&gt;

&lt;p&gt;For most early startups, yes. A startup with a few services needs rolling deploys, restarts, autoscaling, private networking and HTTPS, and a managed developer platform provides all of them without a cluster to upgrade. Kubernetes starts to pay off when you have a platform team or many teams sharing infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the simplest alternative to Kubernetes?
&lt;/h3&gt;

&lt;p&gt;Docker Compose on one server is the simplest to set up, and a managed developer platform is the simplest to run in production, because rollouts, TLS, scaling and failover are handled for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run microservices without Kubernetes?
&lt;/h3&gt;

&lt;p&gt;Yes. Each service becomes its own deployment on a platform, and services reach each other over a private network by name. On Ownkube, a &lt;a href="https://ownkube.io/hosting/go" rel="noopener noreferrer"&gt;Go service&lt;/a&gt; and a Java app like the &lt;a href="https://ownkube.io/templates/spring-petclinic" rel="noopener noreferrer"&gt;Spring PetClinic template&lt;/a&gt; deploy the same way, each with its own Postgres if it needs one. Most platforms also run workers and scheduled jobs, which covers the usual microservice shapes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need Kubernetes to autoscale?
&lt;/h3&gt;

&lt;p&gt;No. Managed developer platforms and cloud container services autoscale on CPU or memory. On Ownkube you set a minimum and maximum replica count and a CPU target, through your coding agent or the API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Docker Compose good enough for production?
&lt;/h3&gt;

&lt;p&gt;For internal tools and early products on one server, often yes. Plan for backups, a reverse proxy with TLS, and a way to roll back, because Compose has no rolling deploys or failover across machines by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Ownkube is a developer platform for small teams that want the outcomes of Kubernetes without operating it. Push a repo and get builds, rolling deploys with health checks, autoscaling on CPU, private networking, automatic HTTPS, managed Postgres and a Valkey cache, logs, metrics and one-click rollbacks.&lt;/p&gt;

&lt;p&gt;Usage bills per minute from a prepaid wallet, and unused credit never expires. When a customer needs the app in their own cloud, the same app ships there with its observability intact. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>startup</category>
      <category>paas</category>
    </item>
    <item>
      <title>Railway vs Vercel in 2026: frontend platform or backend host?</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:22:12 +0000</pubDate>
      <link>https://dev.to/abhijais1/railway-vs-vercel-in-2026-frontend-platform-or-backend-host-55c3</link>
      <guid>https://dev.to/abhijais1/railway-vs-vercel-in-2026-frontend-platform-or-backend-host-55c3</guid>
      <description>&lt;p&gt;Railway and Vercel show up in the same searches, and they overlap less than it seems. Vercel is a frontend cloud: it builds Next.js and other frameworks, serves them from a global edge network, and runs your server code as functions that start per request. Railway runs long-lived containers: API servers, workers, cron jobs and databases that stay up between requests. Many teams use both.&lt;/p&gt;

&lt;p&gt;This post explains where each fits, compares the limits and pricing that matter, and covers the split setup. Prices and limits were checked on 2026-10-13.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; is the better home for a Next.js or other frontend: preview deployments per branch, a global CDN, image optimization and zero server management. Server code runs as functions with a duration limit of 300 seconds on Hobby and 800 on Pro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Railway&lt;/strong&gt; is the better home for anything long-running: API servers, WebSocket servers, queue workers, bots, cron jobs and databases.&lt;/li&gt;
&lt;li&gt;Vercel's Hobby plan is free for personal, non-commercial use. Pro is $20 per seat a month with $20 of usage included. Railway Pro is $20 per workspace with $20 of usage included.&lt;/li&gt;
&lt;li&gt;A common setup is the frontend on Vercel and the API and Postgres on Railway, in nearby regions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is each one built for?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Vercel&lt;/th&gt;
&lt;th&gt;Railway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core model&lt;/td&gt;
&lt;td&gt;Static assets on a CDN plus functions per request&lt;/td&gt;
&lt;td&gt;Containers that run continuously&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best at&lt;/td&gt;
&lt;td&gt;Next.js, frontends, server rendering, edge middleware&lt;/td&gt;
&lt;td&gt;APIs, workers, cron jobs, databases, bots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server code&lt;/td&gt;
&lt;td&gt;Functions with a maximum duration&lt;/td&gt;
&lt;td&gt;Any process, no time limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSockets&lt;/td&gt;
&lt;td&gt;Public beta on Vercel Functions&lt;/td&gt;
&lt;td&gt;Supported natively by any server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Databases&lt;/td&gt;
&lt;td&gt;Through Marketplace integrations, billed by the provider&lt;/td&gt;
&lt;td&gt;Postgres, MySQL, Redis and others as services in your project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background jobs&lt;/td&gt;
&lt;td&gt;Cron jobs that call functions; Workflows for long tasks&lt;/td&gt;
&lt;td&gt;Workers and cron services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What are Vercel's function limits?
&lt;/h2&gt;

&lt;p&gt;Vercel Functions run with these limits on fluid compute:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Hobby&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maximum duration&lt;/td&gt;
&lt;td&gt;300 seconds&lt;/td&gt;
&lt;td&gt;800 seconds, 1800 in beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maximum memory&lt;/td&gt;
&lt;td&gt;2 GB, 1 vCPU&lt;/td&gt;
&lt;td&gt;4 GB, 2 vCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request or response body&lt;/td&gt;
&lt;td&gt;4.5 MB&lt;/td&gt;
&lt;td&gt;4.5 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything that has to run longer, hold a connection open for hours, or keep state in memory between requests fits a long-running server like Railway better.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do Railway and Vercel price?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Vercel&lt;/th&gt;
&lt;th&gt;Railway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Hobby: free for non-commercial use, with included limits&lt;/td&gt;
&lt;td&gt;Free plan: $1 of credit a month after a $5 trial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid plan&lt;/td&gt;
&lt;td&gt;Pro: $20 per seat a month, $20 of usage included&lt;/td&gt;
&lt;td&gt;Hobby $5 with $5 of usage; Pro $20 per workspace with $20 of usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;Active CPU from $0.128 per hour, memory from $0.0106 per GB-hour&lt;/td&gt;
&lt;td&gt;about $20 per vCPU and $10 per GB a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests&lt;/td&gt;
&lt;td&gt;Invocations from $0.60 per million&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;1 TB on Pro, then from $0.15 per GB&lt;/td&gt;
&lt;td&gt;$0.05 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The per-seat model is the line to watch. A team of five on Vercel Pro pays $100 a month in seats before usage. Railway's Pro fee is per workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Railway host Next.js?
&lt;/h2&gt;

&lt;p&gt;Yes. Railway runs Next.js as a Node server with &lt;code&gt;next start&lt;/code&gt;, including server rendering, API routes and middleware. You give up Vercel's per-branch preview URLs on its global edge, image optimization at the CDN, and the zero-configuration build, and you gain a server with no function time limits and flat usage pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Vercel host my backend?
&lt;/h2&gt;

&lt;p&gt;For an API made of short request handlers, yes: Vercel Functions run Node.js, Python, Go and other runtimes. It stops fitting when you need a process that runs continuously, a queue consumer, a Discord bot, a server holding many WebSocket connections, or a database. Those need a host like Railway.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I use Vercel and Railway together?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Deploy the frontend to Vercel and the API, workers and Postgres to Railway.&lt;/li&gt;
&lt;li&gt;Pick regions close to each other. Vercel Functions run in a single region by default, so match your Railway region to it to keep each API call short.&lt;/li&gt;
&lt;li&gt;Point the frontend at the API with an environment variable, and allow the Vercel domain in the API's CORS settings.&lt;/li&gt;
&lt;li&gt;Keep secrets for the database on the Railway side only. The frontend talks to your API, never to the database directly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Railway or Vercel: which should you pick?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you are building&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A Next.js marketing site or frontend&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A REST or GraphQL API with Postgres&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A full-stack Next.js app with a database&lt;/td&gt;
&lt;td&gt;Vercel for the app plus a database provider, or Railway for both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workers, bots, cron jobs&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A commercial project on a free plan&lt;/td&gt;
&lt;td&gt;Neither: Vercel Hobby is non-commercial, and Railway's free credit is $1 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://ownkube.io/compare/vercel-alternatives" rel="noopener noreferrer"&gt;Vercel alternatives guide&lt;/a&gt; covers more backend options next to Vercel, including Netlify.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Railway a Vercel alternative?
&lt;/h3&gt;

&lt;p&gt;For backends and long-running services, yes. For frontends, Railway can run Next.js as a server, but it lacks Vercel's global edge network and per-branch preview URLs on a CDN. Many teams use Vercel for the frontend and Railway for the backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Vercel Hobby for a commercial project?
&lt;/h3&gt;

&lt;p&gt;No. Vercel's Hobby plan is for personal, non-commercial use. Commercial projects need Pro at $20 per seat a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Vercel support WebSockets?
&lt;/h3&gt;

&lt;p&gt;WebSocket support on Vercel Functions is in public beta on all plans. For a server that holds many long-lived connections, a long-running host is still the more predictable choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which is cheaper, Railway or Vercel?
&lt;/h3&gt;

&lt;p&gt;They bill different things. For a frontend with mostly static pages, Vercel's included usage often covers it. For an always-on API or worker, Railway's metered containers are cheaper than keeping functions busy, and Railway does not charge per seat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9gjiwftmi2wunqht27x.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9gjiwftmi2wunqht27x.webp" alt="The Ownkube new deployment picker listing web app, background worker, database, cache and cron job" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ownkube is a backend host in the Railway mold: web apps, workers, cron jobs, managed Postgres and a Valkey cache, built from your repo and served on a &lt;code&gt;*.ownkube.app&lt;/code&gt; hostname with HTTPS. It runs next to a Vercel frontend the same way Railway does.&lt;/p&gt;

&lt;p&gt;Usage bills per minute from a prepaid wallet at about $18 per vCPU and $6 per GiB a month, with no per-seat fee, and unused credit never expires. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>railway</category>
      <category>vercel</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Replit alternatives: where to build and host your app instead</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:07:05 +0000</pubDate>
      <link>https://dev.to/abhijais1/replit-alternatives-where-to-build-and-host-your-app-instead-60c</link>
      <guid>https://dev.to/abhijais1/replit-alternatives-where-to-build-and-host-your-app-instead-60c</guid>
      <description>&lt;p&gt;Replit puts three things on one bill: a browser workspace, the Replit Agent that writes code for you, and hosting for the app it builds. The right alternative depends on which of those you want to replace. Lovable and Bolt replace the agent and the workspace. Cursor or Claude Code in your own editor replaces both with tools you run locally. Render, Railway, Fly.io and Ownkube replace the hosting, which is where most of a running app's bill ends up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our picks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Another browser AI builder with hosting included&lt;/td&gt;
&lt;td&gt;Lovable or Bolt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;To write code with an AI agent in your own editor&lt;/td&gt;
&lt;td&gt;Cursor or Claude Code, deployed anywhere below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app, workers, cron jobs and Postgres on one prepaid bill&lt;/td&gt;
&lt;td&gt;Ownkube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A few steady services at flat monthly prices&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast setup for several small services&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servers close to users on several continents&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A frontend on a global CDN&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Replit costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What it adds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Daily Agent credits up to a monthly cap, one published app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core&lt;/td&gt;
&lt;td&gt;$20 a month, or $18 billed annually&lt;/td&gt;
&lt;td&gt;Unlimited published apps, Full build, pay as you go past the credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$100 a month, or $90 billed annually&lt;/td&gt;
&lt;td&gt;10 parallel agents, up to 15 collaborators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Security and admin controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Starter plan's published app goes down after 30 days unless you publish it again, and it carries a Replit badge. Starter also gets Lite build only. Full build needs Core or Pro.&lt;/p&gt;

&lt;p&gt;Publishing bills against the plan's monthly credits first, then as usage:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deployment type&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Autoscale&lt;/td&gt;
&lt;td&gt;$2 a month base, $0.60 per million compute units, $0.40 per million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reserved VM&lt;/td&gt;
&lt;td&gt;$15 a month (0.5 shared vCPU, 2 GB) up to $130 (4 vCPU, 16 GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static&lt;/td&gt;
&lt;td&gt;Free hosting, $0.05 per GB of transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled&lt;/td&gt;
&lt;td&gt;$2 a month base, $0.60 per million compute units&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A compute unit is 1/18 of a CPU second, or half a GB-second of memory. Agent usage bills by effort, so a long building session draws more credit than a short fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people look for a Replit alternative
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The agent and the app share one balance
&lt;/h3&gt;

&lt;p&gt;Agent work and running apps both draw on the same credits. A busy week of building can use credit that would have kept the app online, and the cost of an Agent session is hard to know before it runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The free app expires
&lt;/h3&gt;

&lt;p&gt;On Starter, a published app goes down after 30 days. That works for a demo. For anything people rely on, it means a paid plan or another host.&lt;/p&gt;

&lt;h3&gt;
  
  
  The region is fixed at publish
&lt;/h3&gt;

&lt;p&gt;Paid plans can pick where an app runs, and Starter apps publish to North America by default. Once an app is published, its geography can't be changed. Moving it means a new deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  You want your code in your own tools
&lt;/h3&gt;

&lt;p&gt;Some people start in Replit and then want a local editor, their own git workflow and a coding agent they already pay for. At that point Replit's workspace and hosting are separate decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternatives, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lovable
&lt;/h3&gt;

&lt;p&gt;Lovable is the closest match to the Replit Agent workflow: describe the app in a chat and it builds it, with hosting on Lovable Cloud. The free plan gives 5 build credits a day, up to 30 a month, plus 20 Cloud credits a month. Paid monthly credits expire two months after they are issued. Small apps usually host within the included grant, and larger or busier ones draw from your credit balance. See &lt;a href="https://lovable.dev/pricing" rel="noopener noreferrer"&gt;Lovable's pricing&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bolt
&lt;/h3&gt;

&lt;p&gt;Bolt builds apps from a prompt in the browser and hosts them on every plan. The free plan has 1 million tokens a month with a 300,000 daily limit, and no custom domain. Pro is $25 a month for 10 million tokens that roll over, and Teams is $30 per member a month. See &lt;a href="https://bolt.new/pricing" rel="noopener noreferrer"&gt;Bolt's pricing&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor or Claude Code, in your own editor
&lt;/h3&gt;

&lt;p&gt;These are coding agents that work on a repository on your machine. They write and edit code the way the Replit Agent does, but the code lives in your git repo and the hosting is your choice. Both can connect to Ownkube's MCP server and deploy the app, read logs and manage the database from the same session. The setup steps are on the &lt;a href="https://ownkube.io/agents/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; and &lt;a href="https://ownkube.io/agents/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render
&lt;/h3&gt;

&lt;p&gt;Render runs always-on services at flat monthly prices. The Hobby workspace is $0 and compute bills on top: a web service starts at $7 a month for 0.5 CPU and 512 MB, and Postgres starts at $6. A free instance exists for trying things out, and it spins down when idle. &lt;a href="https://ownkube.io/compare/render-pricing-explained" rel="noopener noreferrer"&gt;Render pricing explained&lt;/a&gt; has the full rate card.&lt;/p&gt;

&lt;h3&gt;
  
  
  Railway
&lt;/h3&gt;

&lt;p&gt;Railway bills usage per second. Hobby is $5 a month and includes $5 of usage, and there is a Free plan with $1 of monthly credit. It is quick to set up several services and a database from one project. See &lt;a href="https://ownkube.io/compare/railway-pricing-explained" rel="noopener noreferrer"&gt;Railway pricing explained&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fly.io
&lt;/h3&gt;

&lt;p&gt;Fly.io runs machines in many regions, which suits apps whose users are spread across continents. The smallest machine is $2.19 a month for a shared CPU and 256 MB, and managed Postgres starts at $38 a month. See &lt;a href="https://ownkube.io/compare/fly-io-pricing-explained" rel="noopener noreferrer"&gt;Fly.io pricing explained&lt;/a&gt; for the rate card.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel
&lt;/h3&gt;

&lt;p&gt;Vercel is the pick for a Next.js or static frontend. Hobby is free for personal, non-commercial projects, and Pro is $20 per developer seat a month. Server code runs as functions with time limits, so a worker or a long job needs another host. &lt;a href="https://ownkube.io/compare/is-vercel-free" rel="noopener noreferrer"&gt;Is Vercel free?&lt;/a&gt; covers the Hobby rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ownkube
&lt;/h3&gt;

&lt;p&gt;Ownkube runs the whole app: web services, workers, scheduled jobs, Postgres from $4 a month and a Valkey cache from $2. Compute is metered at about $18 per vCPU a month and $6 per GiB, by the minute, or you pick a flat box per app. Apps run in Mumbai or Germany. Ownkube has no AI of its own; you bring the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replit vs Ownkube
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Replit&lt;/th&gt;
&lt;th&gt;Ownkube&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where you write code&lt;/td&gt;
&lt;td&gt;Replit's browser workspace&lt;/td&gt;
&lt;td&gt;Your own editor and repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Replit Agent, billed by effort&lt;/td&gt;
&lt;td&gt;Your own coding agent, connected through MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always-on app&lt;/td&gt;
&lt;td&gt;Reserved VM from $15 a month&lt;/td&gt;
&lt;td&gt;Metered from about $7.50 a month (0.25 vCPU, 0.5 GiB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;Built in, billed from credits&lt;/td&gt;
&lt;td&gt;From $4 a month plus $0.25 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background work&lt;/td&gt;
&lt;td&gt;Reserved VMs and scheduled deployments&lt;/td&gt;
&lt;td&gt;Workers and scheduled jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing&lt;/td&gt;
&lt;td&gt;Plan credits, then pay as you go&lt;/td&gt;
&lt;td&gt;Prepaid wallet; apps pause when it runs out&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The wallet is the main difference in how the bill behaves. Pay as you go starts with a $5 top-up, Personal is $5 a month and loads $5 of credit, and Team is $20 a month and loads $20. Credit never expires. When it runs out, apps pause and keep their data until you top up, so a month can't cost more than you loaded.&lt;/p&gt;

&lt;p&gt;Sleep is opt-in. An idle app bills nothing for compute and a sleeping database bills storage only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving an app off Replit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Push the code from Replit to a GitHub repository.&lt;/li&gt;
&lt;li&gt;Copy the values from Replit's Secrets into a note you can paste from.&lt;/li&gt;
&lt;li&gt;Create the new app from the repo in the Ownkube dashboard, or run &lt;code&gt;okctl up&lt;/code&gt; in the project directory.&lt;/li&gt;
&lt;li&gt;Add the secrets as variables on the app.&lt;/li&gt;
&lt;li&gt;Create a Postgres database, then move the data with &lt;code&gt;pg_dump&lt;/code&gt; and &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Point the app's database URL at the new database and redeploy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to stay on Replit
&lt;/h2&gt;

&lt;p&gt;Stay if you mostly build with the Replit Agent and like working in the browser. Replit keeps the agent, the workspace and hosting in one place, and splitting them adds steps. A prototype that only needs to run for a demo also fits the Starter plan well.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist before you move
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Which part do you want to replace: the agent, the workspace, the hosting, or all three?&lt;/li&gt;
&lt;li&gt;Does the app need to stay online for more than 30 days?&lt;/li&gt;
&lt;li&gt;Do you need a worker or a job that runs longer than a request?&lt;/li&gt;
&lt;li&gt;Where are your users, and which regions does the new host offer?&lt;/li&gt;
&lt;li&gt;Do you want a hard ceiling on what a month can cost?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the best free alternative to Replit?
&lt;/h3&gt;

&lt;p&gt;For building with an AI agent in the browser, Lovable and Bolt both have free plans. For hosting, Render has a free instance that spins down when idle and Railway has a Free plan with $1 of monthly credit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Replit free?
&lt;/h3&gt;

&lt;p&gt;The Starter plan is $0 with daily Agent credits and one published app. That app goes down after 30 days unless you publish it again.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does Replit hosting cost?
&lt;/h3&gt;

&lt;p&gt;A Reserved VM starts at $15 a month for 0.5 of a shared vCPU and 2 GB. Autoscale has a $2 monthly base plus compute units and requests. Static hosting is free with $0.05 per GB of transfer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I export my code from Replit?
&lt;/h3&gt;

&lt;p&gt;Yes. Push it to a GitHub repository and deploy it from there on any host in this list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I keep using an AI agent after leaving Replit?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;a href="https://ownkube.io/agents/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://ownkube.io/agents/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, &lt;a href="https://ownkube.io/agents/codex" rel="noopener noreferrer"&gt;Codex&lt;/a&gt; and &lt;a href="https://ownkube.io/agents/windsurf" rel="noopener noreferrer"&gt;Windsurf&lt;/a&gt; work on your own repo, and each can connect to Ownkube's MCP server, so the agent that writes the code can also deploy it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;If Replit got your app built and you now want it hosted with its Postgres, workers and cron jobs on one prepaid bill, Ownkube runs it in Mumbai or Germany. Bring the code from GitHub and the agent you already use. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>replit</category>
      <category>webdev</category>
      <category>ai</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Supabase vs Firebase: database, pricing, auth and lock-in compared</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 13:51:58 +0000</pubDate>
      <link>https://dev.to/abhijais1/supabase-vs-firebase-database-pricing-auth-and-lock-in-compared-3n5n</link>
      <guid>https://dev.to/abhijais1/supabase-vs-firebase-database-pricing-auth-and-lock-in-compared-3n5n</guid>
      <description>&lt;p&gt;Supabase and Firebase both give a frontend a database, auth, file storage and functions without running a server. The difference starts with the database. Supabase is Postgres, with tables, joins and SQL, and it bills a plan fee plus compute size. Firebase is Firestore, a document store with offline sync, and it bills per document read and write. Pick Supabase if your data is relational or you want to keep the option to leave. Pick Firebase if you are building a mobile app that leans on offline sync and Google's mobile tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase is Postgres. Firebase's main database, Firestore, stores documents and has no joins.&lt;/li&gt;
&lt;li&gt;Supabase Pro is $25 a month and includes $10 of compute credit. Firebase Blaze has no base fee and bills each read, write and GB.&lt;/li&gt;
&lt;li&gt;Both free plans include 50,000 monthly active users for auth. Supabase Free pauses a project after a week of inactivity, and Firebase Spark caps Firestore at 50,000 reads a day.&lt;/li&gt;
&lt;li&gt;Supabase Pro has a spend cap on by default for usage lines. Firebase has budget alerts, which do not stop spending.&lt;/li&gt;
&lt;li&gt;Supabase is open source and can be self-hosted. Firebase runs only on Google Cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supabase vs Firebase at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;Firebase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;Firestore (documents), Realtime Database (JSON tree)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queries&lt;/td&gt;
&lt;td&gt;SQL with joins&lt;/td&gt;
&lt;td&gt;Document queries, no joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access rules&lt;/td&gt;
&lt;td&gt;Postgres row level security&lt;/td&gt;
&lt;td&gt;Firebase security rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;Edge Functions on Deno (TypeScript)&lt;/td&gt;
&lt;td&gt;Cloud Functions (Node.js, Python)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Offline sync&lt;/td&gt;
&lt;td&gt;Not built in&lt;/td&gt;
&lt;td&gt;Built into the Firestore SDKs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push, crash reports, analytics&lt;/td&gt;
&lt;td&gt;Not included&lt;/td&gt;
&lt;td&gt;Cloud Messaging, Crashlytics, Analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing model&lt;/td&gt;
&lt;td&gt;Plan fee plus compute size&lt;/td&gt;
&lt;td&gt;Pay per read, write, GB and invocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;Yes, with Docker or the CLI&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How do the data models differ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Supabase: tables and SQL
&lt;/h3&gt;

&lt;p&gt;A Supabase project is a full Postgres database. You define tables, foreign keys and indexes, and query them with SQL or through the API Supabase generates from your schema. A report that joins orders, customers and products is one query.&lt;/p&gt;

&lt;p&gt;Postgres extensions come with it. pgvector stores embeddings next to the rows they describe, and PostGIS handles location queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Firebase: documents and collections
&lt;/h3&gt;

&lt;p&gt;Firestore stores JSON-like documents in collections. Queries filter and sort within a collection, and there are no joins, so data that would be related in SQL is usually copied into each document that needs it. Updating a customer's name can mean writing to every order that holds a copy.&lt;/p&gt;

&lt;p&gt;In exchange, Firestore's mobile and web SDKs cache data on the device, work offline and sync changes when the connection returns. Real-time listeners push updates to every client watching a document.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does pricing compare?
&lt;/h2&gt;

&lt;p&gt;The two bill in different units, so the cheaper one depends on traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Firebase bills per operation
&lt;/h3&gt;

&lt;p&gt;On Blaze, Firestore bills each document read, write and delete past a daily free quota.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Firestore location&lt;/th&gt;
&lt;th&gt;Reads per 100K&lt;/th&gt;
&lt;th&gt;Writes per 100K&lt;/th&gt;
&lt;th&gt;Storage per GiB a month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mumbai&lt;/td&gt;
&lt;td&gt;$0.035&lt;/td&gt;
&lt;td&gt;$0.104&lt;/td&gt;
&lt;td&gt;$0.104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frankfurt&lt;/td&gt;
&lt;td&gt;$0.039&lt;/td&gt;
&lt;td&gt;$0.117&lt;/td&gt;
&lt;td&gt;$0.117&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every document a query returns is a read, so a list screen with 50 items costs 50 reads each time it opens. &lt;a href="https://ownkube.io/compare/firebase-pricing-explained" rel="noopener noreferrer"&gt;Firebase pricing explained&lt;/a&gt; covers Functions, Hosting and Storage line by line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supabase bills per plan and compute size
&lt;/h3&gt;

&lt;p&gt;Pro is $25 a month per organization and includes $10 of compute credit, which covers one Micro project (1 GB of memory). Bigger sizes cost more: Small is about $15 a month and Medium about $60. Queries are not counted, so the bill follows the size the database needs. &lt;a href="https://ownkube.io/compare/supabase-pricing-explained" rel="noopener noreferrer"&gt;Supabase pricing explained&lt;/a&gt; has the full compute table.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pro quota&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Past the quota&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database disk&lt;/td&gt;
&lt;td&gt;8 GB per project&lt;/td&gt;
&lt;td&gt;$0.125 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;$0.09 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly active users&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;$0.00325 per user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File storage&lt;/td&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;td&gt;$0.0213 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge Function invocations&lt;/td&gt;
&lt;td&gt;2 million&lt;/td&gt;
&lt;td&gt;$2 per million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime messages&lt;/td&gt;
&lt;td&gt;5 million&lt;/td&gt;
&lt;td&gt;$2.50 per million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime connections&lt;/td&gt;
&lt;td&gt;500 concurrent&lt;/td&gt;
&lt;td&gt;$10 per 1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Two example bills
&lt;/h3&gt;

&lt;p&gt;A small app with 6 million Firestore reads, 900,000 writes and 2 GiB of data a month costs about $2 in Mumbai on Firebase. The same app on Supabase Pro is $25, or $0 on Supabase Free if it fits in 500 MB and stays active.&lt;/p&gt;

&lt;p&gt;A busy app with 30 million reads, 3 million writes and 5 GiB costs about $12.90 a month in Mumbai on Firestore, with reads making up about three quarters of that. Supabase Pro stays at $25 while the database fits on Micro. Firebase is cheaper at low and moderate traffic. Its read charges grow in step with traffic, while a Supabase bill moves when you change the compute size.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do the free plans compare?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Supabase Free&lt;/th&gt;
&lt;th&gt;Firebase Spark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Postgres, 500 MB&lt;/td&gt;
&lt;td&gt;Firestore, 1 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database limits&lt;/td&gt;
&lt;td&gt;Two active projects&lt;/td&gt;
&lt;td&gt;50,000 reads, 20,000 writes and 20,000 deletes a day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress&lt;/td&gt;
&lt;td&gt;5 GB&lt;/td&gt;
&lt;td&gt;10 GiB a month from Firestore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;50,000 monthly active users&lt;/td&gt;
&lt;td&gt;50,000 monthly active users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File storage&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;Needs Blaze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;500,000 Edge Function invocations&lt;/td&gt;
&lt;td&gt;Needs Blaze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime&lt;/td&gt;
&lt;td&gt;200 concurrent connections, 2 million messages&lt;/td&gt;
&lt;td&gt;Listener updates bill as reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inactivity&lt;/td&gt;
&lt;td&gt;Project pauses after a week&lt;/td&gt;
&lt;td&gt;No pause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backups&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Spark has no inactivity pause, which makes it the better home for a small app that gets little traffic. Supabase Free is the better fit when you need file storage or functions without a payment method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auth, storage and functions
&lt;/h2&gt;

&lt;p&gt;Both include email, password and social sign-in, and both give 50,000 monthly active users on the free plan. On paid plans, Supabase Pro includes 100,000 and bills $0.00325 per user past that. Firebase bills past 50,000 at Google Cloud rates, and phone sign-in bills per SMS. Supabase's phone multi-factor authentication is a $75 a month add-on for the first project.&lt;/p&gt;

&lt;p&gt;Supabase Storage is part of every plan, with 1 GB on Free and 100 GB on Pro. On Firebase, Cloud Storage needs Blaze, and its free amounts only apply to buckets in three US regions.&lt;/p&gt;

&lt;p&gt;Supabase Edge Functions run TypeScript on Deno. Firebase Cloud Functions run Node.js or Python on Google Cloud, with 2 million invocations a month free on Blaze, then $0.40 per million plus CPU and memory time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spend limits and backups
&lt;/h2&gt;

&lt;p&gt;Supabase Pro has a spend cap, on by default. With it on, usage past a quota stops until the next billing cycle. It covers disk, egress, users, storage, realtime and function invocations. Compute size and point-in-time recovery bill whether the cap is on or off.&lt;/p&gt;

&lt;p&gt;Firebase has no spend cap. A Google Cloud budget sends alerts, and stopping the bill means disabling billing on the project or turning services off yourself.&lt;/p&gt;

&lt;p&gt;Supabase Pro includes daily backups kept 7 days. Point-in-time recovery is $100 a month per 7 days of retention. Firestore backups and point-in-time recovery have no free usage and bill once enabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regions
&lt;/h2&gt;

&lt;p&gt;Supabase lets you pick a region per project, including Mumbai (&lt;code&gt;ap-south-1&lt;/code&gt;), Frankfurt (&lt;code&gt;eu-central-1&lt;/code&gt;) and London (&lt;code&gt;eu-west-2&lt;/code&gt;). Firestore has locations in Mumbai (&lt;code&gt;asia-south1&lt;/code&gt;) and Frankfurt (&lt;code&gt;europe-west3&lt;/code&gt;), plus a Europe multi-region (&lt;code&gt;eur3&lt;/code&gt;) that costs more. Put the database in the same region as most of your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lock-in
&lt;/h2&gt;

&lt;p&gt;Supabase is open source, and you can run it yourself with Docker. Because the database is Postgres, &lt;code&gt;pg_dump&lt;/code&gt; moves the data to any Postgres host, and the SQL and row level security policies come with it.&lt;/p&gt;

&lt;p&gt;Firebase runs only on Google Cloud. Moving off Firestore means exporting documents and redesigning them into another data model, and the client code that calls the Firebase SDK changes too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you pick?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your app&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mobile app that must work offline&lt;/td&gt;
&lt;td&gt;Firebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uses push notifications, Crashlytics and Analytics&lt;/td&gt;
&lt;td&gt;Firebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relational data, reports or joins&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector search next to app data&lt;/td&gt;
&lt;td&gt;Supabase, with pgvector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small app with little traffic and no payment method&lt;/td&gt;
&lt;td&gt;Firebase Spark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wants a spend cap on usage&lt;/td&gt;
&lt;td&gt;Supabase Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wants to self-host later&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How Ownkube compares
&lt;/h2&gt;

&lt;p&gt;Ownkube is a different shape from both. It runs your own backend, workers, scheduled jobs and a Postgres database, billed by the resources they use. It has no built-in auth, file storage or client SDK, so you bring a library for each. This fits a project that has outgrown calling the database straight from the frontend.&lt;/p&gt;

&lt;p&gt;Postgres starts at $4 a month on a DB 0.5 box, plus $0.25 per GB of storage, and Postgres extensions such as pgvector and PostGIS turn on from the database settings. Compute bills at about $18 per vCPU a month and $6 per GiB, by the minute. Apps run in Mumbai or Germany.&lt;/p&gt;

&lt;p&gt;Billing works from a prepaid wallet. Pay as you go starts with a $5 top-up, Personal is $5 a month and loads $5 of credit, and Team is $20 a month and loads $20. Credit never expires. When it runs out, apps pause and keep their data until you top up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist before you pick
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is your data relational, or does it fit in self-contained documents?&lt;/li&gt;
&lt;li&gt;Does the app need to work offline on a phone?&lt;/li&gt;
&lt;li&gt;How many documents does a busy screen read, and how often does it open?&lt;/li&gt;
&lt;li&gt;Do you need a hard cap on usage, or are budget alerts enough?&lt;/li&gt;
&lt;li&gt;Would you want to move the database to another host one day?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For other Postgres hosts, see &lt;a href="https://ownkube.io/compare/supabase-alternative" rel="noopener noreferrer"&gt;Supabase alternatives&lt;/a&gt;, &lt;a href="https://ownkube.io/compare/neon-vs-supabase" rel="noopener noreferrer"&gt;Neon vs Supabase&lt;/a&gt; and &lt;a href="https://ownkube.io/compare/managed-postgres-pricing" rel="noopener noreferrer"&gt;managed Postgres pricing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Supabase better than Firebase?
&lt;/h3&gt;

&lt;p&gt;For relational data, SQL and a path to self-hosting, Supabase fits better. For a mobile app that needs offline sync, push notifications and crash reporting from one SDK, Firebase fits better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Supabase cheaper than Firebase?
&lt;/h3&gt;

&lt;p&gt;At low traffic, usually not: a small Firestore app often costs a few dollars a month on Blaze or nothing on Spark, while Supabase Pro starts at $25. Firestore bills every read, so a read-heavy app can cost more on Firebase once its traffic grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I migrate from Firebase to Supabase?
&lt;/h3&gt;

&lt;p&gt;Yes. Firestore documents have to be mapped to tables, the security rules rewritten as row level security policies, and the client code moved from the Firebase SDK to the Supabase client. Firebase Auth users can be exported and imported.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Supabase have offline sync like Firebase?
&lt;/h3&gt;

&lt;p&gt;Not built in. Supabase's client libraries query the database over the network. Apps that need offline sync add a separate library for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I self-host Firebase?
&lt;/h3&gt;

&lt;p&gt;No. Firebase runs on Google Cloud only. The Firebase emulators run locally for development and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;If your app has its own API and uses Supabase or Firebase mostly as a database, Ownkube runs the API, its workers and Postgres together from a prepaid wallet. If you miss the dashboard's table editor, the Marketplace installs &lt;a href="https://ownkube.io/templates/directus-postgres" rel="noopener noreferrer"&gt;Directus&lt;/a&gt; (an admin studio and instant API) or &lt;a href="https://ownkube.io/templates/nocodb" rel="noopener noreferrer"&gt;NocoDB&lt;/a&gt; (a spreadsheet view), each with its own Postgres. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>firebase</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Railway vs Fly.io in 2026: pricing, regions and Postgres compared</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 13:36:52 +0000</pubDate>
      <link>https://dev.to/abhijais1/railway-vs-flyio-in-2026-pricing-regions-and-postgres-compared-114m</link>
      <guid>https://dev.to/abhijais1/railway-vs-flyio-in-2026-pricing-regions-and-postgres-compared-114m</guid>
      <description>&lt;p&gt;Railway and Fly.io both run your containers without a cluster to manage, and they come at it from different directions. Railway is dashboard first: a project canvas, templates, and usage metered per second. Fly.io is infrastructure first: you run Machines, small VMs you size and place in the regions you choose, configured through &lt;code&gt;fly.toml&lt;/code&gt; and the &lt;code&gt;flyctl&lt;/code&gt; CLI.&lt;/p&gt;

&lt;p&gt;This post compares how each prices, how they handle databases and idle apps, and which fits which kind of project. Prices were checked on 2026-10-13.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Railway&lt;/strong&gt; bills usage at about $20 per vCPU and $10 per GB of memory a month. Hobby is $5 with $5 of usage included. It is the easier of the two to start with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fly.io&lt;/strong&gt; bills each Machine by size while it runs, from $2.19 a month for shared-cpu-1x with 256 MB. Stopped Machines bill no CPU or memory. It is the stronger choice for apps that need to run close to users in several regions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postgres&lt;/strong&gt; is the biggest price gap. Fly's Managed Postgres starts at $38 a month. Railway runs Postgres as a metered service, so a small database costs a few dollars.&lt;/li&gt;
&lt;li&gt;For a small app with a database, Railway is cheaper. For a single tiny always-on app, Fly is cheaper.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do Railway and Fly.io price?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Railway&lt;/th&gt;
&lt;th&gt;Fly.io&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Billing model&lt;/td&gt;
&lt;td&gt;Metered CPU and memory per second&lt;/td&gt;
&lt;td&gt;Machine size per second while running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plans&lt;/td&gt;
&lt;td&gt;Free ($1 credit a month), Hobby $5, Pro $20&lt;/td&gt;
&lt;td&gt;Pay as you go; support plans from $29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smallest service&lt;/td&gt;
&lt;td&gt;Whatever it uses, from cents&lt;/td&gt;
&lt;td&gt;shared-cpu-1x 256 MB at $2.19 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical sizes&lt;/td&gt;
&lt;td&gt;about $20 per vCPU, $10 per GB a month&lt;/td&gt;
&lt;td&gt;512 MB $3.69, 1 GB $6.70, shared-cpu-2x 2 GB $13.39, performance-1x 2 GB $33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle apps&lt;/td&gt;
&lt;td&gt;Optional Serverless sleep after 5 to 10 minutes without outbound traffic&lt;/td&gt;
&lt;td&gt;Autostop stops or suspends Machines; stopped Machines bill only their root disk at $0.15 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;about $0.15 per GB&lt;/td&gt;
&lt;td&gt;$0.15 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress&lt;/td&gt;
&lt;td&gt;$0.05 per GB&lt;/td&gt;
&lt;td&gt;$0.02 per GB in North America and Europe, $0.04 in Asia Pacific, $0.12 in Africa and India&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extras&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Dedicated IPv4 $2 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fly's Machine prices also vary by region: a 1 GB Machine is $7.73 a month in Frankfurt and $8.50 in Singapore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which is cheaper, Railway or Fly.io?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Railway&lt;/th&gt;
&lt;th&gt;Fly.io&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small always-on app (512 MB, 0.1 vCPU average)&lt;/td&gt;
&lt;td&gt;about $7 on Hobby&lt;/td&gt;
&lt;td&gt;$3.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App + Postgres (app 0.25 vCPU / 0.5 GB, 5 GB database, 10 GB egress)&lt;/td&gt;
&lt;td&gt;about $18.25&lt;/td&gt;
&lt;td&gt;about $42 with Managed Postgres&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A 24/7 Discord bot&lt;/td&gt;
&lt;td&gt;inside the $5 Hobby plan&lt;/td&gt;
&lt;td&gt;Fly's own example: $2.21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fly wins on a single small Machine, because a fixed 512 MB size costs less than Railway's memory rate. Railway wins as soon as a managed database joins, because Fly's Managed Postgres starts at $38. You can run Postgres yourself on a Fly Machine with a volume for a few dollars, and then backups, failover and upgrades are yours.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ownkube.io/compare/fly-io-pricing-explained" rel="noopener noreferrer"&gt;Fly.io pricing explained&lt;/a&gt; and &lt;a href="https://ownkube.io/compare/railway-pricing-explained" rel="noopener noreferrer"&gt;Railway pricing explained&lt;/a&gt; walk through each bill in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do regions compare?
&lt;/h2&gt;

&lt;p&gt;Fly.io is built around placing Machines in many regions and routing each user to the nearest one through its Anycast network. Running the same app in three regions is a &lt;code&gt;fly scale count&lt;/code&gt; command away, and a read replica of your database can sit next to each copy. Railway lets you choose a region per service and is the simpler model for an app that serves one market.&lt;/p&gt;

&lt;p&gt;If your users are spread across continents and latency matters, Fly has the edge. If they are mostly in one region, the multi-region model is complexity you do not need.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do the developer experiences compare?
&lt;/h2&gt;

&lt;p&gt;Railway is configured in the dashboard: a canvas of services, one-click templates, variables shared across services, and preview environments per pull request. Most people deploy their first app without reading docs.&lt;/p&gt;

&lt;p&gt;Fly.io is configured in &lt;code&gt;fly.toml&lt;/code&gt; and driven by &lt;code&gt;flyctl&lt;/code&gt;. You get fine control over Machines, volumes, health checks, and placement. Expect to read the docs and to run a few CLI commands for things the Railway dashboard does with a click.&lt;/p&gt;

&lt;h2&gt;
  
  
  Railway or Fly.io: which should you pick?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Want the fastest path from repo to URL&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need an app and a managed Postgres on a small budget&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serve users on several continents&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run one tiny always-on process&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefer configuration as code and a CLI&lt;/td&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Fly.io cheaper than Railway?
&lt;/h3&gt;

&lt;p&gt;For a single small always-on app, yes: a 512 MB Machine is $3.69 a month, against about $7 of Railway usage for the same memory. With a managed database, Railway is cheaper, because Fly's Managed Postgres starts at $38 a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Fly.io have a free tier?
&lt;/h3&gt;

&lt;p&gt;Fly.io is pay as you go. Small Machines cost a few dollars a month, and stopped Machines bill only their root disk storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Railway run in multiple regions like Fly.io?
&lt;/h3&gt;

&lt;p&gt;Railway lets you pick a region for each service. Fly.io is designed around running copies of an app in many regions with Anycast routing to the nearest one, which suits globally distributed apps better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it easy to move between Railway and Fly.io?
&lt;/h3&gt;

&lt;p&gt;Both run containers from a Dockerfile, and Railway also builds without one. Moving means recreating services and variables, copying the database with &lt;code&gt;pg_dump&lt;/code&gt; and &lt;code&gt;pg_restore&lt;/code&gt;, and switching DNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Froxbwwohmgoy6ebbbdqy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Froxbwwohmgoy6ebbbdqy.webp" alt="An Ownkube app page showing the build pipeline and live telemetry for CPU, memory, requests per minute, P95 latency and network traffic" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ownkube sits between the two on price and closer to Railway on experience.&lt;/p&gt;

&lt;p&gt;CPU and memory are metered per minute at about $18 per vCPU and $6 per GiB a month, and managed Postgres runs on a flat box from $4 a month plus $0.25 per GB, with backups on the Personal and Team plans. The app + Postgres stack above comes to about $12.95 a month in the Germany region.&lt;/p&gt;

&lt;p&gt;Usage draws a prepaid wallet, so the bill never runs past what you loaded, and credit never expires. See &lt;a href="https://ownkube.io/compare/fly-io-alternatives" rel="noopener noreferrer"&gt;Fly.io alternatives&lt;/a&gt; for more options, or &lt;a href="https://ownkube.io/hosting/go" rel="noopener noreferrer"&gt;Go hosting&lt;/a&gt; for how a Go app runs on Ownkube. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>railway</category>
      <category>webdev</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>Is Vercel free? What the Hobby plan covers in 2026</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 13:21:23 +0000</pubDate>
      <link>https://dev.to/abhijais1/is-vercel-free-what-the-hobby-plan-covers-in-2026-2ke</link>
      <guid>https://dev.to/abhijais1/is-vercel-free-what-the-hobby-plan-covers-in-2026-2ke</guid>
      <description>&lt;p&gt;Yes, for personal projects. Vercel's Hobby plan costs $0, but it is for personal, non-commercial use only. Once anyone involved makes money from a project, including a freelancer paid to build it, Vercel expects it on Pro at $20 per developer seat a month. Hobby usage is also capped. You can't pay for more, and a project that hits a limit usually waits 30 days before that feature works again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hobby is $0 with one developer seat, for personal and non-commercial projects.&lt;/li&gt;
&lt;li&gt;Ads, payments, affiliate sites and being paid to build or host the site all count as commercial. Asking for donations does not.&lt;/li&gt;
&lt;li&gt;Each month includes 100 GB of transfer, 1M function invocations, 4 hours of active CPU and 360 GB-hours of function memory.&lt;/li&gt;
&lt;li&gt;Past a limit you can't buy more usage, and in most cases the feature stays off for 30 days.&lt;/li&gt;
&lt;li&gt;Cron jobs run at most once a day, a function run stops at 300 seconds, and runtime logs keep one hour.&lt;/li&gt;
&lt;li&gt;Pro is $20 per developer seat a month with $20 of usage included. &lt;a href="https://ownkube.io/compare/vercel-pricing-explained" rel="noopener noreferrer"&gt;Vercel pricing explained&lt;/a&gt; works through Pro bills line by line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What does the Vercel Hobby plan include?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Hobby allowance each month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast Data Transfer&lt;/td&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast Origin Transfer&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN requests&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function invocations&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active CPU&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioned memory&lt;/td&gt;
&lt;td&gt;360 GB-hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image transformations&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image cache reads&lt;/td&gt;
&lt;td&gt;300K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image cache writes&lt;/td&gt;
&lt;td&gt;100K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Analytics events&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed Insights events&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer seats&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fast Data Transfer is what Vercel's CDN sends to visitors. For a blog or a portfolio it is the line that matters, and 100 GB is a lot of page views for a personal site.&lt;/p&gt;

&lt;p&gt;The function lines start to count once the project has server code: API routes, server rendering and middleware. Active CPU only counts time the CPU is working. Provisioned memory counts the whole run, including time spent waiting on a database, so it tends to run out first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What other limits does Hobby have?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Hobby&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Projects&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function max duration&lt;/td&gt;
&lt;td&gt;300 seconds&lt;/td&gt;
&lt;td&gt;800 seconds (1,800 in beta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function memory and CPU&lt;/td&gt;
&lt;td&gt;2 GB, 1 vCPU&lt;/td&gt;
&lt;td&gt;Up to 4 GB, 2 vCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build machine&lt;/td&gt;
&lt;td&gt;2 vCPU, 8 GB&lt;/td&gt;
&lt;td&gt;Larger machines available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployments per day&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;6,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domains per project&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime logs&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;1 day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team collaboration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spend management&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password protection&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;$20 a month per project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Builds stop at 45 minutes on every plan.&lt;/p&gt;

&lt;p&gt;Two of these limits bite first on real apps. The 300-second cap ends any single function run, so a long export, a slow report or a model call that streams past five minutes gets cut off. The one-hour log window means an error from last night is gone by the time you look in the morning.&lt;/p&gt;

&lt;p&gt;Hobby is also one person. You can't add a teammate to a Hobby account, so the moment a second developer needs to deploy, the project moves to Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  What counts as commercial use on Vercel?
&lt;/h2&gt;

&lt;p&gt;Vercel's fair use rules call a deployment commercial when it is used for the financial gain of anyone involved in any part of its production. That includes a paid employee or consultant who writes the code. Vercel's own examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the site asks visitors for payment or processes payments&lt;/li&gt;
&lt;li&gt;the site advertises a product or service for sale&lt;/li&gt;
&lt;li&gt;someone is paid to create, update or host the site&lt;/li&gt;
&lt;li&gt;the site exists mainly to carry affiliate links&lt;/li&gt;
&lt;li&gt;the site shows ads, such as Google AdSense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asking for donations is allowed on Hobby.&lt;/p&gt;

&lt;p&gt;The test looks at the people around the project as well as the site itself. A freelancer building a client's marketing page on Hobby is breaking the rule even if the page sells nothing, because the freelancer is paid for it. A personal portfolio or an open-source docs site with a donate button fits Hobby.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you hit a Hobby limit?
&lt;/h2&gt;

&lt;p&gt;You can't buy extra usage on Hobby. When a project goes past an allowance, Vercel says that in most cases you have to wait 30 days before you can use that feature again. Web Analytics is the exception: collection resumes after 7 days.&lt;/p&gt;

&lt;p&gt;That wait hurts most on a side project that suddenly gets traffic. The capped feature stays off until the 30 days pass or you move the project to Pro, where usage past the $20 credit bills pay as you go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you run cron jobs and background work on Hobby?
&lt;/h2&gt;

&lt;p&gt;Cron jobs work, with tight limits. A project can have 100 of them, and on Hobby each one runs at most once a day. Timing is per hour: a job set for 08:00 runs some time between 08:00 and 08:59. A more frequent schedule fails the deploy. Pro runs cron jobs down to once a minute.&lt;/p&gt;

&lt;p&gt;Background work is the harder fit. Vercel runs server code as functions that start on a request and stop at the duration limit. A queue consumer, a Discord or Telegram bot that holds a connection open, or a job that runs for an hour needs to live on a host that keeps a process running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do Hobby functions run?
&lt;/h2&gt;

&lt;p&gt;New projects run functions in Washington, D.C. (&lt;code&gt;iad1&lt;/code&gt;) by default. Hobby gets one function region, and you can change it in the project's settings or with &lt;code&gt;regions&lt;/code&gt; in &lt;code&gt;vercel.json&lt;/code&gt;. Mumbai (&lt;code&gt;bom1&lt;/code&gt;) and Frankfurt (&lt;code&gt;fra1&lt;/code&gt;) are both on the list.&lt;/p&gt;

&lt;p&gt;That setting matters for anyone outside the US. A function in Washington that queries a database in Frankfurt or Mumbai pays the round trip on every query. Put the function region next to your database before you judge how fast the app feels.&lt;/p&gt;

&lt;h2&gt;
  
  
  When is the Hobby plan enough?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Fits Hobby?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Personal blog or portfolio&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open-source docs site with a donate link&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hackathon entry or demo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning project with a nightly cron job&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Side project that takes payments&lt;/td&gt;
&lt;td&gt;No, it needs Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site with ads or affiliate links&lt;/td&gt;
&lt;td&gt;No, it needs Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client site you are paid to build&lt;/td&gt;
&lt;td&gt;No, it needs Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App with jobs longer than 300 seconds or a long-running worker&lt;/td&gt;
&lt;td&gt;That part needs another host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to stay on Vercel
&lt;/h2&gt;

&lt;p&gt;If the project is a frontend that fits the Hobby rules, stay. Static pages, image optimization and Next.js features run well there, and moving a working site to save nothing makes little sense.&lt;/p&gt;

&lt;p&gt;The same goes for a commercial frontend on Pro. For a team, $20 a seat is small next to the time it would take to run a CDN and preview deployments yourself. Ownkube has no CDN in front of the app and no per-branch preview deployments, so a frontend that leans on either belongs on Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the same backend cost on Ownkube?
&lt;/h2&gt;

&lt;p&gt;Ownkube has no free plan for Compute. The smallest start is a $5 top-up on Pay as you go. Personal is $5 a month and loads $5 of credit, and Team is $20 a month and loads $20. Credit never expires.&lt;/p&gt;

&lt;p&gt;A small API with Postgres, running around the clock in the Germany region:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App at 0.25 vCPU and 0.5 GiB&lt;/td&gt;
&lt;td&gt;$6.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres on a DB 0.5 box&lt;/td&gt;
&lt;td&gt;$4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 GB of database storage&lt;/td&gt;
&lt;td&gt;$1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 GB of outbound transfer at $0.02 per GB&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;about $13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the Mumbai region the same 50 GB of transfer bills at $0.13 per GB, so the total is about $18.50. You pick the region when you deploy.&lt;/p&gt;

&lt;p&gt;The app is a long-running process, so it has no 300-second cap. Workers run continuously, and scheduled jobs take any cron expression with a time zone. If the app is idle for long stretches, sleep is opt-in: a sleeping app bills nothing for compute and a sleeping database bills storage only. When the wallet runs out, apps pause and keep their data until you top up, so the most a month can cost is what you loaded.&lt;/p&gt;

&lt;p&gt;Backups are 7-day point-in-time restore on Personal and Team, turned on per database. Pay as you go has no backups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist before you pick a plan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Does anyone make money from this project, including the person building it? Then it needs Pro or another host.&lt;/li&gt;
&lt;li&gt;Does any job run longer than 300 seconds or more often than once a day?&lt;/li&gt;
&lt;li&gt;Is the function region next to the database?&lt;/li&gt;
&lt;li&gt;Would a 30-day pause on a feature hurt your users?&lt;/li&gt;
&lt;li&gt;Do you need logs older than one hour?&lt;/li&gt;
&lt;li&gt;Will a second developer need to deploy?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If every answer is no, Hobby is a good home. If several are yes, price Pro with &lt;a href="https://ownkube.io/compare/vercel-pricing-explained" rel="noopener noreferrer"&gt;Vercel pricing explained&lt;/a&gt;, or compare hosts that run the backend and database together in &lt;a href="https://ownkube.io/compare/vercel-alternatives" rel="noopener noreferrer"&gt;Vercel alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Vercel free forever?
&lt;/h3&gt;

&lt;p&gt;The Hobby plan has no trial period. It stays $0 as long as the project is personal, non-commercial and inside the allowances.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Vercel Hobby for a client site?
&lt;/h3&gt;

&lt;p&gt;No. Being paid to build, update or host a site counts as commercial use under Vercel's rules, even when the site itself sells nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I show ads on a Vercel Hobby site?
&lt;/h3&gt;

&lt;p&gt;No. Ads such as AdSense count as commercial use. Asking visitors for donations is allowed.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if I exceed Vercel's free tier?
&lt;/h3&gt;

&lt;p&gt;You can't buy more usage on Hobby. In most cases the feature you went over stays unavailable for 30 days, and Web Analytics resumes after 7. Upgrading to Pro lifts the caps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Vercel have a Pro trial?
&lt;/h3&gt;

&lt;p&gt;Yes. Vercel offers a Pro trial, and after it Pro is $20 per developer seat a month with $20 of usage included.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I host a backend on Vercel for free?
&lt;/h3&gt;

&lt;p&gt;Short API calls, yes, within 1M invocations, 4 hours of active CPU and the 300-second limit per run. Workers, bots and long jobs need a host that keeps a process running. &lt;a href="https://ownkube.io/compare/railway-render-fly-io-free-tiers" rel="noopener noreferrer"&gt;Free tiers on Railway, Render and Fly.io&lt;/a&gt; covers the other free options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ownkube fits
&lt;/h2&gt;

&lt;p&gt;Keep a personal frontend on Vercel's Hobby plan if it fits. When the project turns commercial, needs a worker or a job that runs past five minutes, or needs its Postgres next to the app, Ownkube runs the whole backend in Mumbai or Germany from a prepaid wallet. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy my first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
