Tech Digest

Developer

Forgejo

Nonprofit-governed Gitea fork, copyleft since v9.0, run by Codeberg e.V.

DeveloperGPL-3.0-or-laterStablearm64 buildsNative OIDC
Last reviewed Profile maintained against the project's own documentation
Operational load
2 / 5
Light
Idle memory
150 MB
typical use ~450 MB
Moving parts
1
containers in a normal deployment
Backup shape
SQLite backup
needs a dump or a stop

Forgejo is a self-hosted Git forge: repositories, issues, pull requests, a package registry and a GitHub Actions compatible runner, all from one Go binary. It replaces a paid GitHub organization or a Bitbucket Server licence for people who want the code on disks they control.

Our verdict on Forgejo#

Pick Forgejo. The two projects are close enough on features that the decision is about who controls the code. Gitea's domains and trademark sit with Gitea Ltd, contributions carry a copyright assignment, and CommitGo sells a proprietary Gitea Enterprise on top of the MIT core. Forgejo belongs to Codeberg e.V., a German nonprofit, and since v9.0 on 22 August 2024 it ships under GPL-3.0-or-later, which makes that open core pattern structurally impossible against Forgejo's code. The costs are real. Copyleft irritates some corporate legal reviews, Forgejo has fewer eyes on it, and the projects hard forked in early 2024 so the escape hatch is narrowing: Forgejo v10.0 was the last release that reads a Gitea v1.22 or older database directly. Current is the v16 series. On a small VPS one container idles near 150 MB on SQLite and serves a dozen developers without complaint. ActivityPub federation is the differentiator and is still maturing.

Who Forgejo is for#

Choose it if

  • A team of two to thirty developers who want GitHub-shaped workflow without a per-seat bill or a US SaaS dependency.
  • Anyone who got burned by a licence change and wants the copyleft guarantee written down rather than promised.
  • Homelabbers who need a forge that shares a 2 GB VPS with three other services and still feels quick.
  • Public-sector or association users who want the upstream governed by a nonprofit with published statutes.

Look elsewhere if

  • You are already on Gitea v1.23 or newer, where there is no supported direct migration and you would be exporting and re-importing by hand.
  • You need mature large-scale CI, merge queues, or a security scanning pipeline out of the box; Forgejo Actions is capable but thin next to GitLab or GitHub.
  • Your legal team refuses GPL-3.0 code on the network estate, in which case MIT-licensed Gitea is the pragmatic pick.

What running it actually looks like#

One container, one volume, no separate database if you accept SQLite. The image codeberg.org/forgejo/forgejo:16 covers amd64 and arm64; the standard variant mounts /data, and the rootless variant mounts /var/lib/gitea and puts its SSH server on 2222 rather than 22. Set USER_UID and USER_GID to match the owner of the bind mount or first boot fails on permissions in ways the log only half explains. Port 3000 serves HTTP. SSH clones need either the container's own SSH daemon on a published port or a host sshd with an authorized_keys command shim. First run is a browser installer that writes app.ini, and it is unauthenticated until you finish it. Upgrades are pull, restart, watch the migration log. Do not jump several majors in one hop.

Resource profile#

Memory
150 MB idle, around 450 MB in ordinary use. A Go binary with a small resident set; the growth comes from the bleve code and issue indexers and from concurrent git operations, not from user count.
CPU and acceleration
Idles near zero. Spikes come from git pack operations on clone and push and from Actions runners, which should live on a separate host if builds are heavy.
Storage growth
Repositories dominate, and they grow at whatever rate your team commits binaries. LFS objects and package registry artifacts are the usual surprise, and neither is garbage collected aggressively.
Operational load
2 of 5, Light. One container, one volume, SQLite by default, and upgrades are pull and restart while it runs its own schema migrations. You read the release notes on major bumps and otherwise leave it alone.

Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.

Data and backup surface#

Everything sits under /data: gitea/conf/app.ini, git/repositories, gitea/gitea.db when you use SQLite, plus gitea/lfs, gitea/avatars and gitea/attachments. The supported route is forgejo dump, which zips config, the repository tree, the data directory and an SQL dump into one archive. Run it with the service stopped: a live copy can catch the database and the repository files at different instants and you will not know until a restore. On PostgreSQL, pair pg_dump with a snapshot of the repository tree taken at the same moment. gitea/indexers and gitea/queues are regenerable and safe to exclude, at the cost of a rebuild that takes minutes on a large instance.

Derived backup shape

SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.

Traps and surprises#

The Gitea migration window is closing

Forgejo v10.0, released January 2025, was the last version that reads a Gitea v1.22 or older database directly. From Gitea v1.22 and below the supported route is two hops: migrate to Forgejo v10.0.x first, then upgrade Forgejo to current. If you are already on Gitea v1.23 or newer there is no official direct path, and you are looking at repository-by-repository export and re-import.

First-run installer is open to whoever finds it

The initial setup page is served without authentication and the first account created becomes the instance administrator. If you publish port 3000 before you finish the wizard, anyone who reaches it can complete it and own your forge. Bind to localhost or a private network for the first run, or pre-write app.ini with INSTALL_LOCK = true and create the admin account from the CLI.

SSH clone URLs and the actual SSH port drift apart

The clone URL shown in the web UI comes from SSH_DOMAIN and SSH_PORT in app.ini, not from what Docker actually published. Map host 222 to container 22 and forget to set SSH_PORT = 222 and every developer copies a URL that times out. Fix the config, not the users.

Repository hooks bake in absolute paths

Every repository carries git hooks containing the absolute path of the Forgejo binary and its config. Move the install directory, switch from a distro package to a container, or restore into a different layout, and pushes fail with an opaque hook error while everything else looks healthy. Run the admin command to regenerate hooks after any relocation or restore.

GPL-3.0-or-later since v9.0

Forgejo relicensed from MIT to GPL-3.0-or-later with v9.0 on 22 August 2024. Running an unmodified instance changes nothing for you. Shipping a patched Forgejo to customers, or bundling it into an appliance, now carries source-provision obligations that the old MIT terms did not. Anything you took from Forgejo v8 or earlier stays MIT.

Specifications#

Category
Git forges and developer infrastructure
Licence
GPL-3.0-or-later (Copyleft)
Written in
Go / TypeScript
First release
2022
Maturity
Stable
Datastore
SQLite (default), PostgreSQL or MySQL optional
Default ports
3000, 22
Ships as
docker, native binary, helm chart
arm64 builds
Yes
Identity
Native OIDC. OAuth2/OIDC and LDAP are built-in authentication sources in the admin UI, no plugin needed, and you can disable local registration entirely.
Replaces
GitHub, Bitbucket Server, GitLab, Azure DevOps Repos
Project site
forgejo.org
Source
codeberg.org/forgejo/forgejo
Documentation
forgejo.org/docs/latest

Alternatives to Forgejo#

Everything else in git forges and developer infrastructure, closest in operational weight first.

ToolOps loadIdle RAMLicence
Gitea2, Light150 MBMIT
Woodpecker CI2, Light90 MBApache-2.0
code-server2, Light200 MBMIT
GitLab CE4, Heavy4096 MBMIT
Harbor4, Heavy2500 MBApache-2.0

Where Forgejo comes up elsewhere#

Sources#

Facts on this page were checked against the project's own material. Where a number is our own estimate rather than a published figure, the text says so.

  1. Forgejo relicensing announcement, GPLv3+
  2. Forgejo, comparison with Gitea and governance
  3. Forgejo downloads, current release and container tags
  4. Forgejo docs, installation with Docker
  5. Forgejo docs, admin installation index

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.