Migrating from Render to PandaStack: What You Need to Know
Render made cloud deployments approachable for a generation of developers, but teams often find themselves needing more flexibility or better economics as they scale. PandaStack is a cloud PaaS that supports static sites, Docker containers, managed databases (PostgreSQL, MySQL, and Redis), cronjobs, edge functions (Node.js and Python via OpenWhisk) — all driven by GitHub integration. This guide covers everything you need to know to migrate from Render to PandaStack, including the key differences and the exact migration steps.
Key Differences to Understand
Before migrating, understand where the platforms diverge:
Deployments: Both platforms support Docker containers and static sites via GitHub. PandaStack uses GitHub exclusively for source integration, so if you're using Render with a GitLab or Bitbucket repo, you'll need to mirror it to GitHub first.
Databases: Render offers managed PostgreSQL. PandaStack supports PostgreSQL, MySQL, and Redis as managed databases, giving you more options.
Cron Jobs: Render has Cron Jobs as a service type. PandaStack has a dedicated cronjob system with full container-based execution.
Edge Functions: PandaStack supports edge functions (Node.js and Python) via Apache OpenWhisk. Render does not have an equivalent.
Step 1: Mirror to GitHub If Needed
If your Render services use a non-GitHub source:
# Mirror GitLab repo to GitHub (run once, then set up as push mirror in GitLab)
git clone --mirror https://gitlab.com/your-org/your-repo.git
cd your-repo.git
git remote add github https://github.com/your-org/your-repo.git
git push --mirror githubFor ongoing mirroring, configure GitLab's built-in push mirror feature under Settings → Repository → Mirroring repositories.
Step 2: Export Your Render PostgreSQL Database
Render provides database connection strings in the dashboard. Use them to export:
export RENDER_DB="postgresql://user:password@render-host:5432/dbname"
# Full dump with all options for cross-platform compatibility
pg_dump --format=custom --no-acl --no-owner --compress=9 --verbose "$RENDER_DB" > render-backup.dump
# Confirm the dump contains your tables
pg_restore --list render-backup.dump | grep "TABLE DATA"Step 3: Provision PandaStack Resources
Create your database at [dashboard.pandastack.io](https://dashboard.pandastack.io) → Databases → New PostgreSQL (or MySQL/Redis based on your needs).
export PS_DB="postgresql://user:password@pandastack-host:5432/mydb"
# Restore
pg_restore --no-acl --no-owner --verbose --jobs=4 -d "$PS_DB" render-backup.dump
# Verify row counts
psql "$RENDER_DB" -c "SELECT COUNT(*) FROM users;"
psql "$PS_DB" -c "SELECT COUNT(*) FROM users;"
# These numbers must matchStep 4: Prepare Your Container
Render can build from a Dockerfile or auto-detect your runtime. PandaStack deploys Docker containers, so if you already have a Dockerfile, you're ahead:
# If using Render's native build (no Dockerfile), create one now
# Check what runtime Render detected for your service
cat render.yamlFor a Node.js service that Render was auto-building:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN adduser -D appuser && chown -R appuser /app
USER appuser
EXPOSE 10000
HEALTHCHECK CMD wget -qO- http://localhost:10000/health || exit 1
CMD ["node", "index.js"]Step 5: Configure and Deploy via CLI
npm install -g @pandastack/cli
panda login
# Initialize project (links to your GitHub repo)
panda init
# Set environment variables
# First, list what you have on Render (from the Render dashboard)
# Then set each one via CLI or dashboard
panda env set NODE_ENV=production
panda env set DATABASE_URL="$PS_DB"
panda env set PORT=10000
panda env set SESSION_SECRET=your-session-secret
# ... all other vars from your Render service configPandaStack auto-deploys on every push to your configured GitHub branch. Your first push after panda init triggers the initial build.
Step 6: Recreate Render Cron Jobs
Render Cron Jobs map directly to PandaStack cronjobs. Check your Render cron services:
# Recreate each Render cron job
# Example: Render job running "node jobs/send-emails.js" on "0 9 * * *"
panda cronjob create --name send-daily-emails --image ghcr.io/your-org/your-app:latest --schedule "0 9 * * *" --command "node jobs/send-emails.js"
# Example: hourly data sync
panda cronjob create --name hourly-sync --image ghcr.io/your-org/your-app:latest --schedule "0 * * * *" --command "node jobs/sync.js"
# Confirm all cronjobs created
panda cronjobs listStep 7: Verify Static Sites
If you have static sites on Render, deploying them on PandaStack is straightforward — connect the GitHub repo, specify the build command and output directory:
# Example for a React app
panda static create --name my-frontend --build-command "npm run build" --output-dir "build"Step 8: Test and Cut Over
# Verify all endpoints on the new PandaStack deployment
curl -I https://my-app.pandastack.io
curl https://my-app.pandastack.io/api/health
# Run integration tests against the new URL
BASE_URL=https://my-app.pandastack.io npm run test:integration
# Verify database data is accessible
curl https://my-app.pandastack.io/api/users | jq '.total'Once verified, update your DNS CNAME from Render's URL to your PandaStack deployment URL. PandaStack's free tier is available for getting started, with paid plans from $15/mo. Check [docs.pandastack.io](https://docs.pandastack.io) for the full reference.