• v0.12.0 ba02af120f

    v0.12.0 — a boot preflight that proves every dependency
    All checks were successful
    CI / gate (push) Successful in 36s
    CI / image (push) Successful in 15s
    Stable

    joeyr released this 2026-08-02 18:05:04 -05:00 | 221 commits to main since this release

    The boot log now proves each dependency instead of asserting it. Five checks,
    one request each, concurrent, reported as a block:

    preflight/db      | ok  server=PostgreSQL 17.10
    preflight/riot    | ok  platform=na1 band=GOLD I entries=205
    preflight/patch   | ok  patch=16.15
    preflight/forgejo | ok  target=joeyr/lol-companion-data@main push=true
    preflight/opgg    | ok  query=na/gold_plus/ranked bytes=749242
    preflight/summary | every dependency answered checks=5
    

    Why at boot

    This service is asleep 21 hours a day and does everything that matters in one
    unattended burst, so every dependency it has was discovered broken at the worst
    possible moment. A rejected Forgejo token surfaced at the commit, after a full
    night of crawling had already been paid for in API requests. A bad
    RIOT_API_KEY surfaced at 02:00 with nobody watching. An op.gg block surfaced
    as a coverage abort two hours in. In each case the container had been running
    for hours reporting nothing wrong, because it had not yet tried anything.

    The Forgejo check

    The one that pays for the rest. It verifies three things with three different
    fixes, and a naive "does the token work" probe passes two of them:

    • a read-only token authenticates perfectly and then fails at the commit, so
      permissions.push is checked directly rather than inferred from a 200;
    • a token scoped to the wrong repo 404s in a way that reads like a deleted
      repo;
    • a missing dataBranch is a typo in one env var, so the branch endpoint is
      checked by name — the failure line quotes the branch it looked for.

    Data Dragon, listed for the first time

    It is the only dependency with no credential to get wrong, which is why it went
    unlisted. But every artifact is stamped with the patch resolved from it and the
    crawl filters matches on it, so an outage does not degrade a window, it ends
    one. The resolved patch earns its line anyway: it answers "which patch is
    tonight's data for?" hours before anything else would say.

    op.gg reports bytes, not a status

    Its failure mode is a 200. The challenge page is served with an OK status and no
    data — that is why page.ts sends a desktop User-Agent at all. Four figures
    where six are expected is that page, and it is visible at a glance.

    Nothing here is fatal

    A dead Forgejo token must not cost a night of Riot data that a fixed token could
    publish tomorrow; the two halves already fail independently by design. And a
    boot that exited would have Swarm restart it on a loop, churning away the very
    lines that say what is wrong. The checks report, the operator decides.

    They are probes rather than crawls: no retries, and a 10s cap each. A dependency
    that is merely slow at boot is not worth delaying the boot over, and the answer
    a retry would eventually get is the answer the window will get for itself.

    Also

    Store.ping(), reporting the server version. migrate() already proved
    connectivity, but only as a side effect of the DDL — it says the database was
    reachable, not which database. A pool aimed at the wrong Postgres migrates
    exactly as cleanly as one aimed at the right one, and an empty schema is the
    expected state of both.


    Minor rather than patch for the added boot output and the new Store.ping().
    No artifact, schema, or published file changes.

    Downloads