Deploy
Self hosted GitLab. We will run the server.
One container, TLS and your own domain. The slowest deploy in the catalog and worth the wait.
GitLab CE 19.3.1, the open source DevOps platform, deploys as a one-click template onto a dedicated server Selfhost.dev provisions, secures and runs, across six locations on three continents. A European 8 GB server is $0.03/hr, about $23 a month, for as many users as you like.
One click. One container. The template deploys in about twenty-five minutes.
no signup
+$5.00 added at signup · deployment choice preserved · no card
What is GitLab self hosted?
Your repositories.
On your own machine.
What it is. Self hosted GitLab is GitLab Community Edition running on a server you control rather than on GitLab.com. You get repositories, merge requests, issues and CI runners, with the source code, the database and every artefact on a machine that is yours.
Who it is for. Teams whose code cannot sit on someone else's infrastructure, and anyone who wants CI without a per-seat bill. The common thread is a compliance or control requirement, not a cost one.
When to use it. When source code has to stay on infrastructure you can point at, or when the sixth user arrives and GitLab.com stops being free. Not when you need working email on day one.
Self hosted GitLab requirements
Eight gigabytes, and why that is not negotiable.
| What GitLab CE needs | This deployment |
|---|---|
| Memory | 8 GB, and it is a hard floor. The platform refuses GitLab on anything smaller |
| Database | PostgreSQL, bundled inside the image |
| Cache and queues | Redis, bundled inside the image |
| Deploy time | About 25 minutes for the template. The slowest in the catalog |
None, and it cannot be configured with an environment variable. smtp_enable = false is compiled into the omnibus config | |
| Inbound SSH | Works only if you request a public port |
| Architecture | x86 or ARM |
| What Selfhost.dev provides | Detail |
|---|---|
| The server | A European 8 GB machine is $0.03/hr, about $23 a month, in one of six locations across three continents |
| HTTPS | Automatic, on the generated hostname or your own domain |
| Backups | Optional. Daily, whole VM, last 7 kept, +20% of the server price |
| Monitoring | Metrics, logs, and a health check every 60 seconds |
| Root access | Your SSH key, a root shell on your own server |
| Database alternative | GitLab bundles its own Postgres. A separate managed PostgreSQL instance is the route if you outgrow it |
| MCP tools | 189 across 31 modules |
Specifications current as of September 2026.
What launches: GitLab CE in Docker
One container, and it is a large one.
GitLab CE ships as a single omnibus container, with its own PostgreSQL and Redis inside rather than as sidecars. That is why it wants 8 GB to itself, and why the template takes about twenty-five minutes: first boot runs the full migration suite before the interface answers.
| Container | Image | Role |
|---|---|---|
gitlab (routed) | gitlab/gitlab-ce:19.3.1-ce.0 | The whole platform: web, Git, CI coordinator, Postgres and Redis inside one image |
The proxy configuration GitLab usually gets wrong
external_url is your HTTPS address with nginx["listen_https"] = false and listen_port = 80. That exact combination makes GitLab emit https:// clone URLs while its internal nginx listens on plain HTTP behind a terminating proxy. Get it wrong and every clone URL it hands out is unusable.
Tuned down on purpose, for a small host
prometheus_monitoring is off, saving 0.5 to 1 GB. puma worker_processes is 2, sidekiq max_concurrency is 9, both below GitLab's defaults, and shm_size is 256m. Deliberate choices for a single-server install, and why CE fits on 8 GB at all.
The tag is pinned. A floating latest is how a live GitLab gets dragged onto a new major and runs an irreversible migration nobody asked for. 19.3.1-ce.0 does not move unless you move it.
What we set up for you
The settings that decide whether it works at all.
| Setting | What we set, and why |
|---|---|
external_url | Your HTTPS address, with listen_https=false and listen_port=80 so clone URLs come out right |
GITLAB_ROOT_PASSWORD | Set before first boot. GitLab never comes up on a documented default password on Selfhost.dev |
gitlab_signup_enabled | false. Public registration is closed, so a public URL does not become a public GitLab |
prometheus_monitoring | Off, saving 0.5 to 1 GB |
puma / sidekiq | 2 workers, concurrency 9, tuned for a single host |
gitlab_shell_ssh_port | Set when you ask for a public port, so git over SSH works |
| TLS and domain | Certificate issued and renewed, on the generated hostname or your own |
No Selfhost.dev template ever boots on a documented default password. Where an app ships one, we replace it before the container is reachable, and if that seeding fails the instance boots locked rather than open.
How to self host GitLab in four steps
From zero to live.
No server to set up.
Four steps. One container, and the migrations are the slow part.
1. Choose GitLab and an 8 GB server
Pick one of six locations across three continents, then submit. Smaller servers are refused, because 8 GB is a hard floor the platform enforces rather than a recommendation.
2. Wait out the migrations
The container starts and runs GitLab's full database migration suite before the interface answers. About twenty-five minutes, and do not restart it: interrupting the migrations usually needs a fresh deployment.
3. Sign in as root
Use the password the console created during deployment. Public sign-up is already disabled, so a public URL does not become a public GitLab.
4. Make it yours
Add your domain from Settings with a TXT record, create your first group, and add an SMTP relay before you invite the team.
What we run, and what you run
The line between our job and yours.
| Selfhost.dev runs | You run |
|---|---|
| The server, its OS and its provisioning | GitLab CE, and when to upgrade it |
| The container and the network around it | Your groups, projects and permissions |
| TLS certificates and renewal | Your domain's DNS records |
| The reverse proxy and the generated HTTPS hostname | SMTP, which you must add yourself |
| Optional whole-server backups | Exports you take yourself, whenever you want |
| The 8 GB floor enforcement | CI runners, and whether to add more |
Selfhost.dev manages the server, not GitLab. There is no GitLab administration service, no upgrade scheduling and no support contract for the application. What there is instead is a machine with root on it, running CE, at one flat hourly rate with no seat count attached.
What an 8 GB server handles
One heavy workload, and this is it.
The platform reserves 1,536 MB for the host and counts GitLab as one heavy workload at 2,048 MB, so an 8 GB server has room for two more heavy workloads beside it. In practice most people give GitLab the machine to itself.
| Question | Answer |
|---|---|
| GitLab on 8 GB | The platform, its bundled Postgres and Redis, with room beside it |
| Below 8 GB | Refused by the platform. Not slow, refused |
| CI runners | The bundled coordinator schedules jobs. Heavy pipelines want their own runner on a second server |
No concurrent-user or pipelines-per-hour figure appears here, because no first-party measurement of this template exists.
GitLab self hosted pricing
CE is free. The server is the bill.
GitLab Community Edition is free software and Selfhost.dev does not charge for it. You pay for the server it runs on and nothing else. A European 8 GB server is $0.03/hr, about $23 a month if you leave it running, billed hourly against prepaid credits. There is no seat count, no plan above it and no licence to buy.
| Server | RAM | Europe | Monthly at 730 hrs |
|---|---|---|---|
cx33 (minimum, and required) | 8 GB | $0.03/hr | $23.36 |
cx43 | 16 GB | $0.06/hr | $46.72 |
Europe only. Outside Europe the console selects a different machine at a different rate: the US 8 GB equivalent is ccx13 at about $119 a month. Price it in your own location, no signup.
| Item | Cost |
|---|---|
| GitLab CE, the software | $0. It is free and open source |
| Its bundled PostgreSQL and Redis | $0 |
| HTTPS certificate and custom domain | $0 |
| Users, seats or contributors | $0 at any number |
| Bandwidth | $0. Traffic is included in the server price |
| Optional daily backups | +20% of the server price |
If your credit balance reaches zero the server stops and GitLab goes offline. Data is retained while the server exists, so topping up brings it back as it was. A server that is deleted takes its backup images with it, which is why a project export or an SSH copy kept elsewhere is worth the ten minutes. Signing up adds $5 in free credit, no card needed.
What every GitLab deployment gets
Five things the platform actually does.
- Every service is health-checked every 60 seconds.
- A stalled deploy is retried automatically, not abandoned.
- A deploy is never reported done until the URL actually answers, which on a twenty-five minute GitLab migration matters more than anywhere else in the catalog.
- Your version does not move.
gitlab-ce:19.3.1-ce.0is pinned. A floating tag is how a live GitLab gets dragged onto a new major and runs an irreversible migration. - GitLab never boots on a documented default password, and public sign-up ships closed.
Working out what a GitLab server costs?
Send yourself the sizing and the monthly figure for an 8 GB machine in your own location, plus the SMTP options that work with a self hosted GitLab. One email, no newsletter.
GitLab.com vs GitLab hosting on your own server
Free to five people. Then a conversation.
Our template is GitLab CE, and CE does not contain Premium or Ultimate features at all, so this is not our GitLab against their Premium. The comparison is CE on your own server against GitLab.com Free, which is hosted, free and genuinely good up to five people. GitLab.com Free stops at five users per top-level group, and at the sixth user GitLab stops publishing a price at all: Premium reads "Let's talk" and Ultimate reads "Contact us for custom pricing". A European 8 GB server here is $23.36 a month, flat, for as many users as the machine will carry, and the figure is on this page because we are willing to print it.
| GitLab.com Free | GitLab.com Premium | GitLab CE here | |
|---|---|---|---|
| Price | $0 | Not published. "Let's talk" | $23.36/mo flat for the server |
| Users | 5 per top-level group | Unlimited licensed | Unlimited |
| Compute minutes | 400/mo | 10,000/mo | Your own server, no meter |
| Storage | 10 GiB | Add-on, $5/mo per 10 GiB | The server's disk |
| Where the code lives | GitLab's infrastructure | GitLab's infrastructure | A machine you chose, in one of six locations |
| Root access | No | No | Yes, over SSH |
| Premium and Ultimate features | No | Yes | No. CE does not contain them |
| Works | Works | Does not send until you add a relay |
GitLab.com prices checked first-party at about.gitlab.com/pricing on 13 September 2026. Our figure is a European 8 GB server at 730 hours.
When GitLab.com is the better choice
If your team needs working email, use GitLab.com. This deployment cannot send password resets or member invitations until you add an SMTP relay yourself, and for most teams that is a genuine reason to stay on their free tier rather than a detail to work around. GitLab.com is hosted, free at the entry tier, maintained by the people who write GitLab, and it sends email.
GitLab hosting versus a VPS you set up yourself
Same hardware. Different twenty-five minutes.
It is the same hardware. We run on Hetzner, which is where most people putting GitLab on a VPS end up anyway. The machine is not the difference.
| A raw VPS | This template | |
|---|---|---|
| Docker and the omnibus config | Yours to install and write | Already running |
external_url and proxy headers | Yours to get right, and clone URLs break when you do not | Configured before first boot |
| Memory tuning for a small host | Yours to work out. Default GitLab will not fit comfortably | Puma, Sidekiq and Prometheus already tuned |
| TLS certificate | Certbot, plus a renewal cron you have to remember | Issued and renewed |
| Root access | Yes | Yes, the same |
| Time to a working GitLab | An afternoon, if the migrations behave | About twenty-five minutes for the template |
What you do not give up is root. SSH in, docker exec, take a backup, change the config. This is the same VPS with the awkward hours already spent. If all you need is CI, Jenkins self hosted is the lighter template.
Two things decide whether this deployment suits you
Eight gigabytes, and no email.
It needs 8 GB and it cannot send email. The platform refuses GitLab on anything smaller, and the template ships with smtp_enable = false compiled into its omnibus configuration, so password resets and member invitations will not deliver until you add a relay yourself.
Self hosted GitLab limitations
Six things to know before you deploy.
- No email at all, and it is not a settings change. GitLab ships here with
smtp_enable = falsecompiled into its configuration. Password resets will not arrive and invitations will not send. This is not an empty variable you fill in from the console: it means editing the omnibus config inside the container and reconfiguring. Add an SMTP relay before you invite anyone, or add your team by username. - Eight GB is a hard floor. The platform refuses GitLab on a server below 8 GB. Not degraded, refused. Budget $23.36 a month for a European machine before anything else.
- The slowest deploy in the catalog. About twenty-five minutes, because first boot runs GitLab's full database migration suite before the web interface answers. Never restart it mid-provision: interrupting the migrations leaves the database in a state that usually needs a fresh deployment.
- Registry and Pages are not configured. The container registry and GitLab Pages are part of CE but are not switched on in this template. They can be enabled by hand inside the container; nothing here does it for you.
- Inbound SSH needs a public port.
gitover SSH works only if you request a public port for the deployment. Without it, clone and push over HTTPS. - CE is not Premium. Merge approvals, epics, advanced roles and security dashboards are Premium and Ultimate features. They are not in CE and no hosting arrangement adds them. If you need them, buy a GitLab plan; that is a licensing fact, not a hosting one.
GitLab backup and restore
Every clone your team holds is already a copy.
What a backup covers
Daily, optional, 20% of the server price. One image is the container, its bundled PostgreSQL and Redis, and every volume together, including repositories and CI artefacts. The last seven are kept, rotating.
They do not survive deletion
Backup images live with the server. If the server is destroyed, they go with it. A backup protects you from a mistake, not from an unpaid bill.
Your own copy, whenever you want one
gitlab-backup create writes a complete tar of repositories, database, uploads and CI artefacts. Add your public key, docker exec in, run it, copy the archive off over SSH. GitLab's own tool, and it restores onto any GitLab of the same version.
Nothing here is designed to make leaving hard
Repositories are Git, so every clone is already a copy, and gitlab-backup create takes the rest. No export button, and no lock either.
Moving an existing GitLab here
Two routes, and one of them is a tarball.
From another self-managed GitLab
Run gitlab-backup create on the old instance, copy the archive across, and restore it here with gitlab-backup restore. Versions must match, so check the old instance is on 19.3.1 or upgrade this one to meet it before restoring.
From GitLab.com
Use GitLab's per-project export: Settings, General, Advanced, Export project. Each export is a file you import here from the new-project screen. Repositories, issues, merge requests, milestones and wiki come across.
Two things to expect. Per-project export does not carry CI/CD variables or registry images, so those are set again by hand. And invitation emails will not send from this deployment, so add your team by username rather than by email invite, or configure SMTP first. We do not perform the migration: there is no migration service and no import API, and both routes are things you run.
Related guides.
Frequently asked questions
Is GitLab free?
How much does self hosted GitLab cost?
Can GitLab send email from this deployment?
Why does GitLab need 8 GB?
Does this include Premium or Ultimate features?
How do I move an existing GitLab here?
Can I use my own domain?
What happens to my repositories if my credit balance reaches zero?
About Selfhost.dev
Selfhost.dev is a managed self hosting platform for developers and small teams. Open source apps and databases on dedicated servers you control, billed by the hour, in six locations across three continents.
Best for: GitLab, Jenkins, Grafana, MinIO and managed PostgreSQL, MySQL, Redis and ClickHouse.