In einem Katalog veröffentlichen
Ein Katalog ist ein Git-Repository, das Apps für den Store auflistet. Pithyx hat zwei Projektkataloge, pithyx/apps-official und pithyx/apps-community, und jeder kann einen eigenen betreiben, erstellt aus dem Vorlagen-Repository pithyx/catalog-template. Eine Box klont die Kataloge, die sie nutzt, prüft sie und baut nie etwas.
Kataloge
Abschnitt betitelt „Kataloge“- Offiziell (
pithyx/apps-official) ist neben dem System-Image die einzige Quelle fürorg.pithyx.*-Apps. Community (pithyx/apps-community) ist standardmäßig ebenfalls an; ein Administrator kann ihn ausschalten. Ein Administrator kann Eigene Kataloge hinzufügen. - Quelle. Jede App liegt in
apps/<id>/auf dem Branchmaster. Die CI baut das Frontend und die Images, schiebt die Images nachghcr.io/<owner>/apps/<id>/<service>:<version>(nie überschrieben, per Digest verknüpft) und schreibt zwei Branches, die nur die CI beschreibt:catalog-next(der Beta-Kanal) undcatalog(der Stable-Kanal). Der Stable-Branch wird erst nach einer manuellen Freigabe aktualisiert. - Dateien.
catalog.jsonim Wurzelverzeichnis benennt den Katalog. Jeder Branch enthältindex.jsonund, bei Projektkatalogen,index.json.sig. Der Index listet pro Version Hashes und Größen von Paket, Manifest, Icon und Screenshots, die Images, die Architekturen, den Bereichpithyx, diedataVersion, die Lizenz und den Quell-Commit auf. Die Dateien liegen inapps/<id>/<version>/:<id>-<version>.pithyxapp,pithyx.json,icon.svgundscreenshots/. - Sequenz. Jede Veröffentlichung erhöht die
sequencedes Index um eins. Die Box lehnt eine niedrigere Nummer ab (store.catalog.sequence_old). - Signatur. Ed25519 über die exakten Bytes von
index.json. Eine Box akzeptiert einen Projektkatalog, wenn mindestens eine Signatur von einem Schlüssel stammt, dem sie für den Kanal vertraut, und jede Signatur eines vertrauten Schlüssels stimmt. Unbekannte Schlüssel-IDs werden ignoriert, was eine Schlüsselrotation erlaubt. Eine fehlgeschlagene Prüfung iststore.catalog.signature_invalid. Eigene Kataloge sind nicht signiert, und der Store markiert ihre Apps als nicht geprüft. - Auf der Box. Kataloge sind flache Klone in
/var/lib/pithyx/catalogs/<id>/, abgeholt mit git über https oder ssh (3 Minuten Timeout, keine Hooks, keine Submodule). Ein fehlgeschlagener Abruf behält die letzte geprüfte Kopie. Jede Datei wird gegen den Hash im Index geprüft. - Kanäle und Updates. Die Store-Einstellungen haben einen Kanal (stable liest
catalog, beta liestcatalog-next), eine Update-Richtlinie (automatisch, benachrichtigen oder keine; Standard benachrichtigen), eine tägliche Prüfzeit (Standard 03:00 mit einer zufälligen Verzögerung von bis zu 60 Minuten) und eine Ausnahme pro App. Ein Update, das neue Berechtigungen, root oder erhöhte Rechte braucht, wird nie automatisch installiert.
Die Prüfung
Abschnitt betitelt „Die Prüfung“Jeder Pull Request an einen Projektkatalog wird vom Projekt geprüft: Die App-ID folgt der Regel mit der umgekehrten Domain, keine fremden Marken, kein org.pithyx.* im Community-Katalog, und die App muss es wert sein, aufgenommen zu werden. Wie lange eine Prüfung dauert und wie der genaue Ablauf für externe Mitwirkende aussieht, ist nicht dokumentiert.
Maschinelle Regeln laufen bei jedem Pull Request (pithyx catalog check, siehe unten):
- Jede App hat eine
maintainers.jsonmit 1 bis 20 GitHub-Logins. Ein Pull Request, der eine App ändert, muss von einem der Maintainer kommen, wie die Datei vor der Änderung aussah. Die Datei einer neuen App muss ihren Autor nennen. - Workflows:
check.yaml(Pull Requests, nur lesend),publish.yaml(Pushes aufmasterschreibencatalog-next) undpromote.yaml(manuell, schreibtcatalognach der Freigabe in der Umgebungcatalog-release). Läufe von externen Mitwirkenden warten auf eine Freigabe.
Aus sdk/schema/catalog.v1.rules.json:
- Ein App-Ordner pro Pull Request, unter
apps/. Höchstens 5 MiB pro App-Ordner und 1000 Zeichen pro Zeile. - Pflichtdateien:
pithyx.json,icon.svg,maintainers.jsonund eine vonLICENSE,LICENSE.md,LICENSE.txt. Das Manifest brauchtlicenseundpithyx. - Bis zu 8 Screenshots in
screenshots/, jeder höchstens 1 MiB, benannt nach[a-z0-9][a-z0-9_-]{0,62}mit.png,.jpgoder.webp. - Dateien sind UTF-8-Text oder aufgelistete Medien (gif, jpeg, png, webp, woff2), deren Inhalt zur Endung passt. Minifizierte Dateien (
.min.jsund ähnliche) und nicht aufgelistete Dateien werden abgelehnt. - Jedes
FROMundCOPY --fromin einem Dockerfile ist per@sha256festgelegt oderscratch. - Die Lizenz ist ein SPDX-Ausdruck aus OSI-anerkannten Lizenzen;
LicenseRef-wird abgelehnt. - Jedes Image im Index hat jede Architektur, die es aufführt (
store.catalog.architecture_missing), und diedataVersionsinkt nie. - Builds sind so reproduzierbar wie möglich: BuildKit ist in den Workflows per Digest festgelegt, und
SOURCE_DATE_EPOCHkommt vom letzten Commit.
Ein eigener Katalog
Abschnitt betitelt „Ein eigener Katalog“- Erstelle ein Repository aus
pithyx/catalog-template. Der Publish-Job lehnt die Platzhalter-ID der Vorlage ab. - Lege deine Apps in
apps/<id>/ab. Die CLI-Befehle laufen im Wurzelverzeichnis des Repositorys:pithyx catalog check,pending,index,signundverify(siehe @pithyx/cli). - Öffne im Store den Tab Eigene und füge das Repository per URL hinzu.
- Eine öffentliche URL
https://host/pathwird sofort abgerufen. - Ein privates Repository nutzt eine SSH-URL wie
git@host:owner/repo.git. Die Box erstellt einen SSH-Deploy-Key und zeigt dessen öffentlichen Teil; füge ihn dem Repository als schreibgeschützten Schlüssel hinzu und rufe dann ab. - Images in einer privaten Registry brauchen ein Lese-Token (
user:token). Der Store hat dafür kein Feld; setze es über die API mitPATCH /api/store/catalogs/{key}undregistryToken.
- Eine öffentliche URL
- URLs nutzen https ohne Zugangsdaten oder ssh-Formen (
user@host:path,ssh://user@host[:port]/path). Alles andere iststore.catalog.url_invalid.
Eigene Kataloge dürfen Images aus jeder Registry einbinden, per Digest, und folgen der globalen Update-Richtlinie. Signieren ist optional: Der Publish-Workflow signiert nur, wenn das Repository SIGNING_KEY definiert. Die Box prüft Signaturen nur bei den Projektkatalogen.
Pakete, die ein Workflow in die Container-Registry von GitHub schiebt, sind zunächst privat, auch aus einem öffentlichen Repository; mach jedes Paket in der Weboberfläche der Registry öffentlich, sonst können Boxen die Images nicht anonym ziehen.
Wird ein eigener Katalog entfernt, bleiben seine installierten Apps ohne Updates bestehen. Die Projektkataloge lassen sich ausschalten, aber nicht entfernen.