5 Commits
Author SHA1 Message Date
Worph 36c065f7d1 take meta-feeder-sdk from gitea (github repo is gone; v1.3.3 never built)
Publish image / publish (push) Successful in 9m24s
2026-10-19 19:19:27 +00:00
Worph 7360f3755f resolve: 64 MiB redeem ceiling (a comic chapter redeems as one CBZ)
Publish image / publish (push) Failing after 1m33s
2026-10-19 18:45:16 +00:00
Worph 12e3ab44f3 gitea workflow: build on main too (tags main + short sha; latest stays the newest release)
Publish image / publish (push) Successful in 3m48s
2026-10-13 11:03:40 +00:00
Worph 9c6f40c397 gitea workflow: push to IPCR's direct host (Cloudflare 100 MB cap) [skip ci] 2026-10-13 10:03:00 +00:00
Worph 6b155f3148 gitea workflow: publish to IPCR (metadec.eth) instead of ghcr 2026-10-12 18:31:17 +00:00
4 changed files with 96 additions and 6 deletions
+86
View File
@@ -0,0 +1,86 @@
# Gitea twin of .github/workflows/publish.yml. Gitea runs only .gitea/workflows/ once this
# folder exists, and GitHub never reads it.
#
# Publishes to IPCR on watch.nsl.sh instead of ghcr.io:
# push ipcr-push-85-17-246-67.nip.io/metadec.eth/<repo>:<tag> docker login as metadec.eth with the
# IPCR_PUSH_TOKEN secret (the metadec.eth namespace token from the IPCR dashboard)
# pull ipcr-watch.nsl.sh/ipns/metadec.eth/metadec.eth/<repo>:<tag> anonymous
# The push goes to ipcr-push-85-17-246-67.nip.io, the box's own address, not ipcr-push-watch.nsl.sh: Cloudflare fronts
# *.watch.nsl.sh and refuses any request over 100 MB (413), which a large image layer is.
# That host's certificate is signed by the box's private Mesh Router CA, given to buildkit from
# the IPCR_CA_PEM repo variable. docker login would make the job's Docker daemon check the
# certificate without that CA, so the login is written straight into ~/.docker/config.json.
# The runner's job image (node:22-bookworm) has no docker CLI, so the static one is
# installed first; buildx installs itself. No `type=gha` cache: the runner has none.
name: Publish image
# Build and push the Docker image to the IPCR
# on main (tags main + short sha) and on v* tags (version; latest).
on:
push:
branches:
- main
tags:
- 'v*'
env:
REGISTRY: ipcr-push-85-17-246-67.nip.io
IMAGE_NAME: metadec.eth/${{ github.event.repository.name }}
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Docker CLI
run: curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-28.5.1.tgz | tar -xz -C /usr/local/bin --strip-components=1 docker/docker
- name: Trust the Mesh Router CA
run: printf '%s\n' "$IPCR_CA_PEM" > /tmp/ipcr-ca.pem
env:
IPCR_CA_PEM: ${{ vars.IPCR_CA_PEM }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: latest
buildkitd-config-inline: |
[registry."${{ env.REGISTRY }}"]
ca = ["/tmp/ipcr-ca.pem"]
- name: Log in to IPCR
env:
IPCR_PUSH_TOKEN: ${{ secrets.IPCR_PUSH_TOKEN }}
run: |
mkdir -p ~/.docker
printf '{"auths":{"%s":{"auth":"%s"}}}\n' "$REGISTRY" "$(printf 'metadec.eth:%s' "$IPCR_PUSH_TOKEN" | base64 -w0)" > ~/.docker/config.json
- name: Extract image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# v1.2.3 -> 1.2.3, 1.2, 1 ; plus a moving `latest` for the newest tag.
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=ref,event=branch
type=sha,format=short
# latest = newest release, not main
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Generated
+1 -1
View File
@@ -1965,7 +1965,7 @@ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]] [[package]]
name = "meta-feeder-sdk" name = "meta-feeder-sdk"
version = "1.8.0" version = "1.8.0"
source = "git+https://github.com/worph/meta-feeder-sdk?tag=v1.8.0#612f2aed661925cd22d51b29564832991e246e4d" source = "git+https://gitea-watch.nsl.sh/metastar/meta-feeder-sdk?tag=v1.8.0#612f2aed661925cd22d51b29564832991e246e4d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
+2 -2
View File
@@ -19,7 +19,7 @@ path = "src/main.rs"
# The transport-plugin contract. Pinned by TAG, never by path — a path dep # The transport-plugin contract. Pinned by TAG, never by path — a path dep
# resolves outside this repo, which is the Docker build context. See the # resolves outside this repo, which is the Docker build context. See the
# Dockerfile for building against an unreleased SDK. # Dockerfile for building against an unreleased SDK.
meta-feeder-sdk = { git = "https://github.com/worph/meta-feeder-sdk", tag = "v1.8.0", features = ["transport"] } meta-feeder-sdk = { git = "https://gitea-watch.nsl.sh/metastar/meta-feeder-sdk", tag = "v1.8.0", features = ["transport"] }
# libp2p — transport only: identify (address exchange, load-bearing for bitswap # libp2p — transport only: identify (address exchange, load-bearing for bitswap
# reachability), kad (DHT provider records), mdns (LAN discovery) + bitswap. # reachability), kad (DHT provider records), mdns (LAN discovery) + bitswap.
@@ -56,7 +56,7 @@ multihash-codetable = { version = "0.1", features = ["sha2", "sha3"] }
[dev-dependencies] [dev-dependencies]
tempfile = "3" tempfile = "3"
meta-feeder-sdk = { git = "https://github.com/worph/meta-feeder-sdk", tag = "v1.8.0", features = ["testkit"] } meta-feeder-sdk = { git = "https://gitea-watch.nsl.sh/metastar/meta-feeder-sdk", tag = "v1.8.0", features = ["testkit"] }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Workaround for the yanked transitive `core2` (all versions). `multihash- # Workaround for the yanked transitive `core2` (all versions). `multihash-
+7 -3
View File
@@ -45,9 +45,13 @@ pub const CONTENT_CID_HEADER: &str = "x-metamesh-content-cid";
/// a store-back before it answers. /// a store-back before it answers.
const REDEEM_TIMEOUT: Duration = Duration::from_secs(60); const REDEEM_TIMEOUT: Duration = Duration::from_secs(60);
/// Ceiling on a redeemed body. A 100k-segment `.nzb` is ~16 MiB; a subtitle is /// Ceiling on a redeemed body — the gateway's own `MAX_REDEEMED_BYTES`. A
/// kilobytes. Bounds a broken or hostile gateway. /// 100k-segment `.nzb` is ~16 MiB and a subtitle kilobytes, but a comic chapter
pub const MAX_REDEEM_BYTES: usize = 32 * 1024 * 1024; /// redeems as one CBZ (`tachiyomi`, meta-feeder-suwayomi): ~24 MB measured for a
/// 24-page chapter, more for a long webtoon one. Bounds a broken or hostile
/// gateway. ⚠ The hull's resolve client caps the same body
/// (`meta-share/src/plugins.rs`, `resolve`); raise both together.
pub const MAX_REDEEM_BYTES: usize = 64 * 1024 * 1024;
#[derive(Debug)] #[derive(Debug)]
pub enum RedeemError { pub enum RedeemError {