Internal Forge Comparison
This repository lists the pros and cons of three popular open-source Git forges (GitLab CE, Gitea, and Forgejo) based on a side-by-side comparison in a self-hosted test lab on a single VPS (github.com/matteodelucchi/gitforgelab).
The goal is to provide a practical reference for teams and organizations evaluating which Git forge best fits their needs, based on real-world usage and feature comparisons.
Why This Exists
Choosing the right Git forge for a team or company is not trivial.
Each platform differs in resource usage, feature set, administration complexity, and SSO integration.
This lab deploys all three behind a shared reverse proxy with centralised OIDC authentication so they can be evaluated under identical conditions (same hardware, same identity provider, same workflow).
The entire infrastructure is defined as code (Terraform + Ansible + Docker Compose) and can be torn down and recreated in minutes.
Limitations
This is a test lab, not a production deployment.
- Runs on a single VPS. There is no high-availability, redundancy, or horizontal scaling.
- SSH Git access is disabled; repositories are accessed over HTTPS only.
- All services share one PostgreSQL and one Redis instance to save resources.
- GitLab is memory-tuned aggressively (2 Puma workers, 5 Sidekiq concurrency) and will be slow under real workloads.
- No backup strategy is included.
Comparison
Quick decision guide
| If we want… |
Choose |
| A complete DevOps platform with integrated CI/CD, package registry, security scanning, and enterprise features |
GitLab |
| A lightweight, easy-to-operate Git server with minimal resource usage |
Gitea |
| A community-driven forge similar to Gitea but with built-in CI (Forgejo Actions) and future federation support |
Forgejo |
A more detailed comparison that covers forgejo specific features and limitations is available in the forgejo.org/compare.
- Same but different. Forgejo is a hard fork of Gitea, so they share the same codebase and many features.
- However, Forgejo has a more active development and a more open governance model, which allows it to evolve faster and to include features that are not present in Gitea (e.g. Forgejo Actions, ...)
- Many people and companies move from gitea to forgejo reddit.
- Fedora moves to Forgejo: Fedora Magazine
- The Fedora Team compared intensively GitLab and Forgejo before choosing the latter. The report is here.
- Forgejo is prefered over GitLab by many Software specialists.
One of the reasons is that GitLab is a very resource intensive application (because i.a. its written in Ruby) and that it has a very complex architecture (many services, many dependencies).
Forgejo is written in Go (more efficient and state-of-the-art) and has a much simpler architecture.
Pricing
| Feature |
GitLab |
Gitea |
Forgejo |
| Free tier |
✅ |
✅ |
✅ |
| Paid tier (per user/month) |
premium: 29$ ultimate: on request |
enterprise: 19$ |
❌ (donation-based) |
| Information on pricing |
info |
info |
info |
Core Git Features
| Feature |
GitLab |
Gitea |
Forgejo |
| Git repositories |
✅ |
✅ |
✅ |
| Git LFS support |
✅ |
✅ |
✅ |
| Git tags for releases |
✅ |
✅ |
✅ |
| Protected branches |
✅ |
✅ |
✅ |
| Repository mirroring |
✅ |
✅ |
✅ |
| Webhooks |
✅ |
✅ |
✅ |
Collaboration and Project Management
| Feature |
GitLab |
Gitea |
Forgejo |
| Issues |
✅ |
✅ |
✅ |
| Pull / merge requests |
✅ |
✅ |
✅ |
| Pull request reviewer assignment |
✅ |
✅ |
✅ |
| Pull request inline comments |
✅ |
✅ |
✅ |
| Wiki (per repository) |
✅ |
✅ |
✅ |
| Snippets / gists |
✅ |
⚠️ limited |
⚠️ limited |
| Project management |
free: simple kanban premium: roadmap |
simple kanban |
simple kanban |
| Organization / group hierarchy |
✅ |
⚠️ simpler model |
⚠️ simpler model |
| Code search (global) |
✅ |
⚠️ limited |
⚠️ limited |
| Repository mirroring (push/pull) |
✅ |
✅ |
✅ |
CI/CD and Automation
| Feature |
GitLab |
Gitea |
Forgejo |
| Built-in CI/CD |
✅built-in Gitlab CI/CD |
️ ❌ external CI (woodpecker/Drone) |
✅Forgejo Actions (Github-Actions compatible) |
| Automated workflows |
✅ |
⚠️ external CI required |
✅ |
| Workflow triggers |
✅ |
⚠️ depends on CI integration |
✅ |
| External CI integration |
✅ |
✅ |
✅ |
Artifacts & Registries
| Feature |
GitLab |
Gitea |
Forgejo |
| Package registry |
✅ |
⚠️ limited ecosystem support |
✅ |
| Container registry |
✅ |
⚠️ plugin / external registry |
⚠️ evolving support |
Authentication and Access Control
| Feature |
GitLab |
Gitea |
Forgejo |
| Access control |
✅ |
✅ |
✅ |
| LDAP / Active Directory |
✅ |
✅ |
✅ |
| SAML / enterprise SSO |
⚠️ enterprise tier |
❌ not supported |
❌ not supported |
| Federation between instances |
❌ not supported |
❌ not supported |
⚠️ planned (ForgeFed) |
Operations / Self-Hosting
| Feature |
GitLab |
Gitea |
Forgejo |
| Resource footprint |
❌ heavy (many services) |
✅ light |
✅ light |
| Deployment complexity |
❌ complex |
✅ simple |
✅ simple |
Notes on the test project setup:
Gitea
- SSH is disabled by default, so we use HTTPS to clone the repository.
- it can be enabled in the Gitea settings if needed (see here and here)
- HTTPS: works, but requires the user to set a password manually in the profile first. That's unexpected since it should be inherited by authentik. Probably a misconfiguration from there.
Forgejo
- SSH is disabled by default, so we use HTTPS to clone the repository. Same as with Gitea.
- HTTPS: Same as with Gitea.
Gitlab
- SSH is active by default. But the port is wrongly configured and probably already used by the host...
- HTTPS: works well.