Gitea workflow: build ipcrd on IPCR Forge (runs-on: ipcr → staging → IPFS); listings → ipcr 1.6.1, ipcr-forge 0.6.3
ipcr / image (push) Successful in 4m55s

This commit is contained in:
Worph
2026-10-05 17:59:49 +00:00
parent 128d23b8e2
commit c26d45f7b9
4 changed files with 56 additions and 13 deletions
+43
View File
@@ -0,0 +1,43 @@
# IPCR Forge: builds ipcrd's image (the Dockerfile at the root) for every v* tag pushed to this repository's Gitea copy, and pushes it
# to the forge's staging registry; IPCR imports it from there within a minute and publishes it on
# IPFS under the forge's name (<forge>/ipcr/ipcr).
#
# GitHub ignores .gitea/ (it runs .github/workflows/image.yml → ghcr.io), and Gitea ignores
# .github/ as soon as this folder exists: one repository, one workflow on each side.
#
# runs-on: ipcr the forge's own runner, the only one that reaches the staging registry
# localhost:5000 that registry, logged in to as this repository (IPCR_PUSH_TOKEN, a
# secret the forge sets on every repository allowed to publish)
# network=host so buildx's builder can reach it too
name: ipcr
on:
push:
tags: ['v*']
jobs:
image:
runs-on: ipcr
steps:
- uses: actions/checkout@v4
- uses: docker/login-action@v3
with:
registry: localhost:5000
username: ${{ github.repository }}
password: ${{ secrets.IPCR_PUSH_TOKEN }}
- uses: docker/metadata-action@v5
id: meta
with:
images: localhost:5000/${{ github.repository }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest
- uses: docker/setup-buildx-action@v3
with:
driver-opts: network=host
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: VERSION=${{ steps.meta.outputs.version }}
+6 -6
View File
@@ -35,7 +35,7 @@ services:
# with the stock `rad` CLI against the node's own home. Serves the forge's page on :8080.
# Its install step (forge-setup, below) mints its Gitea token and registers the webhook.
ipcr-forge:
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
container_name: ipcr-forge
user: $PUID:$PGID
read_only: true
@@ -285,7 +285,7 @@ services:
# push that name only; IPCR logs in as the importer (state/staging-auth, which it generates).
# Same image as the forge service (`ipcr-forge gate`, forge/gate.go in ipcr-forge). See rationale.md.
forge-gate:
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
container_name: forge-gate
user: $PUID:$PGID
read_only: true
@@ -479,7 +479,7 @@ services:
# ipcrd: TLS front door on 127.0.0.1:4767. Passes /ipfs/<cid> through to the stock nerdctl
# registry below, resolves /ipns/<name>:<tag> itself, and pins every image it serves.
ipcr-gateway:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-gateway
# Root for one reason: it writes its CA into the host's Docker trust store (the narrow
# bind below), which is root-owned. See rationale.md.
@@ -567,7 +567,7 @@ services:
# then works on any machine, without IPCR. A pull here pins nothing. The admin pages switch it
# off (config.json "public": false). Not on the admin or CI networks. See rationale.md.
ipcr-public:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-public
user: $PUID:$PGID
read_only: true
@@ -615,7 +615,7 @@ services:
# ── Stock nerdctl IPFS registry ─────────────────────────────────────────────
# `nerdctl ipfs registry serve`, unmodified: translates the registry API into IPFS reads.
ipcr-registry:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-registry
# Root because nerdctl run as any other uid assumes rootless mode and refuses to start
# without a rootless containerd — which `ipfs registry serve` never uses. The service has
@@ -980,7 +980,7 @@ x-compose-app:
# the example repository (in that organisation). Idempotent, so on every start: it repairs the webhook.
# The admin password is used here only, never stored.
- name: forge-setup
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
user: $PUID:$PGID
phase: post_up
network: $APP_NET
+6 -6
View File
@@ -39,7 +39,7 @@ services:
# with the stock `rad` CLI against the node's own home. Serves the forge's page on :8080.
# Its install step (forge-setup, below) mints its Gitea token and registers the webhook.
ipcr-forge:
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
container_name: ipcr-forge
user: $PUID:$PGID
read_only: true
@@ -210,7 +210,7 @@ services:
# push that name only; IPCR logs in as the importer (state/staging-auth, which it generates).
# Same image as the forge service (`ipcr-forge gate`, forge/gate.go in ipcr-forge). See rationale.md.
forge-gate:
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
container_name: forge-gate
user: $PUID:$PGID
read_only: true
@@ -277,7 +277,7 @@ services:
# ipcrd: TLS front door on 127.0.0.1:4767. Passes /ipfs/<cid> through to the stock nerdctl
# registry below, resolves /ipns/<name>:<tag> itself, and pins every image it serves.
ipcr-gateway:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-gateway
# Root for one reason: it writes its CA into the host's Docker trust store (the narrow
# bind below), which is root-owned. See rationale.md.
@@ -365,7 +365,7 @@ services:
# then works on any machine, without IPCR. A pull here pins nothing. The admin pages switch it
# off (config.json "public": false). Not on the admin or CI networks. See rationale.md.
ipcr-public:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-public
user: $PUID:$PGID
read_only: true
@@ -413,7 +413,7 @@ services:
# ── Stock nerdctl IPFS registry ─────────────────────────────────────────────
# `nerdctl ipfs registry serve`, unmodified: translates the registry API into IPFS reads.
ipcr-registry:
image: ghcr.io/yundera/ipcr:1.6.0
image: ghcr.io/yundera/ipcr:1.6.1
container_name: ipcr-registry
# Root because nerdctl run as any other uid assumes rootless mode and refuses to start
# without a rootless containerd — which `ipfs registry serve` never uses. The service has
@@ -747,7 +747,7 @@ x-compose-app:
# never stored. Waits up to 240s for the Gitea app, then records why it could not go on
# (forge/secrets/setup-status, shown on the forge's page) and lets the start finish.
- name: forge-setup
image: ghcr.io/yundera/ipcr-forge:0.6.2
image: ghcr.io/yundera/ipcr-forge:0.6.3
user: $PUID:$PGID
phase: post_up
network: $APP_NET