How to Self Host GitLab in 2026 (and Keep It Running)
GitLab self hosted, which GitLab calls GitLab Self-Managed, means running GitLab (Community or Enterprise Edition) on a server you control. The install is the easy part: one container, one config file, and about ten minutes until the sign-in page answers.
Table of Contents
Self hosted GitLab at a glance (GitLab 19, checked October 2026)
| What | Answer |
|---|---|
| Memory | 8 GB to run it; 16 GB is GitLab’s baseline |
| Time to a sign-in page | By hand: about 10 min (one measured install: 9 min 43 s) On our template: about 4 to 5 min |
| What keeps it working | Five settings: proxy URL, email, memory, first login, config home |
| What keeps it recoverable |
Two habits:
back up
gitlab-secrets.json; upgrade through required stops
|
| GitLab 19 required stops | 19.2, 19.5, 19.8, 19.11 (the last three planned) |
| Security fixes | Only the latest three monthly releases get them |
What goes wrong comes later. A clone link that starts with http:// behind your proxy. A half-added email config that stops GitLab from starting. A restore that brings back every repository but leaves 2FA and CI/CD secrets unreadable. An upgrade that skipped a version GitLab required.
We run Selfhost.dev, where GitLab is a one-click template, and building it taught us that the install was never the hard part. Five things GitLab doesn’t set safely for you by default decide whether it survives the first restart, the first email, and the first upgrade. This guide does each of them by hand, then covers the two habits that keep GitLab recoverable.
Or skip the setup: GitLab hosting in one click applies the proxy, email, memory, and root-password settings before the first boot and keeps its config across restarts.
Before you self host GitLab: is it worth it, and which route?
User count is only one factor. Self hosting GitLab becomes the better fit when you need control of the infrastructure, code that stays where you choose, your own CI machines, or admin control GitLab.com doesn’t give. GitLab.com Free also stops at five users per top-level group. The ongoing cost is mostly time.
That time ranges from minutes to hours a month, depending on team size and how much you automate:
| Source | What they measured or reported |
|---|---|
| LearnWithHasan (August 2026, one server) | A minor upgrade, 19.1.3 to 19.2.1: 9 min 14 s of work, 6 min 43 s of downtime; “about ten minutes of your attention and about seven minutes of downtime, roughly every month” |
| Mad Devs (2023, 64 users) | “About 6 hours a month” of support |
GitLab ships a new minor version on the third Thursday of every month, with patch releases twice a month in between (GitLab maintenance policy), so the upgrade window is a standing appointment rather than a one-off. The same time-versus-money question comes up with self hosting Supabase.
Four routes to the same GitLab
| Linux package | Docker Compose | Kubernetes | Selfhost.dev template | |
|---|---|---|---|---|
| How |
apt install gitlab-ce
for GitLab on Ubuntu or Debian
|
GitLab’s official Compose file | GitLab’s Helm chart | One click |
| Time to a sign-in page | 9 min 43 s measured from a stock server, including HTTPS (LearnWithHasan) | Not separately measured; same software, plus writing the file | A cluster to run first | About 4 to 5 minutes, server included |
| The 5 settings below | You set them | You set them | Chart values | 4 of 5 set before first boot (you turn off sign-up: one checkbox) |
| Version | apt, held if you pin it | The tag you write | The chart version | Pinned; moves when you move it |
| Best for | One box you’ll administer | Teams that run everything in containers | Large or high-availability installs | Your own GitLab without the setup |
Every route runs the same bundle, the Linux package (or Omnibus): PostgreSQL, Redis, Gitaly (Git storage), Puma (the web server), Sidekiq (background jobs) and NGINX. On Kubernetes, GitLab says “you should not plan to deploy the GitLab Docker image” because “it creates a single point of failure” (Docker install docs); use the Helm chart. This guide uses Docker Compose: every setting in one file you can read, back up and copy.

Rather skip the setup? The proxy, email, memory and root-password settings in section 3 are applied before first boot on our GitLab template, on your own European 8 GB server with root SSH and HTTPS from the first boot, at $0.03/hr. See GitLab hosting in one click →
How to self host GitLab, step by step
To self host GitLab with Docker Compose, prepare an 8 GB server with a real hostname, free port 22 for Git, write a Compose file with a pinned version and the five settings, start it, and sign in as root. The five steps below take about ten minutes of waiting and a few of typing.
- Prepare the server: 8 GB of RAM, a hostname that resolves to it, Docker with Compose.
- Free port 22: move the server’s own SSH to another port so Git can use 22.
- Write the Compose file: pinned version, shm_size, and the five settings (below).
- Start it and wait: docker compose up -d, then let the first boot finish.
- Sign in, then lock it down: root password, remove the password secret, close sign-up.
GitLab self hosted requirements: what you need first
- 8 GB of RAM. GitLab’s requirements set a 16 GB, 8 vCPU baseline and say GitLab “can run with at least 8 GB of memory” when constrained. With the memory settings below, 4 vCPU suits a small team. More: what GitLab needs to run.
- A hostname that resolves to the server. GitLab needs “a valid, externally accessible hostname”, not localhost.
- Port 22 free for Git. GitLab recommends moving the server’s own SSH (sshd) to another port, such as 2424, so clone URLs stay plain [email protected]:group/project.git. Reconnect on the new port before you close the old session.
- Docker with Compose on Linux. GitLab doesn’t support Docker for Windows.
- A mail relay, eventually. “The GitLab images don’t include an MTA.” Setting 2 covers when to add one.
The GitLab Docker Compose file, with the five settings in it
Adapted from GitLab’s official example. The comments explain each setting; sections 3 and 4 go deeper.
# docker-compose.yml: GitLab Community Edition
services:
gitlab:
# Pin an exact version. GitLab offers :latest "for testing purposes" only.
image: gitlab/gitlab-ce:{{GV_EXAMPLE}}
container_name: gitlab
restart: always
hostname: gitlab.example.com
# Docker's 64 MB /dev/shm default is too small for GitLab. Keep this line.
shm_size: '256m'
ports:
- '80:80' # remove 80 and 443 if a reverse proxy on this host serves GitLab
- '443:443'
- '22:22' # Git over SSH: move the server's own sshd off 22 first
volumes:
- ./config:/etc/gitlab # gitlab.rb and gitlab-secrets.json: back these up
- ./logs:/var/log/gitlab
- ./data:/var/opt/gitlab # repositories, database, uploads, backups
secrets:
- gitlab_root_password # remove after your first sign-in (see below)
environment:
# Setting 5: these lines live in this file, not in gitlab.rb.
GITLAB_OMNIBUS_CONFIG: |
# Setting 1: the URL people use. https:// turns on GitLab's own TLS and Let's Encrypt.
external_url 'https://gitlab.example.com'
# Behind a reverse proxy that already terminates TLS? Uncomment all three,
# remove the 80/443 ports above, and put GitLab on your proxy's Docker network.
# GitLab 19 key names; on GitLab 18 use nginx['listen_port'] and nginx['listen_https'].
# gitlab_rails['nginx']['listen_port'] = 80
# gitlab_rails['nginx']['listen_https'] = false
# letsencrypt['enable'] = false
# Setting 2: email stays off until every SMTP value exists.
gitlab_rails['smtp_enable'] = false
# Setting 3: memory. Monitoring off, fewer Sidekiq threads, Puma left at 2 workers.
prometheus_monitoring['enable'] = false
puma['worker_processes'] = 2
sidekiq['concurrency'] = 10
# Setting 4: root password from a file you control (8+ characters, GitLab's minimum).
# Delete this line and both secrets blocks after your first sign-in.
gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
secrets:
gitlab_root_password:
file: ./root_password.txt
From our template build: GitLab’s Docker troubleshooting page blames metrics files outgrowing Docker’s 64 MB shared-memory default. We hit a second reason: GitLab’s bundled PostgreSQL also failed on it. Keep the line.
Start GitLab: what the first boot and the 502 mean
Run docker compose up -d and watch docker logs -f gitlab. GitLab runs gitlab-ctl reconfigure and its migrations before the web interface answers (“it might take a while”, per GitLab). A 502 page now means it’s still starting. If it fails on port 22, the server’s sshd still holds it.
Don’t restart the container while it works. An interrupted reconfigure can leave GitLab half-migrated and needing manual recovery.
Find the GitLab root password, then lock it down
Sign in as root with the password from root_password.txt. Then, before anything else:
- Remove the password secret. Delete the gitlab_rails[‘initial_root_password’] line and both secrets: blocks from docker-compose.yml, run docker compose up -d, and only then delete root_password.txt. Deleting the file first breaks the next start: Compose refuses to run with a missing secret file, and GitLab reads that line on every boot.
- Close public sign-up (setting 4).
If you skipped the secret, GitLab wrote a random password to a file instead:
sudo docker exec -it gitlab grep ‘Password:’ /etc/gitlab/initial_root_password
GitLab deletes that file “in the first container restart after 24 hours”, so change the password straight away.
On Ubuntu or Debian with the Linux package, the same settings go in /etc/gitlab/gitlab.rb and apply with sudo gitlab-ctl reconfigure.
The 5 settings that decide whether self hosted GitLab keeps working
GitLab’s defaults get it running; these five keep it running. They’re the five our template has to get right before GitLab’s first boot, and each has a symptom that surfaces later: after the first restart, the first email, or the first stranger who finds the URL. Four are config lines; the fifth is a rule about where config lives.
| Setting | GitLab’s default | What to set | What breaks without it | On the Selfhost.dev template |
|---|---|---|---|---|
| 1. The URL behind your proxy |
TLS and Let’s Encrypt switch on when external_url is https://
|
Behind a proxy: listen on 80, HTTPS off, Let’s Encrypt off |
http:// clone links, redirect loops, renewal errors
|
Set before first boot |
| 2. Email | Off | The whole SMTP block, or none of it | One empty value can stop GitLab booting | Off, so nothing is half set |
| 3. Memory | Puma 2 workers, Sidekiq 20 threads, Prometheus on | Prometheus off, Sidekiq around 10 | Memory pressure, then out-of-memory kills | Tuned to use less memory than usual |
| 4. The first login | Root password in a file deleted after 24 hours Sign-up open; new accounts wait for admin approval | Root password from a secret; new sign-ups off | Lost root access, or an approval queue of strangers | Root password set before first boot Sign-up stays on until you turn it off (one checkbox) |
| 5. Where config lives |
GITLAB_OMNIBUS_CONFIG read at start, never written to gitlab.rb
|
One home for lasting settings |
Settings vanish on the next docker run
|
Written once, kept across restarts and redeploys |
1. The URL behind your proxy
GitLab decides how to serve itself from external_url. Per GitLab’s SSL docs, installations “auto-detect whether to use SSL if external_url contains https://“, and Let’s Encrypt switches on with it. That’s right when GitLab is alone on the server. When Traefik, Caddy or nginx already terminates TLS in front of it, GitLab tries to do the same job twice.
Keep external_url as the public https:// address, so every link GitLab generates is correct, and tell its bundled NGINX to serve plain HTTP to your proxy:
# GitLab 19 key names.
On GitLab 18: nginx['listen_port'] and nginx['listen_https'].
gitlab_rails['nginx']['listen_port'] = 80
gitlab_rails['nginx']['listen_https'] = false
letsencrypt['enable'] = false
Stop publishing 80 and 443 from the container; some proxies also need to forward Host, X-Forwarded-Ssl and X-Forwarded-For. Get it wrong and you see http:// clone URLs, a redirect loop, or certificate errors, since GitLab “attempts to renew any Let’s Encrypt certificate with every reconfigure.”

2. Email: all of it or none of it
Without mail, GitLab can’t send password resets, invitations or notifications. With it half configured, GitLab may not start at all. GitLab’s SMTP docs give this block; add it only when every value is real:
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "your-smtp-password"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
gitlab_rails['gitlab_email_from'] = '[email protected]'
Port and TLS mode depend on your provider (465 or 587); GitLab’s docs have provider examples. The same page warns that smtp_password “should not contain any String delimiters used in Ruby or YAML (f.e. ‘)”. Test from gitlab-rails console with Notify.test_email('[email protected]', 'Test', 'It works').deliver_now.
What we found building Gitlab template: a Compose file that fills this block from environment variables is convenient until one variable is empty. The empty value lands inside GitLab’s Ruby config as a syntax error, and GitLab stops booting. Our template leaves email off for exactly this reason, so nothing half set can take GitLab down; you add a relay once every value exists.
3. Memory
GitLab’s defaults are Puma (2 workers), Sidekiq (20 threads) and Prometheus monitoring on. Three kinds of evidence say how far to trim them, and they answer different questions:
| Evidence | What it says | Type |
|---|---|---|
| GitLab requirements | 16 GB baseline; “can run with at least 8 GB” when memory-constrained | GitLab requirement |
| GitLab memory-constrained guide | Monitoring off saved about 300 MB; Puma single mode saved 100 to 400 MB, for “small installations that do not require high throughput” | GitLab measurement |
| LearnWithHasan GitLab 19.2.1, August 2026 | 5,543 MB idle by default; 2,874 MB with Puma single mode, Sidekiq at 10 and monitoring off; a default install made a 4 GB box “completely unreachable” | Independent measurement |
| Selfhost.dev team | “4 GB minimum, 8 GB realistic” for GitLab tuned as in this guide | Our recommendation |
What this means for you: on 8 GB, turn monitoring off and set Sidekiq around 10; keep Puma’s 2 workers. Then check health with GitLab’s health endpoints (/-/health, /-/readiness, /-/liveness, reachable from localhost by default), since Prometheus is gone.
Why our template sizes it this way: a 4 GB server can look fine idle and run short once the team starts pushing, so our template sizes GitLab at 8 GB rather than the minimum.
4. The first login
GitLab’s random root password lives in a file that disappears after 24 hours. A Docker secret, as in the Compose file, leaves nothing to catch in time; remove it after your first sign-in.
Sign-up needs a separate step. GitLab’s sign-up docs: “By default, any user visiting your GitLab domain can create an account”, and GitLab recommends disabling it on public-facing instances. New instances hold those accounts for administrator approval by default, but an approval queue on a public URL is still noise. It isn’t a gitlab.rb setting. Turn it off either way:
- In the UI: Admin → Settings → General → New user account restrictions → clear Allow new user accounts, then select Save changes.
- In
gitlab-rails console:::Gitlab::CurrentSettings.update!(signup_enabled: false)
5. Where your config lives
GITLAB_OMNIBUS_CONFIG is convenient, and it has a catch. GitLab’s Docker configuration docs state plainly: its settings “aren’t written to the gitlab.rb configuration file”, and with plain docker run the variable “is not preserved between subsequent runs.” Start the container once without it and those settings are gone, silently.
Compose fixes most of this, because the variable lives in the file. The rule that remains: pick one home for lasting settings, either the Compose file or /etc/gitlab/gitlab.rb (edit with sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb; GitLab “reconfigures itself each time the container starts”), and back up that home with your data.
That’s the checklist our GitLab template works through before GitLab first boots: HTTPS clone URLs behind the proxy, memory tuned for the server, the root password set, nothing half configured in email, and an exact version pinned. You keep root SSH, and your version stays put until you move it.
Launch GitLab with this checklist already applied → · or go straight to the console
Backups and upgrades: the 2 habits that keep self hosted GitLab running
Back up the secrets file with every archive, and upgrade through GitLab’s required stops on a pinned version, including the security patches between them. The five settings decide whether GitLab works today; these two habits decide whether you can bring it back after a bad disk or a bad upgrade, and whether it keeps receiving security fixes.
How to back up GitLab: the secrets file, not just the archive
docker exec -t gitlab gitlab-backup create
The archive covers the database, repositories, uploads, CI/CD artifacts, wikis and more. Per GitLab’s backup docs, it leaves out gitlab-secrets.json and gitlab.rb on purpose: the database holds encrypted 2FA data and CI/CD variables, and “storing encrypted information in the same location as its key defeats the purpose of using encryption in the first place.” Lose the secrets file, and GitLab “will not be able to decrypt any encrypted values in the database.”
Restores have one more rule: “You can only restore a backup to exactly the same version and type (CE/EE) of GitLab on which it was created.” Every backup should therefore leave the server as three things:
- The archive, from
./data/backups/ ./config/gitlab-secrets.json- Your config home: the Compose file or
./config/gitlab.rb,which also records the exact version
GitLab upgrade path: required stops and security patches

GitLab’s upgrade path docs define required upgrade stops as “versions of GitLab that you must upgrade to before upgrading to later versions.” For GitLab 19, the stops are 19.2, 19.5, 19.8 and 19.11; as of October 2026, 19.2 has shipped and the other three are planned. At each stop, let the background migrations finish before moving on; GitLab’s Upgrade Path tool lists the exact route from your version.
With Compose, each step is the same four moves (GitLab’s Docker upgrade docs):
- Back up the database and the secrets file.
- Change the image tag in docker-compose.yml to the next stop.
- docker compose pull
- docker compose up -d, then wait for background migrations to finish.
This is why the tag is pinned. With :latest, the next pull or redeploy can land you on a version past a required stop.
Security is the other half of this habit. GitLab ships patch releases twice a month, and its maintenance policy backports security fixes only to the current release and the previous two monthly releases. Fall more than two minor versions behind and your GitLab stops receiving security fixes at all.
What this means for you: book a short upgrade window every month, even when there’s no feature you want, and check GitLab’s current upgrade path before every upgrade; these stops can change as new releases arrive.
Selfhost.dev Gitlab template pins the image the same way: the version never moves on a restart or redeploy.
When self hosted GitLab breaks: symptom, cause, fix
Most self hosted GitLab failures trace back to one of the five settings or the two habits above, and each leaves a recognisable symptom. Find yours in the left column; the cause and the fix sit beside it, with a link to the setting or habit that prevents it next time.
| Symptom | Likely cause | Fix |
|---|---|---|
Clone URLs start with http:// |
external_url set to http://, or proxy settings missing |
Set the public https:// URL; add the setting 1 lines behind a proxy |
| Redirect loop after enabling HTTPS | GitLab and your proxy both terminating TLS | Listen on 80, HTTPS off, Let’s Encrypt off |
| 502 right after starting | Reconfigure and migrations still running | Wait, follow docker logs -f gitlab, don’t restart |
| Won’t start after an email change | An empty or malformed SMTP value, or a quote character in the password | Complete or remove the block; check the reconfigure output |
| Unreachable, SSH included, on 4 GB | Out of memory on default settings | 8 GB, or the setting 3 trims |
Won’t start after removing root_password.txt |
The Compose file still references the secret | Remove the secret line and blocks, then restart |
| Disk fills up over weeks | Unrotated Docker logs, old backup archives, CI artifacts | Use a rotating log driver (GitLab’s Docker troubleshooting); prune old archives once they’re copied off the server |
| 2FA and CI/CD variables broken after a restore | gitlab-secrets.json not restored |
Restore the secrets file from the same backup set (habit 1) |
| Upgrade fails or stalls | A skipped required stop, or background migrations unfinished | Return to the last stop; let migrations finish first (upgrade paths) |
| Security scanners flag an old version | More than two minor releases behind | Upgrade through the stops to a supported release (maintenance policy) |
Self host GitLab by hand, on Selfhost.dev, or stay on GitLab.com?
Choose by who will own GitLab’s upkeep: the upgrades every month, the security patches, and the backups. If nobody will, GitLab.com is the honest answer. If someone will, self host by hand. If you want your own server and data but not the setup, that’s what our template is for.
- Nobody on the team will own upgrades and backups, and you’re within five users → GitLab.com Free. It’s hosted and maintained by the people who write GitLab.
- You need Premium features → a GitLab paid plan, on GitLab.com or as a licence on your own instance.
- Someone will own the config and the upgrade calendar → the Compose route above.
- You want your own GitLab, server and data, without the setup → Selfhost.dev: the proxy, email, memory and root-password settings applied before first boot, root SSH, and a pinned version, as a template on Selfhost.dev Projects.
On our template, email stays off until you add a relay, and upgrades and security patches are yours to schedule.
Launch GitLab on an hourly European 8 GB server, check the settings yourself, and delete it if you’d rather build it by hand. Open GitLab in the console → · See what the server costs
Frequently Asked Questions
Can GitLab be self hosted?
Yes. GitLab calls it GitLab Self-Managed: you run GitLab on your own server or cloud account. Community Edition is free and open source under the MIT licence, and installs with the Linux package on Ubuntu or Debian, with Docker, or on Kubernetes with GitLab’s Helm chart. You own the server, the data, the upgrades and the security patches.
How long does it take to self host GitLab?
About ten minutes to a working sign-in page: one measured install went from a stock server to HTTPS sign-in in 9 minutes 43 seconds. Add the time to write the config and close sign-up. After that, plan for upkeep, from about ten minutes to several hours a month depending on team size.
Do I need GitLab Runner?
Only for CI/CD. GitLab itself stores code and coordinates pipelines; the jobs run in GitLab Runner, a separate program you install in its own container or on another machine and register with your instance. On a small server, keep runners elsewhere so builds don’t compete with GitLab for memory.
Can I self host GitLab Pages?
Yes, with extra setup. Pages needs its own URL, pages_external_url, on a domain that isn’t a subdomain of your GitLab URL, plus a wildcard DNS record such as *.example.io. Since GitLab 17.4 a single-domain mode works without the wildcard. Our GitLab template doesn’t configure Pages, so you’d add it yourself.
How often does self hosted GitLab need upgrading?
GitLab releases a minor version every month and patch releases twice a month. You can skip minors, but you must pass through the required stops, which for GitLab 19 are 19.2, 19.5, 19.8 and 19.11. Security fixes reach only the latest three monthly releases, so don’t fall more than two behind.
Should I install GitLab CE or EE?
Either runs the same core. Enterprise Edition without a licence runs only the Free features, and you can activate paid features later with a code. GitLab’s memory-constrained guide adds one more rule: “When memory consumption is the primary concern, install GitLab CE. You can always upgrade to GitLab EE later.”
Based on this page: ·
On now or still deciding?
What's the bill you're looking at?
Roughly how much a month, all in?
Matched to RDS, we bill 3.0x less in ap-south-1 (Mumbai) and 2.1x less in us-east-1.
2 vCPU / 4 GB with 20 GB: $24.54/mo in Mumbai, $35.27/mo in us-east-1, against an estimated $73.75/mo on RDS.
See a real RDS bill, before and after →Neon meters compute hours and sleeps. We bill one fixed hourly rate and never sleep.
{price} Same number in a quiet month and a launch month.
Price your size →Two ways off the Supabase bill and you can keep the Supabase stack.
Self-host Supabase on a managed server: a European 8 GB server is $0.03/hr or move just the database to a dedicated Postgres. {price}
How self-hosted Supabase works here →An enterprise client is moving production ClickHouse to us at up to 60% less.
Worked example: off ClickHouse Cloud Scale to always-on managed ClickHouse, $891.86 to $364.03 a month, 59%.
See the ClickHouse bill, before and after →A PaaS bills per service. A project server is one bill for everything on it.
Worked example: a studio consolidated client hosting onto project servers, $390.00 to $82.66 a month, 78%.
See that bill, before and after →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Postgres and MySQL price the same.
Price your size →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price}
Price your size →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Pay-as-you-go credits, top up from $5, no plan tiers.
Price your size →Most setups map onto two shapes: dedicated databases on AWS and a project server for everything else.
{price} Project servers from about $0.02/hr in Europe.
Price your size →Under $200 a month, the calculator beats a human reply. Price it there first.
What's it for?
Where do your users mostly sit?
Dedicated managed Postgres or MySQL, with point-in-time restore, pooling and Multi-AZ failover when you want it.
{region} If you need scale-to-zero or instant branching, Neon fits better than we do.
What managed Postgres includes →Managed ClickHouse for events at volume or TimescaleDB on managed Postgres for time-series next to your app data.
Worked example: off ClickHouse Cloud Scale, $891.86 to $364.03 a month, 59%. {region}
See the ClickHouse bill, before and after →pgvector on managed Postgres: one database instead of a second vendor.
{region} TimescaleDB is one click away on the same instance if you also have time-series.
When a dedicated vector DB is worth it →A project server from about $0.02/hr in Europe: push to GitHub and it deploys, several apps and their databases on one box.
Auto-deploy on push, PR previews, custom domains. The $5 welcome credit covers the start of it, no card and you can pause it to $0.
How Projects work →Project servers: many sites per server, one bill.
Worked example: a studio consolidated client hosting, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Most things fit dedicated databases on AWS plus a project server for the apps.
{region}
See it in the live demo →What are you trying to do?
Which editor?
We migrate you, free, on every plan size.
An engineer runs it with you: match the instance, replicate or dump and restore, test the restore, cut over.
See one migration, step by step →The Supabase stack, one click, on a server of your own.
One click from the template. A European 8 GB server is $0.03/hr. Nothing to build or wire up.
Self-hosted Supabase in one click →Paste one config and your editor can run the whole backend.
Run it once, sign in when the browser opens and all 216 tools register.
An hourly instance you pause when done.
Restore a snapshot into a second instance, point staging at it, pause it when idle.
Price a small instance →Push to GitHub and it's live: auto-deploy, PR previews, custom domains.
A project server from about $0.02/hr in Europe runs several apps and their databases.
Deploy guides by framework →The one that matters most:
A managed database for as low as $5 a month. Project servers from about $0.02 an hour in Europe.
The smallest dedicated Postgres, a t4g.nano with 1 GB, is about $5.34 a month in ap-south-1 (Mumbai) and about $6.41 in us-east-1 and the $5 welcome credit covers its first days. Pay-as-you-go credits, top up from $5, no tiers.
Price your size →When production needs help, you talk to the engineers who run it and a founder reads every request.
Outages, restores, performance issues and migrations reach the people operating the platform. No response-time promise or uptime percentage we cannot prove.
How support and recovery work →Failover, point-in-time restore and backups cover the common ways a database fails.
Multi-AZ failover is a toggle on Postgres, MySQL, Redis and ClickHouse and a cluster you pick at create on OpenSearch; Postgres and MySQL add point-in-time restore and every engine gets automated backups, live metrics and alerts.
The reliability and recovery details →We migrate you, free. An engineer plans and runs the move with you.
Match the instance, replicate or dump and restore, test the restore, cut over. Any plan size, no extra cost.
See one migration, step by step →Run it in your own AWS account with BYOC, in the region you need.
Encryption in transit and at rest on every managed instance. We do not hold SOC 2 or HIPAA today and we will say so before you spend an hour.
What we can and cannot certify →Fair enough. The live demo is the fastest way to see it.
Or claim $5 to start, no card needed.
Watch the live demo →Our founder
You've already sent us your setup from this browser. A founder will reply to it; no need to send it twice.
Got it. I'll reply to within two working days, from my own inbox.
Noted. One note when it changes, nothing else.
Ship the app you just read about.
Deploy straight from GitHub onto a dedicated server we run for you, with auto-deploy on push and preview environments. Pay by the hour from about $0.02 in Europe, with billing stopped at a zero balance. No DevOps. Limited-time offer: get $5 in free credit at signup, no card needed.
Based on this page: ·
On now or still deciding?
What's the bill you're looking at?
Roughly how much a month, all in?
Matched to RDS, we bill 3.0x less in ap-south-1 (Mumbai) and 2.1x less in us-east-1.
2 vCPU / 4 GB with 20 GB: $24.54/mo in Mumbai, $35.27/mo in us-east-1, against an estimated $73.75/mo on RDS.
See a real RDS bill, before and after →Neon meters compute hours and sleeps. We bill one fixed hourly rate and never sleep.
{price} Same number in a quiet month and a launch month.
Price your size →Two ways off the Supabase bill and you can keep the Supabase stack.
Self-host Supabase on a managed server: a European 8 GB server is $0.03/hr or move just the database to a dedicated Postgres. {price}
How self-hosted Supabase works here →An enterprise client is moving production ClickHouse to us at up to 60% less.
Worked example: off ClickHouse Cloud Scale to always-on managed ClickHouse, $891.86 to $364.03 a month, 59%.
See the ClickHouse bill, before and after →A PaaS bills per service. A project server is one bill for everything on it.
Worked example: a studio consolidated client hosting onto project servers, $390.00 to $82.66 a month, 78%.
See that bill, before and after →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Postgres and MySQL price the same.
Price your size →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price}
Price your size →A managed database for as low as $5 a month. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Pay-as-you-go credits, top up from $5, no plan tiers.
Price your size →Most setups map onto two shapes: dedicated databases on AWS and a project server for everything else.
{price} Project servers from about $0.02/hr in Europe.
Price your size →Under $200 a month, the calculator beats a human reply. Price it there first.
What's it for?
Where do your users mostly sit?
Dedicated managed Postgres or MySQL, with point-in-time restore, pooling and Multi-AZ failover when you want it.
{region} If you need scale-to-zero or instant branching, Neon fits better than we do.
What managed Postgres includes →Managed ClickHouse for events at volume or TimescaleDB on managed Postgres for time-series next to your app data.
Worked example: off ClickHouse Cloud Scale, $891.86 to $364.03 a month, 59%. {region}
See the ClickHouse bill, before and after →pgvector on managed Postgres: one database instead of a second vendor.
{region} TimescaleDB is one click away on the same instance if you also have time-series.
When a dedicated vector DB is worth it →A project server from about $0.02/hr in Europe: push to GitHub and it deploys, several apps and their databases on one box.
Auto-deploy on push, PR previews, custom domains. The $5 welcome credit covers the start of it, no card and you can pause it to $0.
How Projects work →Project servers: many sites per server, one bill.
Worked example: a studio consolidated client hosting, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Most things fit dedicated databases on AWS plus a project server for the apps.
{region}
See it in the live demo →What are you trying to do?
Which editor?
We migrate you, free, on every plan size.
An engineer runs it with you: match the instance, replicate or dump and restore, test the restore, cut over.
See one migration, step by step →The Supabase stack, one click, on a server of your own.
One click from the template. A European 8 GB server is $0.03/hr. Nothing to build or wire up.
Self-hosted Supabase in one click →Paste one config and your editor can run the whole backend.
Run it once, sign in when the browser opens and all 216 tools register.
An hourly instance you pause when done.
Restore a snapshot into a second instance, point staging at it, pause it when idle.
Price a small instance →Push to GitHub and it's live: auto-deploy, PR previews, custom domains.
A project server from about $0.02/hr in Europe runs several apps and their databases.
Deploy guides by framework →The one that matters most:
A managed database for as low as $5 a month. Project servers from about $0.02 an hour in Europe.
The smallest dedicated Postgres, a t4g.nano with 1 GB, is about $5.34 a month in ap-south-1 (Mumbai) and about $6.41 in us-east-1 and the $5 welcome credit covers its first days. Pay-as-you-go credits, top up from $5, no tiers.
Price your size →When production needs help, you talk to the engineers who run it and a founder reads every request.
Outages, restores, performance issues and migrations reach the people operating the platform. No response-time promise or uptime percentage we cannot prove.
How support and recovery work →Failover, point-in-time restore and backups cover the common ways a database fails.
Multi-AZ failover is a toggle on Postgres, MySQL, Redis and ClickHouse and a cluster you pick at create on OpenSearch; Postgres and MySQL add point-in-time restore and every engine gets automated backups, live metrics and alerts.
The reliability and recovery details →We migrate you, free. An engineer plans and runs the move with you.
Match the instance, replicate or dump and restore, test the restore, cut over. Any plan size, no extra cost.
See one migration, step by step →Run it in your own AWS account with BYOC, in the region you need.
Encryption in transit and at rest on every managed instance. We do not hold SOC 2 or HIPAA today and we will say so before you spend an hour.
What we can and cannot certify →Fair enough. The live demo is the fastest way to see it.
Or claim $5 to start, no card needed.
Watch the live demo →Our founder
You've already sent us your setup from this browser. A founder will reply to it; no need to send it twice.
Got it. I'll reply to within two working days, from my own inbox.
Noted. One note when it changes, nothing else.