- setup: with RUNNER_DIR, fetch the runner registration token from Gitea's admin API (POST /admin/actions/runners/registration-token) instead of the gitea CLI on Gitea's volume; record secrets/setup-status (ok, unreachable, bad-credentials) and exit cleanly when Gitea cannot be used. - mirror: Radicle is optional. Repositories wait until a node is there (key and control socket in RAD_HOME), re-checked every reconcile; RADICLE=off. - page: /status.json; hide the Radicle parts without a node, banner when Gitea is unreachable or refuses the login. - example workflow: runs-on: ipcr, the forge's own runner label. - docs: two listings, split (IPCR-Forge) and all in one (IPCR-Forge-AIO).
ipcr-hello
The IPCR Forge example. A tag on this repository builds its image, IPCR publishes it on IPFS, and the repository is mirrored to Radicle.
Try it
-
Tag a release. In Gitea: Tags → New tag (or Releases → New release), name it
v1.0.0and targetmain. From a clone it works too:git tag v1.0.0 && git push origin v1.0.0 -
Watch the build under Actions. The first build on a new server takes a few minutes more, while it downloads its build images.
-
Find the image on the forge's page (
ipcr-forge-<your domain>, Published images), about a minute after the build finishes. Then on this server or on any other running IPCR:services: hello: image: ipcr.localhost:4767/ipns/<forge name>/gitea_admin/ipcr-hello:1.0.0 ports: ["8080:8080"]
What makes it work
.gitea/workflows/build.ymlpushes tolocalhost:5000, the forge's staging registry. IPCR imports every tag it finds there.Dockerfileis an ordinary Dockerfile. Anything that builds works.
Copy the workflow into any public or private repository on this forge to publish it the same way.