[{"data":1,"prerenderedAt":237},["ShallowReactive",2],{"seo-verification":3,"blog-supabase-vs-appwrite-which-self-hosted-backend-for-your-vps-ma-en":6,"promo-bar-likely":236},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-supabase-vs-appwrite-which-self-hosted-backend-for-your-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":169,"ctaBody":170,"ctaButton":171,"ctaUrl":172,"relatedPosts":173},94,"supabase-vs-appwrite-which-self-hosted-backend-for-your-vps",{"fr":12,"en":10,"ar":13,"es":14},"supabase-vs-appwrite","supabase-مقابل-appwrite-أي-خلفية-مستضافة-ذاتيا-لـ-vps","supabase-vs-appwrite-que-backend-self-hosted-para-vps","Supabase vs Appwrite: Choosing Your Open-Source BaaS on a VPS","Full comparison of Supabase vs Appwrite: Docker deployment, RAM requirements, auth, serverless functions, realtime, and a decision guide for your VPS.",14,0,false,"2026-03-18T00:00:00+00:00","2026-11-08T01:13:16+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},5,"Comparison","comparatif","bg-info\u002F10 text-info",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fsupabase-vs-appwrite-poster.svg",{"categorySlug":33,"appSlug":34},"databases","supabase","Supabase and Appwrite are the two most popular open-source BaaS platforms to replace Firebase without depending on a proprietary cloud. Both deploy with Docker on a VPS, but their architectures, resource requirements, and ideal use cases differ significantly. This guide compares both platforms point by point to help you choose the right one for your project — and your server.",[37,41,97,113,127,130,133,136,140,143,146,149,152,166],{"type":38,"title":39,"body":40},"h2","What is a BaaS and why self-host it?","A Backend-as-a-Service (BaaS) bundles everything a modern application needs on the server side into a single product: database, authentication, file storage, serverless functions, and real-time communication. Firebase popularized this model, but its proprietary nature raises concerns about cost, GDPR compliance, and vendor lock-in.\n\nSelf-hosting an open-source BaaS on your own VPS gives you full control over your data, eliminates per-request fees, and lets you meet data residency requirements. Supabase and Appwrite are the two most mature solutions in this space.",{"type":42,"title":43,"headers":44,"rows":48},"comparison","Supabase vs Appwrite — 12-criteria comparison",[45,46,47],"Criterion","Supabase","Appwrite",[49,53,57,61,65,69,73,77,81,85,89,93],[50,51,52],"Database","PostgreSQL","PostgreSQL by default since 2.0 (MariaDB and MongoDB available)",[54,55,56],"Minimum RAM","4 GB","4 GB (+ 2 GB swap)",[58,59,60],"Recommended production RAM","8 GB or more","Not published (4 GB minimum)",[62,63,64],"Number of containers","~11 (13 with Logflare and Vector)","~18",[66,67,68],"Main port","8000 (Envoy since 0.8.0, Kong before)","80 \u002F 443 (Traefik)",[70,71,72],"Admin port","8000 (Studio via the gateway, basic auth)","80 \u002F console (Traefik)",[74,75,76],"Included services","Auth, PostgREST, Realtime, Storage, Edge Functions, Studio","Auth, Databases, Storage, Functions, Messaging, Realtime",[78,79,80],"Auth providers","15+","30+",[82,83,84],"Functions runtime","Deno only","30+ runtimes (Node, Python, PHP, Go, Dart, Ruby, Bun…)",[86,87,88],"Client SDKs","JS, Python, Swift, Kotlin, Flutter, C#","JS, iOS, Android, Flutter, React Native, Web",[90,91,92],"Realtime","WebSocket via Realtime service","WebSocket via Appwrite Realtime",[94,95,96],"License","Apache 2.0","BSD 3-Clause",{"type":98,"title":99,"steps":100},"steps","Deploying Supabase on a VPS",[101,104,107,110],{"title":102,"body":103},"Step 1 — Server prerequisites","Provision a VPS with at least 4 GB of RAM (8 GB recommended for production), Docker and Docker Compose installed. Do not expose the gateway's port 8000, which serves both the API and Studio, over plain HTTP on the Internet: put an HTTPS reverse proxy (Caddy or Nginx) in front on port 443 and publish the gateway on loopback (`API_GW_HTTP_PORT=127.0.0.1:8000` in `.env`), since Docker bypasses ufw rules. The Supavisor pooler also publishes ports 5432 and 6543: if you need no external connections, prefix them with `127.0.0.1:` in `docker-compose.yml`. A minimum 40 GB SSD disk is recommended for PostgreSQL.",{"title":105,"body":106},"Step 2 — Clone the repository and configure the environment","Clone with `git clone --depth 1 https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsupabase`, copy the contents of `supabase\u002Fdocker` into a project folder and copy `.env.example` to `.env`. Never start with the example values: generate secrets and keys with `sh utils\u002Fgenerate-keys.sh` then `sh utils\u002Fadd-new-auth-keys.sh`, and check at minimum `POSTGRES_PASSWORD`, `JWT_SECRET` (at least 32 characters), `ANON_KEY`, `SERVICE_ROLE_KEY`, `DASHBOARD_PASSWORD` (Studio access) and the public URLs (`SUPABASE_PUBLIC_URL`, `API_EXTERNAL_URL`, `SITE_URL`).",{"title":108,"body":109},"Step 3 — Start the stack","Run `docker compose up -d` (or `sh run.sh start`, equivalent to `docker compose up -d --wait`). With Supabase 0.8.0+, Envoy (not Kong) serves port 8000. Check status with `docker compose ps` and wait until all containers are `healthy`.",{"title":111,"body":112},"Step 4 — Verify the installation","Access Studio through the gateway at `http:\u002F\u002Fyour-ip:8000` (or your HTTPS domain behind the reverse proxy), with the `DASHBOARD_USERNAME` login and `DASHBOARD_PASSWORD` password. Test a simple API call with `curl http:\u002F\u002Fyour-ip:8000\u002Ffunctions\u002Fv1\u002Fhello -H \"apikey: YOUR_PUBLISHABLE_KEY\"`: the sample function's response confirms the gateway routes requests correctly.",{"type":98,"title":114,"steps":115},"Deploying Appwrite on a VPS",[116,118,121,124],{"title":102,"body":117},"Appwrite requires at least 2 CPU cores, 4 GB of RAM and 2 GB of swap. Its ~18 containers (default setup) include Traefik as a reverse proxy. Ports 80 and 443 must be open.",{"title":119,"body":120},"Step 2 — Run the interactive installer","Run `docker run -it --rm --publish 20080:20080 --volume \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock --volume \"$(pwd)\"\u002Fappwrite:\u002Fusr\u002Fsrc\u002Fcode\u002Fappwrite:rw --entrypoint=\"install\" appwrite\u002Fappwrite:2.7.1`, pinning the released version rather than `latest`. The wizard opens in your browser on port 20080: it asks for your domain, generates the keys and a tailored `docker-compose.yml`, and creates the admin account. Close port 20080 once installation is done.",{"title":122,"body":123},"Step 3 — Wait for startup to finish","On first startup, the containers may take a few minutes to become operational, and the console may answer with an error in the meantime. Follow progress with `docker compose ps` and `docker compose logs -f appwrite`. Migrations only apply when upgrading an existing instance, and are run manually with `docker compose exec appwrite migrate`.",{"title":125,"body":126},"Step 4 — Sign in to the console","Once installation is complete, open your domain (or the server IP) in the browser, sign in to the console with the admin account created by the wizard, then create your first project.",{"type":38,"title":128,"body":129},"Authentication — Provider Comparison and OAuth","Both platforms handle email\u002Fpassword and phone number (SMS OTP) authentication. Appwrite supports 30+ OAuth2 providers versus 15+ for Supabase.\n\nSupabase uses **Supabase Auth** (formerly GoTrue) as its authentication service — a lightweight daemon written in Go. Appwrite integrates its own Auth service configurable per project from the web console.\n\nImportant post-2.0 note: issue #13547 (https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fappwrite\u002Fissues\u002F13547), opened in September 2026, reported that password reset and email invitations did not work on Appwrite 2.0 self-hosted deployments. It was closed without a named fix release, as the team could not reproduce it. Test these flows in a staging environment before migrating your production instance.",{"type":38,"title":131,"body":132},"Serverless Functions — Deno vs 30+ Runtimes","Supabase Edge Functions run exclusively on **Deno** — the modern JavaScript\u002FTypeScript runtime. Deno offers security by default (explicit permissions), native TypeScript support, and a growing module ecosystem.\n\nAppwrite Functions support 30+ **runtimes**: Node.js, Python, PHP, Ruby, Go, Dart, .NET, Java, Kotlin, Swift, Bun, and more. Each runtime is an isolated Docker container. This flexibility is a major advantage for polyglot teams.\n\nAppwrite 2.1.0 note: the `_APP_LOGGING_PROVIDER` and `_APP_LOGGING_CONFIG_REALTIME` environment variables are no longer read, and error logging goes through `_APP_LOGGING_CONFIG` alone, which now only accepts a Sentry DSN: a LogOwl, Raygun or AppSignal DSN is rejected at startup. Remove the old variables from your `.env` and check that DSN before upgrading.",{"type":38,"title":134,"body":135},"Real-Time and File Storage","**Real-time.** Both platforms use WebSockets. Supabase exposes PostgreSQL changes in real time via its **Realtime** service (logical replication). Appwrite Realtime covers events on documents, files, and teams — less tied to the underlying database and therefore more portable.\n\nA note with Supabase: the Realtime service sometimes starts before PostgreSQL is fully ready, generating the error `could not connect to the database`. Restarting the `realtime` container usually resolves this.\n\n**Storage.** Supabase Storage uses an S3-compatible API with RLS access policies directly from PostgreSQL. Appwrite Storage offers team- and user-based permissions, simpler to configure.",{"type":137,"title":138,"body":139},"tip","Appwrite: console unreachable on first launch — give it time","If the Appwrite console shows an error or remains inaccessible in the first few minutes, do not blindly restart the containers: first startup can take a few minutes. Follow progress with `docker compose ps` and `docker compose logs -f appwrite`, and wait until all containers run without errors. During an upgrade, however, nothing migrates on its own: after backing up your data, run `docker compose exec appwrite migrate` and let it finish without stopping the containers.",{"type":137,"title":141,"body":142},"Supabase: 502 Bad Gateway from gateway on startup — normal behavior","The Supabase API gateway (Kong up to 0.7.x, Envoy from 0.8.0) may return 502 errors during the first few tens of seconds after `docker compose up -d`. This is normal and transient — the gateway waits for PostgREST, GoTrue and other services to be ready. Wait until `docker compose ps` shows all containers as `healthy`. If 502s persist beyond a few minutes, inspect logs with `docker compose logs rest` and `docker compose logs api-gw` (the service was named `kong` before 0.8.0).",{"type":38,"title":144,"body":145},"Appwrite 2.0: migrating from 1.x — procedure and breaking changes","Appwrite 2.0 was announced for self-hosting on September 7, 2026 (source: https:\u002F\u002Fappwrite.io\u002Fchangelog\u002Fentry\u002F2026-09-07). It is a major update: **PostgreSQL** becomes the default database for **new installs**, with MariaDB and MongoDB still offered. An existing MariaDB instance **stays on MariaDB** after the upgrade: 2.0 does not convert your data to PostgreSQL.\n\n**Mandatory migration path.** An instance older than 1.9.6 must first be upgraded to 1.9.6 (from 1.8.x, via 1.9.5 and its migration); from 1.9.6 onward, upgrading to the latest 2.x is direct. Official procedure:\n\n1. Back up all your data: `docker compose down`, then copy the `appwrite` directory (`docker-compose.yml`, `.env`) **and** the named Docker volumes holding the database and files.\n2. If needed, first upgrade to 1.9.6: from the parent of the `appwrite` directory, rerun the install command with `--entrypoint=\"upgrade\"` and the `appwrite\u002Fappwrite:1.9.6` image.\n3. From the `appwrite` directory, run the migration: `docker compose exec appwrite migrate`.\n4. Upgrade to 2.x: rerun the `upgrade` command with the latest released image (`appwrite\u002Fappwrite:2.7.1` in November 2026).\n5. Run `docker compose exec appwrite migrate` again — do not stop containers during this process — then check with `docker ps | grep appwrite\u002Fappwrite` that all containers run the same version.\n\n**Breaking changes.** Issue #13547, closed in September 2026 without a named fix, reported broken password reset and email invitations in Appwrite 2.0 self-hosted. Test these flows in pre-production before migrating your main instance. In 2.1.0, `_APP_LOGGING_PROVIDER` and `_APP_LOGGING_CONFIG_REALTIME` are no longer read and `_APP_LOGGING_CONFIG` only accepts a Sentry DSN — remove the former and check the latter before upgrading. No rollback procedure is documented: only a full restore from backup lets you return to 1.x.",{"type":38,"title":147,"body":148},"Supabase 0.8.0: Kong to Envoy — impact and TLS migration","Supabase docker-compose 0.8.0, released August 11, 2026 (source: https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsupabase\u002Fblob\u002Fmaster\u002Fdocker\u002FCHANGELOG.md), replaces **Kong** with **Envoy** as the default API gateway (Kong remains available as an opt-in, with `sh run.sh config add kong`). This architectural change is transparent for most deployments, but carries a TLS breaking change: **the TLS listener on port 8443 disappears**.\n\n**What changes concretely.** If your reverse proxy or health check scripts made direct HTTPS requests to `https:\u002F\u002Fyour-ip:8443`, those calls will fail after the update. Envoy does not re-expose this port. TLS termination must now be handled exclusively by your front-end reverse proxy.\n\n**Migration steps.** Before upgrading to 0.8.0:\n- Audit all references to port `8443` in your deployment scripts, health checks, and firewall rules.\n- Replace them with calls to port `8000` over HTTP from the internal network, with TLS terminated by the reverse proxy.\n- Upgrade with the official procedure (`sh update.sh`, then `sh run.sh pull && sh run.sh recreate`): a plain `docker compose pull` is not enough, since `docker-compose.yml` itself changes. Then check that `docker compose ps` shows the `api-gw` service (container `supabase-envoy`), which replaces the `kong` service, as `healthy`.\n\nIn `.env`, `KONG_HTTP_PORT` is still read as a fallback for the new `API_GW_HTTP_PORT` variable, and `KONG_HTTPS_PORT` only serves the Kong option: you can switch to `API_GW_HTTP_PORT` to clarify your configuration.",{"type":38,"title":150,"body":151},"Decision guide — Supabase or Appwrite for your project?","**Choose Supabase if:** your application is web-first, your team knows PostgreSQL, you're migrating from Firebase, or you need an auto-generated REST API from your database schema (PostgREST).\n\n**Choose Appwrite if:** you're building a mobile (iOS\u002FAndroid) cross-platform application, your team works in multiple languages and wants to choose its function runtimes, or you prefer a more accessible admin interface without deep SQL knowledge.\n\n**On a VPS with 4 GB RAM,** you are at the documented minimum of both platforms (4 GB for Supabase, 4 GB plus 2 GB of swap for Appwrite); Supabase recommends 8 GB or more in production.\n\n**In 2026, both platforms are evolving rapidly.** Appwrite 2.0 makes PostgreSQL its default database for new installs — reducing Supabase's historical advantage on that point — while Supabase modernizes its gateway with Envoy. For a new installation, both are equivalent on the database question. For an existing installation (which stays on MariaDB on the Appwrite side), plan a maintenance window and test critical flows before any major update.",{"type":153,"title":154,"items":155},"ul","Common errors and fixes — both platforms",[156,157,158,159,160,161,162,163,164,165],"Supabase — 502 Bad Gateway (gateway): wait for all services to be `healthy`. If persistent: `docker compose restart api-gw` (0.8.0+) or `docker compose restart kong` (\u003C 0.8.0).","Supabase — Realtime `could not connect to the database`: restart with `docker compose restart realtime`.","Supabase — Invalid JWT: check that `ANON_KEY` and `SERVICE_ROLE_KEY` are signed with the same `JWT_SECRET` as in `.env`.","Supabase 0.8.0 — port 8443 unreachable: the Kong TLS listener was removed with Envoy. Remove direct calls to port 8443 and delegate TLS to the front-end reverse proxy.","Appwrite — console unreachable on startup: first startup can take a few minutes. Check `docker compose ps` and the logs before restarting anything.","Appwrite — `docker compose down -v`: DANGER — deletes all data volumes. Never run in production.","Appwrite — function timeout: cold start of an unused runtime may exceed the default timeout. Increase the limit in the function settings (Settings > Timeout, 900 s maximum).","Appwrite 2.x — migration blocked: an instance older than 1.9.6 must first go through 1.9.6, running `docker compose exec appwrite migrate` at each step. Skipping this step risks a failed migration: restore your backup and start over.","Appwrite 2.0 — password reset \u002F invitations: issue #13547 reported in self-hosted, closed without a named fix. Test these flows before going to production.","Appwrite 2.1.0 — dropped variables: `_APP_LOGGING_PROVIDER` and `_APP_LOGGING_CONFIG_REALTIME` are no longer read; remove them from `.env`, and keep only a Sentry DSN in `_APP_LOGGING_CONFIG`, the only one accepted at startup.",{"type":38,"title":167,"body":168},"Conclusion: two excellent BaaS platforms, two different philosophies","Supabase and Appwrite are both solid choices for self-hosting an open-source BaaS on your VPS. Supabase shines through its PostgreSQL depth, auto-generated API, and polished Studio. Appwrite stands out for the richness of its function runtimes, and the quality of its mobile SDKs.\n\nBoth platforms went through structural updates in 2026: Appwrite 2.0 (September 2026) makes PostgreSQL the default database for new installs, Supabase 0.8.0 (August 2026) switches from Kong to Envoy. Plan your migrations with a full backup, a test environment, and validation of critical flows — especially email authentication for Appwrite 2.0. In both cases, a dedicated VPS with at least 4 GB of RAM and automated volume backups is the foundation of a reliable deployment. Starting from 99 DH\u002Fmonth on ServOrbit.","Host your BaaS on a VPS you control","Whether you choose Supabase or Appwrite, both deserve a stable, fast, and backed-up VPS. Our Cloud VPS plans start at 4 GB RAM with on-demand snapshots — exactly what you need to run your open-source backend in production.","See our VPS plans","\u002Fvps-cloud",[174,198,218],{"id":175,"slug":176,"slugs":177,"title":181,"excerpt":182,"readTime":183,"views":184,"isPinned":19,"noindex":19,"publishedAt":185,"updatedAt":186,"category":187,"categories":193,"featuredImage":29,"bgImage":30,"posterImage":195,"relatedSolution":196},139,"docker-dev-stack-on-a-vps-an-environment-ready-for-coding",{"fr":178,"en":176,"ar":179,"es":180},"stack-dev-docker-vps","حزمة-تطوير-docker-على-خادم-vps-بيئة-جاهزة-للبرمجة","stack-dev-docker-en-vps","Docker Dev Stack on a VPS: an environment ready for coding","Set up a complete Docker dev stack on a VPS: Nginx, PHP-FPM, PostgreSQL, Redis, Mailpit, Adminer — detailed docker-compose.yml, SSH tunneling, troubleshooting.",10,1,"2026-02-06T00:00:00+00:00","2026-11-09T20:55:19+00:00",{"id":188,"name":189,"slug":190,"color":191,"icon":192},4,"Development","developpement","bg-warning\u002F10 text-warning","dev",[194],{"id":188,"name":189,"slug":190,"color":191,"icon":192},"\u002Fblog\u002Fcovers\u002Fstack-dev-docker-vps-poster.svg",{"categorySlug":192,"appSlug":197},"docker-dev-stack",{"id":199,"slug":200,"slugs":201,"title":205,"excerpt":206,"readTime":207,"views":208,"isPinned":19,"noindex":19,"publishedAt":209,"updatedAt":210,"category":211,"categories":212,"featuredImage":29,"bgImage":30,"posterImage":214,"relatedSolution":215},93,"n8n-vs-node-red-which-self-hosted-automation-tool-to-choose",{"fr":202,"en":200,"ar":203,"es":204},"n8n-vs-node-red","n8n-مقابل-node-red-أي-أداة-أتمتة-مستضافة-ذاتيا-تختار","n8n-vs-node-red-que-automatizacion-self-hosted-elegir","n8n vs Node-RED: which self-hosted automation tool to choose?","n8n or Node-RED for your VPS workflows? Complete technical comparison: license, server resources, IoT vs SaaS use cases, migration steps, and Docker deployment.",9,3,"2026-03-19T00:00:00+00:00","2026-11-08T01:13:15+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[213],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fn8n-vs-node-red-poster.svg",{"categorySlug":216,"appSlug":217},"automation-workflows","n8n",{"id":219,"slug":220,"slugs":221,"title":225,"excerpt":226,"readTime":188,"views":18,"isPinned":19,"noindex":19,"publishedAt":227,"updatedAt":228,"category":229,"categories":230,"featuredImage":29,"bgImage":30,"posterImage":232,"relatedSolution":233},95,"nextcloud-vs-owncloud-which-private-cloud-to-host",{"fr":222,"en":220,"ar":223,"es":224},"nextcloud-vs-owncloud","nextcloud-مقابل-owncloud-أي-سحابة-خاصة-تستضيف","nextcloud-vs-owncloud-que-nube-privada-alojar","Nextcloud vs ownCloud: which private cloud to host?","Nextcloud or ownCloud for your private cloud on a VPS? Comparison of features, performance, prerequisites and Docker deployment guide.","2026-03-17T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[231],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fnextcloud-vs-owncloud-poster.svg",{"categorySlug":234,"appSlug":235},"self-hosting","nextcloud",true,1794270504713]