<?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: sameer gautam</title>
    <description>The latest articles on DEV Community by sameer gautam (@masterchief_sameer).</description>
    <link>https://dev.to/masterchief_sameer</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%2F4053929%2Fed023506-cbc8-4016-87fa-6e6eaae62d61.jpg</url>
      <title>DEV Community: sameer gautam</title>
      <link>https://dev.to/masterchief_sameer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/masterchief_sameer"/>
    <language>en</language>
    <item>
      <title>Migrating off Strapi Cloud: Free Plan Removed – Hosting &amp; Migration Guide</title>
      <dc:creator>sameer gautam</dc:creator>
      <pubDate>Wed, 29 Jul 2026 21:27:10 +0000</pubDate>
      <link>https://dev.to/masterchief_sameer/migrating-off-strapi-cloud-free-plan-removed-hosting-migration-guide-984</link>
      <guid>https://dev.to/masterchief_sameer/migrating-off-strapi-cloud-free-plan-removed-hosting-migration-guide-984</guid>
      <description>&lt;p&gt;Strapi announced on &lt;strong&gt;July 21, 2026&lt;/strong&gt; that it will &lt;strong&gt;sunset the free Strapi Cloud plan&lt;/strong&gt; (built-in hosting). As of &lt;strong&gt;July 1, 2026&lt;/strong&gt;, new signups can no longer create free projects, and existing free projects will be &lt;strong&gt;deleted on September 1, 2026&lt;/strong&gt; unless upgraded. Strapi will focus on paid Cloud plans (Starter at $29/month, Pro, Business).&lt;/p&gt;

&lt;p&gt;This change affects &lt;strong&gt;only Strapi Cloud (the&lt;/strong&gt; &lt;code&gt;*.strapiapp.com&lt;/code&gt; &lt;strong&gt;managed hosting)&lt;/strong&gt;. Developers using the open‑source Strapi Community Edition (self-hosted) are &lt;strong&gt;unaffected and still free (MIT license)&lt;/strong&gt;. In practice, &lt;strong&gt;free-tier users&lt;/strong&gt; (often hobbyists or startup MVPs) must now either pay or migrate their Strapi backends to other hosts. Production teams already on paid plans continue as normal.&lt;/p&gt;

&lt;p&gt;This article explains the impact on different users and gives &lt;strong&gt;detailed migration steps&lt;/strong&gt;. It compares three hosting options (Render, Railway, DigitalOcean VPS) including costs, pros/cons, and step-by-step commands. We also cover database migration (keeping or moving your PostgreSQL), environment variables updates for Next.js/Strapi, rollback/testing tips, and preserving uploaded media.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timeline
    title Migration Timeline
    2026-07-01 : New free projects disabled
    2026-07-21 : Strapi announces free plan removal
    2026-08-01 : Plan migration and hosting choice
    2026-08-15 : Deploy Strapi on new host (Render/Railway/VPS)
    2026-08-16 : Test APIs, data integrity
    2026-08-20 : Cutover DNS/CNAME to new Strapi
    2026-09-01 : Old free projects deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Who’s Affected (Cloud Free users) vs. Unaffected (Self-Hosted)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Any project running on &lt;strong&gt;Strapi Cloud’s free plan&lt;/strong&gt; (i.e. the Strapi-managed &lt;code&gt;*.strapiapp.com&lt;/code&gt; domain) must migrate or upgrade. These free projects are on sleeping containers and have now lost their “free tier”. For example, a URL like &lt;code&gt;https://your-project-id.strapiapp.com&lt;/code&gt; is on Strapi Cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unaffected (Safe):&lt;/strong&gt; Anyone self-hosting Strapi (Community Edition) is &lt;em&gt;unaffected&lt;/em&gt;. The open-source Strapi CMS (MIT-licensed) is still fully free. Paid Strapi Cloud customers are also unaffected (nothing changes on their accounts).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put simply: if your backend API URL is &lt;code&gt;*.strapiapp.com&lt;/code&gt; or you signed up through Strapi Cloud, this change impacts you. If you run Strapi on your own server (DigitalOcean, Render, Railway, etc.), you can continue as-is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact Assessment: Hobbyists vs Startups vs Production
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hobbyists/Students:&lt;/strong&gt; Lose a &lt;em&gt;free forever&lt;/em&gt; cloud instance. They now must either self-host (zero cost) or pay ~$29/mo. This is a significant change, but many hobbyist apps can run on free tiers of Render or Railway (or a small VPS).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Startups/Small Projects:&lt;/strong&gt; The cost of using Strapi Cloud increases (starter $29/mo vs. $0). However, these teams often prefer reliability and may accept a budgeted $20–30/mo expense. Free alternatives (Render, etc.) exist but have limitations (sleeping, limited compute).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production Teams:&lt;/strong&gt; If you were in a production paid plan, this is a non-event (you’re already paying). But teams must ensure their dev/test setups (if on free tier) migrate. Uptime and features improve under paid plans – free-tier projects on Strapi Cloud had &lt;em&gt;sleeping containers&lt;/em&gt; that caused slow startups, which gave a poor experience. Upgrading or moving to a paid host avoids these issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Factors:&lt;/strong&gt; &lt;em&gt;Cost vs. Performance.&lt;/em&gt; Free Strapi Cloud was $0 but had sleepy performance (the first API call was slow due to “wake up”). Paid plans or other hosts cost money, but offer full uptime and features. Weigh your needs: static-website use (e.g. Next.js pre-render) may tolerate a small cold-start delay, while dynamic apps or teams may need always-on servers. Also consider data persistence: free hosts may not preserve file uploads across restarts (unlike paid or self-hosted setups with persistent disks or object storage).&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration Options (Step-by-Step)
&lt;/h2&gt;

&lt;p&gt;All our recommendations &lt;em&gt;reuse your existing Strapi code and (if possible) your PostgreSQL data&lt;/em&gt;, minimizing rewriting. In each case you will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clone or push&lt;/strong&gt; your Strapi project to the new host (GitHub/GitLab can integrate to deploy).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure the database&lt;/strong&gt; (connect to Neon or new Postgres, see DB section).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set environment variables&lt;/strong&gt; (DB credentials, Host, Cloudinary keys, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy&lt;/strong&gt; and test, then point your frontend (Next.js) to the new API URL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below we detail three hosts: Render (highly recommended), Railway, and a DigitalOcean Droplet (VPS). Each includes pros/cons, cost estimates, downtime risk, and commands/snippets.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Render.com (Recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why Render?&lt;/strong&gt; Render offers a &lt;em&gt;free tier&lt;/em&gt; for web services and Postgres, with managed TLS and zero-downtime deploys. It auto-restarts crashed apps and supports custom domains and pull-request previews. It’s easy: connect your Git repo, click “New Web Service”, and configure builds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Free 750 instance-hours/month (so ~free for hobby use). Auto HTTPS (free certs), built-in Postgres DB, automatic restarts. Easy Git deploys and YAML config support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Free web services &lt;em&gt;sleep&lt;/em&gt; after 15 minutes idle (you’ll see a short cold-start delay on first API call). Free Postgres DBs &lt;strong&gt;expire after 30 days&lt;/strong&gt; (you should promote to a paid DB or connect your own Neon).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Free for low usage (no credit card needed). A basic paid plan (Standard 1x) is ~$7–10/mo; managed Postgres starts around $0 for db (or ~$15/mo for more). You pay as you scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Downtime Risk:&lt;/strong&gt; Very low for paid instances (automatic restarts). Free tier downtime is only cold-start delay, no loss of data on restart if using managed Postgres. If scaled, you can do rolling deploys for zero downtime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Render Migration Steps (summary):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sign up / Login&lt;/strong&gt; to &lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render&lt;/a&gt; and connect your GitHub/GitLab repo (or use &lt;code&gt;render login&lt;/code&gt; CLI).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Postgres&lt;/strong&gt;: In Render Dashboard, click “New Database” → Postgres. Choose a plan (free starter for testing). Note the connection info or create a Secret (host, DB, user, password).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Web Service&lt;/strong&gt;: Click “New Web Service”. Select your repo and branch. In Environment, choose Node 18/20, and enter build/start commands (e.g. &lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt;, start &lt;code&gt;npm start&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment Variables&lt;/strong&gt;: In Render, go to the service’s Settings → Environment. Add variables like &lt;code&gt;DATABASE_HOST&lt;/code&gt;, &lt;code&gt;DATABASE_NAME&lt;/code&gt;, &lt;code&gt;DATABASE_USERNAME&lt;/code&gt;, &lt;code&gt;DATABASE_PASSWORD&lt;/code&gt;, and any Cloudinary keys or Strapi secrets. For example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DATABASE_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-postgres-host.render.com
&lt;span class="nv"&gt;DATABASE_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5432
&lt;span class="nv"&gt;DATABASE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;render_db
&lt;span class="nv"&gt;DATABASE_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;render_user
&lt;span class="nv"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;securepass
&lt;span class="nv"&gt;DATABASE_SSL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="nv"&gt;APP_KEYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...        &lt;span class="c"&gt;# from Strapi .env&lt;/span&gt;
&lt;span class="nv"&gt;API_TOKEN_SALT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;ADMIN_JWT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy&lt;/strong&gt;: Click “Create Web Service”. Render will build and deploy your Strapi app. Check the Logs for any errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test&lt;/strong&gt;: Once live (you’ll get a default &lt;code&gt;*.onrender.com&lt;/code&gt; URL), try &lt;code&gt;curl https://your-app.onrender.com/api/your-endpoint&lt;/code&gt;. Also test the Strapi Admin UI at &lt;code&gt;https://your-app.onrender.com/admin&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DNS Cutover&lt;/strong&gt;: When satisfied, update your domain (or Next.js config) to use &lt;code&gt;https://your-app.onrender.com&lt;/code&gt; (or custom domain) instead of the old Strapi Cloud URL. Ensure front-end env var change as in the Env Vars section below.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cleanup&lt;/strong&gt;: Once fully migrated, delete the old Strapi Cloud free project to avoid duplicate usage.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Render Checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create Render Postgres and get credentials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push Strapi code to Git if not already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect Render Web Service to repo; configure build &amp;amp; start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set Render Env Vars (DB + Strapi secrets + Cloudinary keys if used).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy and check that &lt;code&gt;npm run build &amp;amp;&amp;amp; npm run start&lt;/code&gt; works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test API and Admin, then switch frontend URL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Railway.app
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why Railway?&lt;/strong&gt; Railway provides an easy “deploy from Git” or CLI experience with a built‑in Postgres. It’s great for prototypes. It even offers a Strapi+Postgres template.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Extremely simple startup. You can just &lt;code&gt;railway up&lt;/code&gt; or use the template, and Railway will auto-create a Postgres. It provides an interactive CLI for setup. Includes private networking by default, and SSL endpoints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; &lt;strong&gt;Limited free usage.&lt;/strong&gt; New accounts get a 30-day trial with $5 credit (roughly $0.07 CPU-hour cost). After that, you need a Hobby or Pro plan (~$1/month baseline for minimal usage). There is no always-free web service beyond the trial credits. Also, some report that Railway projects “sleep” (the docs don’t explicitly say, but it’s similar to Render/Heroku).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Free trial ($5 credit) then ~$1/month minimum (Hobby plan) for a 0.5GB, 1 vCPU service. Paid plans (Hobby or Pro) may be needed for production or longer uptime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Downtime Risk:&lt;/strong&gt; Similar to Render’s free tier, small services may cold-start. No guaranteed SLA on free tier. On Hobby/Pro plan, Railway promises 99.9–99.99% uptime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Railway Migration Steps (summary):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sign up/Railway Login:&lt;/strong&gt; Register at &lt;a href="https://railway.app" rel="noopener noreferrer"&gt;Railway.app&lt;/a&gt; and authorize your Git repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Project:&lt;/strong&gt; Click “New Project” and select “Deploy from GitHub” (or use the Strapi template). If using CLI: install &lt;code&gt;railway&lt;/code&gt; CLI, run &lt;code&gt;railway login&lt;/code&gt; and &lt;code&gt;railway init&lt;/code&gt; in your Strapi project folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provision Postgres:&lt;/strong&gt; Railway might auto-create a PostgreSQL for you (via template). Or click “Add Service” → Postgres. Note the DB connection URL Railway provides.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Environment Variables:&lt;/strong&gt; In Railway’s Project Settings (or via CLI with &lt;code&gt;railway variables set&lt;/code&gt;), define:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://railway_user:railway_pass@containers-us-west-2.railway.app:xxxxx/railway_db
&lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;span class="nv"&gt;APP_KEYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;API_TOKEN_SALT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;ADMIN_JWT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;(Railway sets up &lt;code&gt;DATABASE_URL&lt;/code&gt; automatically if using their DB). If not using &lt;code&gt;DATABASE_URL&lt;/code&gt;, set &lt;code&gt;DATABASE_HOST&lt;/code&gt;, etc, similar to Render.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy Strapi:&lt;/strong&gt; If using the template, Railway may auto-deploy. If manual: push to Git or use &lt;code&gt;railway up&lt;/code&gt;. Check logs. Railway will run &lt;code&gt;npm install&lt;/code&gt; and &lt;code&gt;npm start&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test and Promote:&lt;/strong&gt; Once deployed, test endpoints at &lt;code&gt;https://your-project-production.up.railway.app&lt;/code&gt;. Confirm Admin UI (&lt;code&gt;/admin&lt;/code&gt;) works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Switch Frontend:&lt;/strong&gt; Update your Next.js &lt;code&gt;NEXT_PUBLIC_STRAPI_URL&lt;/code&gt; to Railway’s URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rollback/Tips:&lt;/strong&gt; If something fails, you can edit and &lt;code&gt;railway redeploy&lt;/code&gt;, or use the Railway dashboard to rollback.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Railway Checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Initialize Railway project (web + Postgres).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure Strapi start command (usually &lt;code&gt;npm run start&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set Railway environment variables (DB URL &amp;amp; Strapi secrets).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure port 1337 (Railway uses dynamic ports, but Strapi listens on process.env.PORT or 1337 by default).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy and test API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Swap to Railway URL in front-end.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. DigitalOcean Droplet (VPS)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why DigitalOcean?&lt;/strong&gt; A traditional VPS (Droplet) gives full control. It has no idle-sleep and is very stable. You also learn DevOps (Node/PM2/Nginx).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Complete control (SSH, firewall, backups, etc.). No enforced “sleep”; always running. Can attach block storage or spaces. Very cost-effective ($6–12/mo for a basic Droplet). Good for production with SLAs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; You &lt;em&gt;manage&lt;/em&gt; the server: OS updates, firewalls, SSL, PM2/Nginx, etc. More initial work and maintenance. There's no free tier (only some new-user credit).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Droplet (1 vCPU, 1–2GB RAM) starts at &lt;strong&gt;$6/month&lt;/strong&gt;. You’ll also possibly pay for a managed DB ($15/mo) or run Postgres on the same droplet. Domain/DNS is extra if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Downtime Risk:&lt;/strong&gt; Low if configured well. A single Droplet might restart occasionally or crash, but PM2 auto-restarts the app. You can add a second Droplet for redundancy (beyond scope here).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean Migration Steps (Ubuntu 22.04 example):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a Droplet:&lt;/strong&gt; Log into DO, “Create Droplet” → choose Ubuntu 22.04, at least 2GB RAM (Strapi needs ~2GB to build). Add your SSH key. Note the droplet’s IP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Server Setup:&lt;/strong&gt; SSH into it.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@your_server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   Create a new user (e.g. `sammy`) and give it sudo (as per DO’s [Initial Server Setup](https://docs.digitalocean.com/tutorials/initial-server-setup-ubuntu-22-04/)).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Node.js:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_18.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs build-essential
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;(Strapi recommends Node 18 LTS for v4/5).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone Strapi Project:&lt;/strong&gt; On the server (as your new user):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
git clone https://github.com/your-username/your-strapi-repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-strapi-repo
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Database:&lt;/strong&gt; You have two choices:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   **Use Neon (no migration):** Simply use the same Neon Postgres you had. Update Strapi’s config or `.env` with the Neon connection string (see \[Integrate Neon with Strapi\]\[35\], or simply set `DATABASE_URL=postgresql://user:pass@neon_host/dbname?sslmode=require`). Strapi can connect to Neon from any host.

*   **Use local Postgres:** Install Postgres on the Droplet:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```shell
    sudo apt install -y postgresql postgresql-contrib
    sudo -u postgres createdb strapidb
    sudo -u postgres createuser --interactive  # make a user (e.g. 'sammy')
    # Set password:
    sudo -u postgres psql -c "ALTER USER sammy PASSWORD 'your-password';"
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Update `config/database.js` (or environment) in Strapi to use that DB (example snippet).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Environment Variables:&lt;/strong&gt; Create a &lt;code&gt;.env&lt;/code&gt; file or export variables. For example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/your-strapi-repo
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; .env
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=strapidb
DATABASE_USERNAME=sammy
DATABASE_PASSWORD=your-password
DATABASE_SSL=false
APP_KEYS=...your-app-keys...
API_TOKEN_SALT=... 
ADMIN_JWT_SECRET=... 
JWT_SECRET=...
CLOUDINARY_NAME=...
CLOUDINARY_KEY=...
CLOUDINARY_SECRET=...
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;(Adjust Cloudinary keys or S3 as needed).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install PM2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Create &lt;code&gt;ecosystem.config.js&lt;/code&gt; (in your Strapi project root) as per [27†L452-L461], for example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module.exports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  apps: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      name: &lt;span class="s1"&gt;'strapi'&lt;/span&gt;,
      cwd: &lt;span class="s1"&gt;'/home/sammy/your-strapi-repo'&lt;/span&gt;,
      script: &lt;span class="s1"&gt;'npm'&lt;/span&gt;,
      args: &lt;span class="s1"&gt;'start'&lt;/span&gt;,
      &lt;span class="nb"&gt;env&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        NODE_ENV: &lt;span class="s1"&gt;'production'&lt;/span&gt;,
        DATABASE_HOST: &lt;span class="s1"&gt;'localhost'&lt;/span&gt;,
        DATABASE_PORT: &lt;span class="s1"&gt;'5432'&lt;/span&gt;,
        DATABASE_NAME: &lt;span class="s1"&gt;'strapidb'&lt;/span&gt;,
        DATABASE_USERNAME: &lt;span class="s1"&gt;'sammy'&lt;/span&gt;,
        DATABASE_PASSWORD: &lt;span class="s1"&gt;'your-password'&lt;/span&gt;,
      &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;]&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Then start Strapi with PM2:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 start ecosystem.config.js    &lt;span class="c"&gt;# [27†L477-L482]&lt;/span&gt;
pm2 save
pm2 startup                    &lt;span class="c"&gt;# set PM2 to launch on reboot [27†L528-L536]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Nginx and SSL:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   Install Nginx: `sudo apt install -y nginx`

*   Create an Nginx server block for your domain:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```nginx
    server {
        listen 80;
        server_name your-domain.com www.your-domain.com;
        location / {
            proxy_pass http://127.0.0.1:1337;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Save as `/etc/nginx/sites-available/strapi` and `sudo ln -s /etc/nginx/sites-available/strapi /etc/nginx/sites-enabled/`.

*   Test Nginx and reload:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```shell
    sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   **SSL (Let’s Encrypt)**:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```shell
    sudo apt install -y certbot python3-certbot-nginx
    sudo certbot --nginx -d your-domain.com -d www.your-domain.com
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Certbot will automatically edit the Nginx config to add SSL. (See \[27†L565-L574\]\[27†L599-L608\]).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test:&lt;/strong&gt; Visit &lt;code&gt;https://your-domain.com/admin&lt;/code&gt;. You should see the Strapi login (running in production mode). Use &lt;code&gt;curl&lt;/code&gt; to test an API route:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://your-domain.com/api/your-endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Droplet Checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Droplet with Ubuntu set up and user created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node and Strapi built (&lt;code&gt;npm run build&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PostgreSQL ready and Strapi connected to DB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PM2 configured (&lt;code&gt;ecosystem.config.js&lt;/code&gt; and &lt;code&gt;pm2 start&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nginx configured as reverse proxy and SSL enabled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Front-end env var updated to &lt;code&gt;https://your-domain.com&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database Migration Options
&lt;/h2&gt;

&lt;p&gt;If your data lives in a PostgreSQL database, you have choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep using NeonDB (no change).&lt;/strong&gt; If you currently use Neon (or any external DB), you can simply point your new Strapi host to it by setting &lt;code&gt;DATABASE_URL&lt;/code&gt; (or host/user/pass) to Neon’s details. Strapi supports Neon out of the box (just include &lt;code&gt;?sslmode=require&lt;/code&gt; for Neon).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use a new Postgres and import data.&lt;/strong&gt; If you switch to a different Postgres (e.g. Render’s or a Droplet’s DB), migrate your data:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   On a machine with `pg_dump`/`pg_restore`, run:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```shell
    pg_dump -h old_host -U old_user -d old_db -Fc &amp;gt; backup.dump
    pg_restore -h new_host -U new_user -d new_db -v backup.dump
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    *(These commands produce a compressed dump and restore it to the new DB.)* For example, Neon’s docs show pg\_dump/pg\_restore usage for migrating between Postgres instances. You may need to allow network access or use SSH to run these between servers.

*   **Alternatively**, use Strapi’s Data Import plugins or CSV/JSON export-import tools (but pg\_dump is simplest for Postgres).

*   After restoring, ensure your new DB user has privileges (grant `ALL` on the public schema if needed).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Switch DB entirely (no data).&lt;/strong&gt; If it’s a throwaway demo, you can start with a fresh DB and not migrate data (just set up content types and seed initial data manually).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Connection Strings:&lt;/strong&gt; You can use an environment variable for the full URL:&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="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://user:password@host:5432/dbname?sslmode&lt;span class="o"&gt;=&lt;/span&gt;require
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or the discrete variables shown earlier. Strapi will use whichever you configure in &lt;code&gt;config/database.js&lt;/code&gt;. For Next.js, the only DB change is in Strapi (Next.js calls Strapi via HTTP API, not DB).&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating Environment Variables &amp;amp; API URLs
&lt;/h2&gt;

&lt;p&gt;After migration, your frontend (Next.js) must point to the new Strapi URL. For example, update &lt;code&gt;.env.local&lt;/code&gt; in Next.js:&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;# Before (Strapi Cloud)&lt;/span&gt;
&lt;span class="nv"&gt;NEXT_PUBLIC_STRAPI_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://stunning-hope-921073164a.strapiapp.com

&lt;span class="c"&gt;# After migration&lt;/span&gt;
&lt;span class="nv"&gt;NEXT_PUBLIC_STRAPI_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://servd-api.onrender.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Strapi, ensure production env vars match the new host/DB. For instance, in &lt;code&gt;config/database.js&lt;/code&gt; (or &lt;code&gt;.env&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module.exports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="nb"&gt;env&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;({&lt;/span&gt;
  connection: &lt;span class="o"&gt;{&lt;/span&gt;
    client: &lt;span class="s1"&gt;'postgres'&lt;/span&gt;,
    connection: &lt;span class="o"&gt;{&lt;/span&gt;
      host: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_HOST'&lt;/span&gt;, &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
      port: env.int&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_PORT'&lt;/span&gt;, 5432&lt;span class="o"&gt;)&lt;/span&gt;,
      database: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_NAME'&lt;/span&gt;, &lt;span class="s1"&gt;'strapidb'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
      user: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_USERNAME'&lt;/span&gt;, &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
      password: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_PASSWORD'&lt;/span&gt;, &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
      ssl: env.bool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_SSL'&lt;/span&gt;, &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; rejectUnauthorized: &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set those &lt;code&gt;env&lt;/code&gt; vars in your host’s dashboard or &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also update any media/storage keys (Cloudinary/S3) in the environment. For example:&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="nv"&gt;CLOUDINARY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;CLOUDINARY_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;CLOUDINARY_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then redeploy Strapi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback &amp;amp; Testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Testing:&lt;/strong&gt; Before cutting over, thoroughly test the new setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use Postman/cURL to fetch key API endpoints on the new host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Strapi Admin login and basic content functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that uploaded files (images) are accessible (test an existing upload URL).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have your CI/CD or git branches ready so you can revert changes if needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rollback Plan:&lt;/strong&gt; Keep the old Strapi Cloud free project unchanged while testing. Do &lt;strong&gt;not&lt;/strong&gt; delete it until migration is final. If the new host fails, you can continue using the old URL (and then pay for a paid plan if needed). Because Strapi Cloud free will be deleted on Sept 1, 2026, you have a window to roll back if something critical breaks – but within that timeframe you could also upgrade the cloud project to a paid plan as a last resort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preserving Uploads/Media:&lt;/strong&gt; Strapi Cloud free stores uploads on its server (which you can’t easily export). To avoid data loss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use an external file storage. The best practice is to configure Strapi to use a provider like &lt;strong&gt;Cloudinary&lt;/strong&gt; or &lt;strong&gt;AWS S3&lt;/strong&gt; for uploads. Cloudinary has a free tier (1GB) and can be set up with the &lt;a href="https://docs.strapi.io/plugins/upload/cloudinary" rel="noopener noreferrer"&gt;&lt;code&gt;strapi-provider-upload-cloudinary&lt;/code&gt;&lt;/a&gt; plugin. This way, media lives in the cloud and is unchanged by server migrations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you already have media in Strapi Cloud, you should &lt;strong&gt;manually migrate&lt;/strong&gt; them. One way is to download all uploads from Strapi Cloud (e.g. via the Strapi Admin or API) and re-upload to Cloudinary/S3, updating the &lt;code&gt;url&lt;/code&gt; fields in the database. Or use &lt;code&gt;rsync&lt;/code&gt;/&lt;code&gt;scp&lt;/code&gt; if you can get direct access (not possible on Strapi Cloud free).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If using DigitalOcean with attached disk or block storage, you could copy files via SSH between servers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rollbacks:&lt;/strong&gt; Keep your code under version control. If something goes wrong, you can redeploy an older commit or repoint DNS back to the old server. For example:&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;# If using Render: roll back to a previous deploy (Render supports rollbacks via the dashboard).&lt;/span&gt;
&lt;span class="c"&gt;# If using Railway: use the UI to revert to a prior deployment.&lt;/span&gt;
&lt;span class="c"&gt;# If on DigitalOcean: you have a static IP; you could switch Nginx back to the old server block (if you kept it) or shut down the new Droplet.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Have database dumps ready (pg_dump) so you can restore the old DB state if needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using SSL:&lt;/strong&gt; All recommended hosts handle TLS easily: Render/Railway give free HTTPS. For VPS, use Certbot as shown. Always use &lt;code&gt;https://&lt;/code&gt; in &lt;code&gt;NEXT_PUBLIC_STRAPI_URL&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Environment Modes:&lt;/strong&gt; Remember Strapi’s admin UI won’t let you edit content-types in production mode. For production on Render/Railway, content types should be finalized before deployment. (Alternatively, have a separate staging branch.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; Check logs after deployment. Render and Railway provide logs in their dashboards. For Droplet, use &lt;code&gt;pm2 logs&lt;/code&gt; and &lt;code&gt;sudo journalctl -u nginx&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backups:&lt;/strong&gt; Schedule regular DB backups. Many managed Postgres (Render, Railway) have snapshots or you can use &lt;code&gt;pg_dump&lt;/code&gt; on a cron.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison Table of Hosts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Render (Web Service)&lt;/th&gt;
&lt;th&gt;Railway (Web Service)&lt;/th&gt;
&lt;th&gt;DigitalOcean Droplet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;750h free (spins down after idle)&lt;/td&gt;
&lt;td&gt;30-day trial ($5 credit), then ~$1/mo (Hobby)&lt;/td&gt;
&lt;td&gt;No free tier (estimated $6+/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in free HTTPS&lt;/td&gt;
&lt;td&gt;Built-in via &lt;code&gt;railway.app&lt;/code&gt; (auto)&lt;/td&gt;
&lt;td&gt;Certbot (free) or managed via Load Balancer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed DB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional (free 30d Postgres); else use Neon or DigitalOcean DB&lt;/td&gt;
&lt;td&gt;Offers managed Postgres (auto-created)&lt;/td&gt;
&lt;td&gt;Manual DB install or use DigitalOcean Managed DB ($15+/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sleeping/Idle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (spins down after 15min, cold start ~1min)&lt;/td&gt;
&lt;td&gt;Likely yes (limited usage, cold start)&lt;/td&gt;
&lt;td&gt;No (runs continuously)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vertical + auto (zero-downtime deploys)&lt;/td&gt;
&lt;td&gt;Vertical (1 instance), auto (Hobby allows multiple)&lt;/td&gt;
&lt;td&gt;Manual scaling (add more droplets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost (approx)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0 – $10+/mo (depending on plan and usage)&lt;/td&gt;
&lt;td&gt;~$0 (trial) then $1+/mo (Hobby)&lt;/td&gt;
&lt;td&gt;$6–12+/mo (Droplet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-level (PaaS)&lt;/td&gt;
&lt;td&gt;Medium (PaaS)&lt;/td&gt;
&lt;td&gt;Full (IaaS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (connect repo, set vars)&lt;/td&gt;
&lt;td&gt;Low (connect repo or CLI)&lt;/td&gt;
&lt;td&gt;High (OS admin, Nginx, PM2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Downtime Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal (for paid plans); free: cold-start delays&lt;/td&gt;
&lt;td&gt;Minimal (once running); free tier resets after credit&lt;/td&gt;
&lt;td&gt;Low (if config correct)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hobby projects, startups, dev&lt;/td&gt;
&lt;td&gt;Prototypes, small projects&lt;/td&gt;
&lt;td&gt;Production apps, learning DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>cloudmigration</category>
      <category>headlesscms</category>
    </item>
  </channel>
</rss>
