Skip to content

๐ŸฆŒ 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.