Gitea + Gitea Actions runner
Deploys Gitea with Actions enabled plus one act_runner that picks up jobs.
Start
-
Copy
config.yamlto the runner data dir on the Docker host:mkdir -p /portainer/Files/AppData/Config/Gitea-runner cp config.yaml /portainer/Files/AppData/Config/Gitea-runner/config.yaml -
In Gitea, go to Site Administration -> Actions -> Runners -> Create new Runner and copy the registration token.
-
Start the stack with the token (first start registers the runner; the
.runnerfile persisted in/datakeeps it registered):GITEA_RUNNER_REGISTRATION_TOKEN=<token> docker compose up -dOptional overrides:
GITEA_INSTANCE_URL(defaulthttp://gitea:3000),GITEA_RUNNER_NAME,GITEA_RUNNER_LABELS. -
Confirm the runner shows as active under Site Administration -> Actions -> Runners.
Live workflows
These run on this repo itself (repo root .gitea/workflows/):
test.yml— external CI health check (uv, dbt, R2, prod probe)hello-world.yaml— checkout + node smoke test onubuntu-latestscheduled-echo.yaml— cron + manual trigger example
Sample workflow
sample-workflows/docker-build.yaml is a Buildx build template (with
commented-out push steps) you can copy into any repo hosted on this Gitea
instance as .gitea/workflows/*.yaml or .github/workflows/*.yaml.
It stays out of the root because this repo has no Dockerfile.
Notes
GITEA__actions__ENABLED=trueis already set on thegiteaservice; without it the Actions tab stays disabled.- The runner needs
/var/run/docker.socksodocker://labels can start job containers. Jobs therefore run with the trust level of anything that can use the host Docker daemon — only connect this runner to repos you trust, or scope tokens via per-repo runner groups. - Image
gitea/act_runner:latesttracks the stable runner; the same image is also published asgitea/runner:latest.