Short names: the public repositories of one Gitea organisation (IPCR_ROOT_ORG, then the admin page; metadec on our boxes) are also published at the root of the forge's name, so ipcr.localhost:4767/ipns/metadec.eth/ipcr-hello:1.0.0 works. Collisions (a user/org of that name, another owner's folder) are skipped and explained. Push credentials: the staging registry now sits behind forge-gate (ipcr-forge-bridge gate), in the CI daemon's network namespace, with the registry on a unix socket and no network. Each publishing repository logs in as <owner>/<repo> with an IPCR_PUSH_TOKEN Actions secret the bridge sets, and may push its own name only; IPCR logs in with a credential it generates. Workflows need a docker/login-action step (example and page updated). ipcr 1.4.0: allow.aliases with per-pass alias sync; unpublish/retag on every path; IMPORT_AUTH_GENERATE; names this node publishes resolve via name/resolve --nocache (Kubo's resolve cache lagged, and the generic resolve ignores nocache). bridge 0.3.0: gate, push credentials (rotate in the admin page), root organisation setting, setup creates the org and the example in it; the Radicle description carries the Gitea path (identical documents gave the same RID); OAuth2 app updated only when hosts change, keeping the new secret. Admin page: tabs, one-line keys, name-check feedback, per-tag docker pull commands (IPFS, IPNS, ENS, short path first). Verified on holyhorse (docs/forge.md).
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.