Reproducible Forgejo + CI runner setup
Find a file
2026-08-06 16:25:31 +00:00
compose feat: initial forgejo + runner-image reproducible setup 2026-08-06 16:25:31 +00:00
runner-image feat: initial forgejo + runner-image reproducible setup 2026-08-06 16:25:31 +00:00
.env.example feat: initial forgejo + runner-image reproducible setup 2026-08-06 16:25:31 +00:00
README.md feat: initial forgejo + runner-image reproducible setup 2026-08-06 16:25:31 +00:00
setup.sh feat: initial forgejo + runner-image reproducible setup 2026-08-06 16:25:31 +00:00

Reproducible Forgejo + CI runner setup

This repository contains the declarative configuration for the Forgejo instance and its self-hosted CI runner at git.slaid098.dev.

What's here

  • compose/docker-compose.yml — Forgejo + act_runner stack (env-var references; real secrets live in the deployment's .env).
  • compose/runner-config.yaml — act_runner config (capacity: 4, cache enabled).
  • runner-image/Dockerfile — custom job image bundling Python 3.13, uv, Node 22, ripgrep, git, docker CLI. Replaces the flaky data.forgejo.org action downloads (setup-uv, setup-python, setup-node).
  • .env.example — placeholder env vars; copy to .env and fill in on the target host.
  • setup.sh — one-command reproducible deploy on a fresh Ubuntu server.

Why a custom runner image

data.forgejo.org (the action mirror act_runner uses) intermittently returns 404 for astral-sh/setup-uv@v3 and similar actions, which surfaces as Error: Cannot find module '.../dist/setup/index.js'. Bundling the tools in the image and dropping those uses: steps from CI workflows eliminates the flakiness.

Quick start

# On a fresh Ubuntu 22.04/24.04 server with docker + docker compose + git:
git clone https://git.slaid098.dev/slaid098/forgejo-infra.git
cd forgejo-infra
cp .env.example .env  # then edit .env with real tokens
./setup.sh

After Forgejo is up, register the runner (token from docker exec forgejo forgejo actions generate-runner-token):

cd /root/dockers/forgejo
docker compose run --rm runner act_runner register \
  --instance http://forgejo:3000 --token <TOKEN> --name linux-2 \
  --labels ubuntu-latest:docker://git.slaid098.dev/slaid098/runner:latest \
  --no-interactive