I spent the last week or two configuring a CI/CD runner for #TeahouseHosting on #Codeberg, here's how I did it.

https://qwertyuiop.ninja/2026/03/16/codeberg-runner.html

I wasn't really finding in-depth documentation and blog posts, and in particular none of the published examples would build container images--the biggest limitation of Codeberg's offering.

So I fixed it.

#Forgejo

Run a Runner on Codeberg

So you wanna make the jump to Codeberg, but aren’t happy with their CI? Here’s how to run your own!

qwertyuiop.ninja

It even includes a few cursed ops suggestions:

* Triple Docker: One standard one for the runner daemon, one for the runner to run jobs in, and one for jobs to use
* Docker state on tmpfs on zram

I do kinda want to do the triple docker, or even per-job docker, but getting that dialed is going to be annoying.
@astraluma
> Docker state on tmpfs on zram
@ratsprite I have gotten very flexible with containers
@astraluma you really have, I keep bouncing off them every six months or so, but with 32GB sitting in my home server this is tempting (I'm nowhere near needing to set up my own CI, but...)

@ratsprite it's unfortunately half required if you're doing serious development on codeberg.

Thankfully, it turns out the system requirements for doing so are real small

@astraluma oh this is neat, thank you! I've managed get my own runner happening (https://codeberg.org/patallan/forgejo-action-runners), but I couldn’t get the docker-in-docker stuff working. Perhaps it's time for me to revisit that, leveraging your wisdom!
forgejo-action-runners

Terraform configuration to manage openstack-hosted Forgejo runners

Codeberg.org

@pat if you're installing the runner at a system level, you probably don't need dind--regular docker would be fine.

I'm using dind because I don't have an active configuration management practice and it was easier to use the runner container.

@astraluma Neat, I can use this 👍

Do you know if there's documentation on the runner tagging convention? That's the one part I found surprising, and I didn't notice a link in the post.

@diazona the forgejo actions administrators guide has a section "choosing labels", which is how to build out the complete tag

As for actually picking the human-visible labels (eg, "docker-build" or "codeberg-small"), the only suggestion is "idk, maybe by feature?" which isn't really helpful. But there isn't really a complete feature query option (you can't say "I need a GPU _and_ Docker").

So, I guess make some runner categories that fit you. The only one I care about is "has docker".

@diazona but it's super cool to hear that someone else is getting practical value from this
@diazona the actions docs are somewhat confusing, the label `docker` isn't special afaik, you have to define it yourself with `docker:docker://...`
@astraluma ahh okay I see - it sounds like what they describe in "choosing labels" is about more than what I would understand as the runner's label (by which I mean the thing you put in runs-on), it also involves conveying some metadata to the runner. Bit of an odd choice IMO but I can work with it. Appreciate the explanation 🙂