Internal Forge 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.
Comparison
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.
Description
Languages
Shell
100%