Developer tools
Gitea VPS requirements: RAM, CPU, disk, and what really sizes the server
Gitea is a self-hosted Git service: repositories, pull requests, issues, a package registry and GitHub-style CI (Gitea Actions), in one Go binary or one container. It's one of the few self-hosted apps whose docs give a sizing rule: "2 CPU cores and 1GB RAM is typically sufficient for small teams/projects", and a Raspberry Pi 3 is enough for small workloads. Published tests put an idle Gitea at 79–150 MiB, so a private forge fits the smallest VPS plans with room to spare. What actually decides the server size is everything around it: AI crawlers on a public instance, which have pushed Gitea servers into multi-gigabyte out-of-memory crashes, and CI jobs if you run a runner on the same box. Since September 2026 the version numbers dropped the "1." prefix, so 1.27 was followed by 28.
Sizing guide
Our recommendations, derived from the sourced figures below. Not measurements.
| Scenario | RAM | vCPU | Why |
|---|---|---|---|
| Private forge for one person, SQLite, no CI on the box | 1 GB | 1 | Published idle readings are 79–150 MiB, and people have run it in 512 MB. 1 GB covers the OS, a reverse proxy and big clones; add swap. Keep it private so crawlers never reach it. We haven't measured it on a VPS yet. |
| Small team, the official guidance | 1 GB | 2 | The docs' own rule of thumb: 2 CPU cores and 1 GB of RAM for small teams and projects. The second core helps with clones, diffs and background jobs. Use PostgreSQL if the team will grow; SQLite doesn't scale and converting later is risky. |
| Public instance, or a team with PostgreSQL on the same VPS | 2 GB | 2 | Our estimate, not a measurement. PostgreSQL added about 45 MiB idle in one test, but the real reason is headroom for crawler bursts, which have pushed public instances to 7–12 GB. More RAM alone won't fix that; use REQUIRE_SIGNIN_VIEW or a bot filter too. |
| Gitea plus a runner building on the same VPS | 4 GB or more | 2+ | Our estimate. An idle runner used about 32 MiB in one test; the builds are what count, and one guide measured about 600 MB for the stack during a CI build. Size for your heaviest job, or put the runner on another machine. |
Official requirements
| Item | What the project says | Source |
|---|---|---|
| System requirements | "A Raspberry Pi 3 is powerful enough to run Gitea for small workloads. 2 CPU cores and 1GB RAM is typically sufficient for small teams/projects." Run it under a dedicated non-root system account; Git 2.0.0 or later is required, 2.1.2 or later for Git LFS | Gitea docs: What is Gitea?, System Requirements checked Nov 1, 2026 |
| Install methods | Container image docker.gitea.com/gitea (rootful, plus a separate rootless image that is not interchangeable with it), a single binary, distribution packages, or Kubernetes. The example compose file uses SQLite, publishes the web UI on 3000 and container SSH on 222, and pins a release tag such as 28.2.0 | Gitea docs: Installation with Docker checked Nov 1, 2026 |
| Databases | PostgreSQL 12 or newer, MySQL 8.0 or newer, MariaDB 10.4 or newer, MSSQL 2012 SP4 or newer, or built-in SQLite. The docs warn that "SQLite does not scale" and that converting between database types "is not a well-tested process", so pick the final one at install time | Gitea docs: Database Preparation checked Nov 1, 2026 |
| Cache | The default cache adapter is in-memory, with items kept 16 hours if unused. twoqueue (a size-limited LRU cache, 50,000 objects by default), Redis and Memcache are the alternatives. The last-commit cache keeps entries for 8760 hours for repositories with more than 1000 commits | Gitea docs: Configuration Cheat Sheet, [cache] checked Nov 1, 2026 |
| Crawler controls | REQUIRE_SIGNIN_VIEW (default false) can be true, or "expensive" to block anonymous users from "pages which consume a lot of resources, for example: block anonymous AI crawlers from accessing repo code pages" (marked experimental). A [qos] section (off by default) queues requests above CPU count x 4 in flight and sheds logged-out traffic first | Gitea docs: Configuration Cheat Sheet, [service] and [qos] checked Nov 1, 2026 |
| Disk-heavy features | Code search (REPO_INDEXER_ENABLED) is off by default and "uses a lot of disk space, about 6 times more than the repository size". Source archive downloads are on (DISABLE_DOWNLOAD_SOURCE_ARCHIVES = false) and a nightly cron deletes archives older than 24h. Actions keeps completed runs 400 days (RUN_RETENTION_DAYS) and logs 365 days | Gitea docs: Configuration Cheat Sheet checked Nov 1, 2026 |
| Actions and the runner | Actions is enabled by default ([actions] ENABLED = true), but jobs run on a separately installed Gitea Runner (5.x series; v5.2.4 on 28 Oct 2026). It needs Gitea 1.21 or later and Docker or Podman for container jobs, runs one job at a time by default (runner.capacity = 1), and "host" jobs run "without isolation" | Gitea docs: Gitea Runner; Runner configuration checked Nov 1, 2026 |
| Backups | gitea dump writes repositories, the database and config to one ZIP file. "To ensure the consistency of the Gitea instance, it must be shutdown during backup" | Gitea docs: Backup and Restore checked Nov 1, 2026 |
| Current version | v28.3.0, released 1 Nov 2026. Gitea dropped the "1." prefix with 28.0.0 (30 Sep 2026), so the upgrade path is 1.27.x to 28. 28.0.0 has two breaking changes: Git network operations go through an internal proxy with egress settings, and old Actions runs are now deleted after the retention period. 32-bit x86 binaries are no longer built | Gitea blog: Gitea 28.0.0 is released; GitHub releases checked Nov 1, 2026 |
What people report in practice
Individual reports, not controlled tests. Versions, hardware and settings differ, so treat these as data points, not guarantees.
-
Gitea idled at 79 MB of RAM and 373 MB of total Docker disk, 30 seconds after the documented install on a clean 2 vCPU / 8 GB VM (one reading). Forgejo, in the same sweep, read 100 MB and 383 MB. The authors note the OS with Docker already used about 600 MB on their boxes, on top of the app
Independent test of 96 self-hosted apps, Google Cloud e2-standard-2, Ubuntu 26.04, 28 Sep 2026. Idle with no users or data
Blog SelfHost Atlas: Self-hosted app RAM usage, 96 apps measured (2026) · checked Nov 1, 2026
-
docker stats on a running instance: gitea 148.2 MiB and 0.15% CPU, PostgreSQL 45.3 MiB, an idle runner 32.1 MiB. The guide's own table puts the stack at about 230 MB idle, about 400 MB with 5–10 active users and about 600 MB during a CI build, and says 1 GB is the minimum, 2 GB with a CI runner
Tutorial by a VPS provider (Virtua Cloud) on its own 4 vCPU / 8 GB plan, Gitea 1.25.5 with PostgreSQL 17, 2026
Blog Virtua Cloud: Self-host Gitea on a VPS with Docker Compose · checked Nov 1, 2026
-
"My instance of Gitea uses about 120MB of RAM, Postgres 10-20MB", on a 1 GB / 1 CPU VPS also running Nginx, Nextcloud, a mail server, Synapse and more, with the advice to add at least 1 GB of swap. Others: 512 MB under Cloudron for 3 users pushing a few times a week, and a 1 GB Linode shared with SVN, websites and package repos "with no problems"
r/Gitea thread, Sep 2022, answering how big a VPS very light personal use needs
Reddit r/Gitea: For very light personal usage, how big a VPS does Gitea need? · checked Nov 1, 2026
-
Peak RAM during YunoHost's automated package test was 372 MB for Gitea (333 MB still in use after the test), against 231 MB for Forgejo. A maintainer added that production use may differ
YunoHost forum, Jan 2025, quoting the packaging CI jobs. A short install test, not a production instance
Forum YunoHost forum: RAM usage for Gitea and Forgejo · checked Nov 1, 2026
-
A public Gitea on Kubernetes kept getting OOM-killed after memory reached about 7 GiB. The cause was crawlers from large cloud and social-media networks fetching pages for AI training, not a leak; a maintainer said each request costs memory and big repositories cost more. Blocking those networks' ASNs at the ingress brought memory back to normal, and Redis for cache and sessions helped further
GitHub issue, Feb to May 2025, Gitea 1.23.x
GitHub GitHub go-gitea/gitea #33520: OOM caused by numerous crawls · checked Nov 1, 2026
-
A public instance maxed its CPU and used about 12 GB of RAM. A maintainer traced the diagnosis file to the Git compare/diff page, and the logs showed crawler traffic from big cloud networks comparing old tags with the newest. After turning on the option to block expensive pages for anonymous users, the reporter wrote: "Not facing high CPU & RAM load anymore"
GitHub issue, Jun to Jul 2025, Gitea 1.24.2 in Docker
GitHub GitHub go-gitea/gitea #34916: Gitea consumes excessive CPU and RAM when mirror tokens expire · checked Nov 1, 2026
-
docker stats showed a quiet Gitea growing from about 130 MB to 240 MB in 11 hours and later to 5 GB, while htop on the host showed the gitea binary at about 250 MB. A maintainer found no leak in Gitea's own heap and pointed at how container memory is counted
GitHub issue, Dec 2023, Gitea 1.21 nightly in Docker with PostgreSQL
GitHub GitHub go-gitea/gitea #28606: Slow progressive memory leak with Docker container · checked Nov 1, 2026
Our measurements: coming soon
We haven't measured Gitea yet, so there are no VPSfit lab numbers on this page. When we do, they'll show the app version, the plan it ran on, the date, and the raw data. Here's what we'll record:
- Idle and 24-hour RAM of Gitea 28.3 with SQLite on a 1 GB plan, private, with ten repositories
- RAM and CPU while cloning, diffing and comparing tags on a large repository (Linux kernel mirror)
- Response times on a public 1 GB plan with REQUIRE_SIGNIN_VIEW = expensive and [qos] on versus off
- RAM of Gitea, PostgreSQL and a runner during a typical Node.js build on a 2 GB and a 4 GB plan
What drives Gitea's RAM use
A small Go server, then whatever each request costs
An idle Gitea sits around 80–150 MiB in published tests (SelfHost Atlas; Virtua Cloud). Memory rises with work: rendering diffs and blame views, comparing tags, big clones and the git processes Gitea starts for them. A maintainer traced one 12 GB spike to the compare page (#34916). A few people using it normally never get near that.
Crawlers turn cheap pages into expensive ones
A forge has a URL for every file at every commit, every blame, every compare and every issue filter. AI crawlers that walk them all pushed one public Gitea to about 7 GiB and repeated out-of-memory kills (#33520). The fix in both reports was to stop the traffic, not to add RAM. A private instance doesn't have this problem.
Disk: repositories, LFS, packages, Actions and the indexer
Everything users push lands on the VPS disk: repositories, LFS objects, the package registry, and Actions logs and artifacts, which are kept 365 and 400 days by default. Code search is off by default because it takes about six times the repository size, and source archives are generated on request and kept until a nightly cleanup (cheat sheet). The install itself is small: 373 MB of Docker disk in one test (SelfHost Atlas).
CI is a separate workload
Gitea only queues Actions jobs. The runner runs them, usually in containers, one at a time unless you raise runner.capacity (runner docs). A build can need far more RAM and CPU than the forge, so size for your heaviest job, not for Gitea.
Gotchas on a VPS
- Keep public instances away from crawlers. By default Gitea is open to search engines and serves no robots.txt (docs), and admins report AI crawlers ignoring robots.txt anyway (#33966). For a forge that's just for you, set
REQUIRE_SIGNIN_VIEW = trueor reach it over a VPN or tunnel such as Pangolin. For public code,REQUIRE_SIGNIN_VIEW = expensivekeeps anonymous visitors off the costly code pages, and[qos] ENABLED = truesheds logged-out traffic first under load (cheat sheet). - Ports 3000 and 222 are public by default. The example compose file publishes
3000:3000and222:22on every interface (docs), and Docker's published ports bypass UFW (Docker docs). Bind the web UI to127.0.0.1:3000:3000behind Caddy or Nginx with HTTPS, and finish the install wizard before the site is reachable, since whoever opens it first sets it up. - Check self-registration. The current cheat sheet lists
DISABLE_REGISTRATIONas true by default, but the install wizard and older configs can switch it on (cheat sheet). Look inapp.ini. With Actions on, a stranger who can create a repository can try to run workflows on your runner, and the docs' rule is never to provide a runner to a repository or instance you don't trust (Actions overview). - A runner on the same box is close to root. Container jobs need Docker or Podman, and the usual compose setups mount the Docker socket into the runner (example), which lets jobs control the host's Docker.
hostlabels run jobs with no isolation at all (runner docs). Use them only for your own repositories, or put the runner on a separate VPS. - Version 28 follows 1.27. 28.0.0 is the release after 1.27.3, not a giant jump (blog; forum). Read its two breaking changes first, and update scripts that download binaries, since the file names changed. Pin a tag such as
28.3.0rather thanlatest, and take a backup before every minor upgrade: the docs say a downgrade across minor versions needs that backup (upgrade docs). - docker stats can overstate Gitea's memory. In one report docker stats showed 5 GB while the gitea process on the host used about 250 MB (#28606). Before resizing the server, check Site Administration's system status or a diagnosis report (Monitor, then Trace), and set a container memory limit so one runaway request restarts Gitea instead of freezing the VPS.
- Back up with Gitea stopped, and off the server.
gitea dumpmakes one ZIP of repositories, database and config, and the docs say Gitea "must be shutdown during backup" for a consistent copy (docs). A short nightly stop is fine for a personal forge. Copy the ZIP to another machine.
Cheapest plans that fit
Gitea, private, one person, SQLite, no CI on the box: 1 GB RAM and 1+ vCPU
Threshold: Published idle readings of 79–150 MiB; 1 GB leaves room for the OS, a proxy and big clones. Not yet measured by us (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 1 GB | 1 GB | 1 shared, previous-gen Intel | 25 GB SSD | $5.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| DigitalOcean Basic 1 GiB | 1 GB | 1 shared | 25 GB SSD | $6.00 before tax |
Monthly cap, per-second billing | digitalocean.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
Gitea for a small team (official guidance): 1 GB RAM and 2+ vCPU
Threshold: Official: "2 CPU cores and 1GB RAM is typically sufficient for small teams/projects" (source). Only plans with at least 2 vCPUs are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 8 | 24 GB | 8 shared | 300 GB SSD (or 150 GB NVMe) | €11.20 excl. VAT · ≈ $12.56 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Hostinger KVM 2 | 8 GB | 2 AMD EPYC | 100 GB NVMe | $14.99 intro $8.79 before tax |
Prepaid intro rate; renews at $14.99/mo | hostinger.com checked Oct 28, 2026 |
Gitea plus an Actions runner on the same VPS: 4 GB RAM and 2+ vCPU
Threshold: Our estimate, not a measurement: Gitea's few hundred MiB plus room for typical container builds. Size up for heavy builds (source). Only plans with at least 2 vCPUs are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 8 | 24 GB | 8 shared | 300 GB SSD (or 150 GB NVMe) | €11.20 excl. VAT · ≈ $12.56 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Hostinger KVM 2 | 8 GB | 2 AMD EPYC | 100 GB NVMe | $14.99 intro $8.79 before tax |
Prepaid intro rate; renews at $14.99/mo | hostinger.com checked Oct 28, 2026 |
Prices checked Oct 28, 2026 on each provider's official pricing page. EUR prices converted at the ECB rate of Oct 27, 2026 (1 € = $1.115) only for ranking. See all plans on the cheapest 4 GB VPS page.