๐ฆ Forgejo โ Self-hosted Git & CI
Host: Homelab ยท Compose: Homelab/Forgejo/compose.yaml
Stack name: forgejo
1. Overview
A self-hosted Forgejo Git server โ a community fork of Gitea โ with a full CI runner pipeline. The runner uses Docker-in-Docker (DinD) to execute Actions workflows in isolated containers. This is the Git backend powering this very documentation repo.
2. Architecture & Services
| Service |
Image |
Port |
Role |
database |
11notes/postgres:17 |
5432 |
PostgreSQL backend for Forgejo |
forgejo |
forgejo/forgejo:15.0.3 |
3000 |
Git server + web UI |
runner |
forgejo/runner:12.11.1 |
โ |
CI job runner (Actions) |
dind |
docker:28.3.3-dind |
โ |
Docker daemon for runner containerised jobs |
3. Networking
internal โ Internal network connecting Forgejo, runner, and DinD.
database โ External network for PostgreSQL access.
cloudflare-net โ External network routing Forgejo through the Cloudflare Tunnel for public access at git.m1ckyb.com.
- Runner connects to DinD via
tcp://dind:2375 (no TLS).
4. Persistent Storage
| Container |
Host Path / Volume |
Description |
database |
postgres.etc (named vol) |
PostgreSQL config |
database |
postgres.var (named vol) |
PostgreSQL data |
database |
/backup/forgejo/database |
Automated DB backups |
forgejo |
/docker/data/forgejo/forgejo |
All Forgejo repos, config, attachments |
runner |
/docker/data/forgejo/runner/data |
Runner registration tokens and state |
runner |
/docker/data/forgejo/runner/config.yaml |
Runner configuration file |
5. Environment Variables
| Variable |
Service |
Description |
FORGEJO_DATABASE_PASSWORD |
database / forgejo |
PostgreSQL password (loaded from .env) |
FORGEJO__database__DB_TYPE |
forgejo |
postgres |
FORGEJO__database__HOST |
forgejo |
database:5432 |
USER_UID / USER_GID |
forgejo |
Run as UID/GID 2222 |
DOCKER_HOST |
runner |
tcp://dind:2375 |
TZ |
All |
Australia/Sydney |
6. Access & Usage
| URL |
Description |
https://git.m1ckyb.com |
Forgejo public web UI (via Cloudflare Tunnel) |
http://localhost:3000 |
Direct local access |
# Start the stack
docker compose -f Homelab/Forgejo/compose.yaml up -d
# Register the runner (first time)
docker exec -it forgejo-runner forgejo-runner register
# View runner logs
docker logs forgejo-runner -f
7. Maintenance & Backup
# Update all images
docker compose -f Homelab/Forgejo/compose.yaml pull
docker compose -f Homelab/Forgejo/compose.yaml up -d
# Backup (database auto-backs up every 2h to /backup/forgejo/database)
# Also rsync Forgejo data directory
rsync -av /docker/data/forgejo/ /backup/forgejo/data/
[!IMPORTANT]
Before updating Forgejo, always check the release notes for migration requirements. Some versions require running the gitea migrate command inside the container after upgrade.