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.
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.
- 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.