Samen aan software werken kan niet alleen via GitHub. Het opensource-codeplatform Forgejo kun je ook zelf hosten. We laten zien hoe dat werkt.
Waarom ontwikkelaars verder kijken dan GitHub
GitHub staat voor collaboratieve softwareontwikkeling ongeveer zoals TomTom voor navigatiesystemen. Het platform, een dochteronderneming van Microsoft, heeft rond het versiebeheerprogramma Git van Linus Torvalds een krachtig ecosysteem voor programmeurs opgebouwd: ze forken, branchen en committen, openen pull-requests, bespreken en mergen die. De workflow is inmiddels de gevestigde standaard in de softwareontwikkeling.
Rondom de repository met de eigenlijke code zijn items beschikbaar zoals Issues, Wiki’s en Actions – al met al dus een comfortabele projectomgeving waar ontwikkelaars tegenwoordig niet meer zonder willen.
Inmiddels zijn er echter ook punten van kritiek: allereerst is er de AI-koers van het bedrijf, die niet bij iedereen in goede aarde valt. GitHub Copilot is inmiddels alomtegenwoordig op het platform. Sinds april van dit jaar verzamelt Microsoft bovendien interactiegegevens van gebruikers om eigen AI-modellen te trainen – tenzij je je daar actief voor afmeldt.
De infrastructuur van GitHub kan tegelijkertijd moeilijk gelijke tred houden met de boom in door AI ondersteunde en agent-gebaseerde softwareontwikkeling. Alleen al in april waren er twee grotere incidenten (problemen met de merge-queue, uitval van de zoekfunctie).
Mitchell Hashimoto, medeoprichter van Hashicorp en ontwikkelaar van de terminalemulator Ghostty met GitHub-gebruikersnummer 1299, kondigde eind april als reactie op de problemen aan dat hij zijn project naar een andere code-hub wilde migreren en op GitHub alleen nog een read-only-kopie van de Ghostty-code beschikbaar zou stellen (achtergrondinformatie hierover vind je bij de link bij dit artikel).
Naast Hashimoto onderzoeken ook andere ontwikkelaars alternatieven voor GitHub omdat ze ontevreden zijn over de AI-koers of omdat ze zich onafhankelijker willen maken van Amerikaanse bedrijven.
Een potentiële nieuwe thuisbasis voor als je wilt overstappen kan Codeberg zijn: het platform wordt gedragen door een Duitse vereniging, ziet af van tracking en financiert zich via donaties. Het is gebaseerd op het Forgejo-project, dat in 2022 is ontstaan uit een fork van Gitea, nadat er in de community ontevredenheid was over de oprichting en koers van het bedrijf Gitea Limited.

Hieronder leggen we uit hoe je je eigen Forgejo-instantie kunt beheren. Dat is in principe mogelijk op diverse platforms, van een Raspberry Pi of thuisserver tot een (gevirtualiseerde) huurserver bij een hoster, want Forgejo stelt vrij bescheiden eisen aan de hardware.
In ons voorbeeld gaan we uit van het scenario dat je Forgejo op een huurserver draait die via internet bereikbaar is, zodat je samen met anderen aan projecten kunt werken. Daarom zetten we de reverse-proxy Caddy in om Forgejo te ondersteunen. Die zorgt voor de transportversleuteling en verlengt automatisch TLS-certificaten. Daar heb je een eigen (sub)domein (git.example.com) voor nodig dat naar het IP-adres van je server verwijst, evenals enige basiskennis van Linux en Docker.
Je kunt Forgejo natuurlijk ook op een systeem in een eigen netwerk draaien en er alleen lokaal toegang toe krijgen via VPN of een tunneloplossing zoals Pangolin. Hoe dat werkt, hebben we beschreven in ons zelfhosting-artikel [1].
Installeren
Log via SSH in op je server en werk het systeem bij met de pakketbeheerder van je distributie. We hebben Forgejo getest op een host met Ubuntu Server, maar het moet op elke Linux-distributie met Docker werken.
Voeg daarna de pakketbronnen van Docker toe en installeer de containerengine zoals beschreven in de documentatie (zie de link). Voor een testomgeving of niet-productief gebruik kun je Docker ook met het installatiescript installeren:
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Als je de (cloud)firewall van je hoster gebruikt, moet je mogelijk nog enkele poorten openen. Naast TCP-poort 22 voor SSH-toegang moeten de poorten 80, 443 en 2222 bereikbaar zijn. Caddy heeft poort 80 nodig voor het verkrijgen van certificaten, via poort 443 wordt de Forgejo-webinterface met HTTPS geleverd en poort 2222 is voor Git via SSH.
Je installeert Forgejo met behulp van Docker Compose. Via de link bij dit artikel kun je dockercompose.yaml, een .env-bestand en een Caddyfile downloaden. De Caddyfile moet je enigszins aanpassen.
Plaats de bestanden in de map forgejo-caddy. Bewerk eerst het Caddyfile met een teksteditor zoals nano:
git.example.com {
encode zstd gzip
reverse_proxy forgejo:3000
request_body {
max_size 1024MB
}
}
Vervang de placeholder git.example.com door je eigen domein. Doe hetzelfde in het bestand .env voor FORGEJO_DOMAIN en FORGEJO_ROOT_URL:
FORGEJO_DOMAIN=git.example.com
FORGEJO_ROOT_URL=https://git.example.com
Het configuratie voor de Forgejo-instantie staat eigenlijk in een bestand met de naam app.ini, dat wordt aangemaakt nadat de container gestart is. Via omgevingsvariabelen met het patroon FORGEJO__[SECTION]__[KEY] in het Docker Compose-bestand kun je alvast een aantal waarden doorgeven. We hebben bijvoorbeeld al ingesteld dat de SSH-server luistert op poort 2222 en registraties uitgeschakeld.
In ons voorbeeld wordt SQLite als database gebruikt, wat voldoende moet zijn als je Forgejo met een klein team wilt gebruiken. Als je grotere plannen hebt, moet je Forgejo voorzien van een volwaardige MySQL- of PostgreSQL-database. Hoe dat werkt, staat beschreven in de Forgejo-documentatie.
Git-Forge opstarten
Tijd voor de eerste start: start het containercluster met het commando docker compose up -d. Na korte tijd zou je je instantie via de URL https://git.example.com in de browser moeten kunnen openen. Dat moet je ook snel doen, zodat niemand je voor is, want daar wacht de installatiewizard op je waarmee je een beheerdersaccount moet aanmaken – wij hebben de onze de naam cttest gegeven. Het grootste deel van het invoerscherm is al ingevuld met de waarden uit het bestand docker-compose.yaml.
Als je een volledig privé-instantie wilt gebruiken, die ook de openbare repository’s verbergt voor gebruikers die niet aangemeld zijn, kun je in het menu met overige instellingen aanvinken dat gebruikers zich eerst moeten aanmelden.
Om Forgejo in staat te stellen e-mails te versturen, moet je bovendien bij de e-mailinstellingen de toegangsgegevens voor een SMTP-server invoeren, maar je kunt Forgejo ook zonder gebruiken.

Aan de slag
Je Forgejo-instantie is nu klaar. Als je bekend bent met GitHub of GitLab, vind je daar snel je weg. Als eerste stap moet je je openbare SSH-sleutel opslaan – ook om te testen of je Git via SSH kunt gebruiken. Klik daarvoor op je profielpictogram in de rechterbovenhoek van het venster en ga naar de instellingen. Navigeer vervolgens naar het menu voor SSH-sleutels, sla de SSH-sleutel op en geef deze een bijnaam.
Test daarna de verbinding vanaf je lokale computer:
ssh -T [email protected] -p 2222
Forgejo zou het verzoek moeten bevestigen met: Hi there, cttest! You’ve successfully authenticated with the key named cttest, but Forgejo does not provide shell access.
Je kunt ervan uitgaan dat Forgejo de verbinding verbreekt omdat het geen shell ter beschikking stelt. De test laat echter zien dat je je met succes met je sleutel geauthenticeerd hebt en daarmee ook code via SSH naar repository’s bij Forgejo kunt pushen, zoals je gewend bent.
Om daarbij niet elke keer poort 2222 te hoeven opgeven, voeg je de volgende regel toe aan je SSH-configuratiebestand (~/.ssh/config):
Host git.example.com
HostName git.example.com
User git
Port 2222
IdentityFile ~/.ssh/id_ed25519
Pas de namen bij Host en Hostname aan en voer bij IdentityFile het pad naar je SSH-sleutel in.
Vooruitblik
Met Forgejo heb je een nieuwe thuisbasis voor programmeerprojecten gecreëerd.
Als volgende stap kun je beginnen met het verplaatsen van repository’s van GitHub. Daar biedt Forgejo een importfunctie voor die niet alleen de code, maar ook issues en dergelijke meeneemt. Daar heeft het een GitHub-accesstoken voor nodig. Hoe je die aanmaakt en het importeren start, wordt beschreven in de documentatie.
We zullen op een later tijdstip bekijken we hoe je een Forgejo-runner opzet en een softwarepipeline bouwt, zoals je die kent van GitHub Actions, want de YAML-syntaxis daarvan is compatibel met Forgejo.
Literatuur
[1] Niklas Dierking en Noud van Kruysbergen, Diensten met reverse-proxy of (VPN-)tunnel beschikbaar maken, c’t 10/2025, p.42
(Niklas Dierking en Daniel Dupré)
Praat mee