Zum Inhalt springen

Raw-Dateien ​

Ein Dateipfad in einem Repository funktioniert wie eine Datei auf einem Webserver. PUT speichert einen Body als nächste Version eines Pfads. GET gibt die aktuelle Version zurück. Verwenden Sie es aus Build-Skripten und CI-Jobs, die curl oder PowerShell und sonst nichts haben.

Die Adresse ist für alle drei Methoden dieselbe:

text
https://<host>/api/v1/repositories/<repository>/raw/<path>

Zum Beispiel: https://arkvory.example/api/v1/repositories/releases/raw/builds/game/1.4/GameSetup.exe.

Eine Datei speichern ​

Sie brauchen ein Repository und einen Schlüssel mit Schreibzugriff. Siehe Konten und Schlüssel. Senden Sie den Schlüssel als Authorization: Bearer <key>. Raw-Dateien akzeptieren keine andere Art der Authentifizierung.

bash
export ARKVORY_KEY="$(cat ~/.arkvory/key)"
URL="https://arkvory.example/api/v1/repositories/releases/raw/builds/game/1.4/GameSetup.exe"

curl --fail-with-body -sS -T ./GameSetup.exe \
  -H "Authorization: Bearer $ARKVORY_KEY" \
  "$URL"
powershell
$headers = @{ Authorization = "Bearer $env:ARKVORY_KEY" }
$url = 'https://arkvory.example/api/v1/repositories/releases/raw/builds/game/1.4/GameSetup.exe'
Invoke-RestMethod -Method Put -InFile .\GameSetup.exe -Headers $headers -Uri $url
bash
wget -qO- --method=PUT --body-file=GameSetup.exe \
  --header="Authorization: Bearer $ARKVORY_KEY" "$URL"

Geben Sie curl -T die vollständige Adresse der Datei, nicht die eines Ordners. Kodieren Sie Zeichen im Pfad, die eine URL nicht zulässt: Schreiben Sie ein Leerzeichen als %20, # als %23 und ? als %3F.

Die Antwort ist JSON. Eine neue Datei oder neue Bytes geben 201 zurück:

json
{
  "path": "builds/game/1.4/GameSetup.exe",
  "revision": 1,
  "created": true,
  "artifact": { "id": "00000000-0000-4000-8000-000000000001", "size": "1048576", "sha256": "…" }
}

Wenn der Pfad bereits genau diese Bytes enthält, ist die Antwort 200 mit "created": false und derselben Revision. Nichts wird gespeichert. Ein Schritt eines CI-Jobs kann erneut ausgeführt werden, ohne eine neue Version zu erzeugen. size ist eine Zeichenkette aus Dezimalziffern.

Eine Prüfsumme senden ​

Senden Sie den SHA-256 der Datei mit X-Checksum-Sha256 und die Länge mit Content-Length. curl -T und PowerShell senden die Länge für eine Datei. Dann schreibt der Server die Bytes in einem Durchgang direkt in den Speicher und prüft sie dort. Eine falsche Prüfsumme gibt 422 mit dem Code integrity_mismatch zurück, speichert nichts und lässt den Pfad unverändert.

bash
curl --fail-with-body -sS -T ./GameSetup.exe \
  -H "Authorization: Bearer $ARKVORY_KEY" \
  -H "X-Checksum-Sha256: $(sha256sum GameSetup.exe | cut -d' ' -f1)" \
  "$URL"
powershell
$headers['X-Checksum-Sha256'] = (Get-FileHash .\GameSetup.exe -Algorithm SHA256).Hash.ToLower()
Invoke-RestMethod -Method Put -InFile .\GameSetup.exe -Headers $headers -Uri $url

Ohne die Prüfsumme oder mit einem chunked Body ohne Content-Length schreibt der Server den Body zuerst in eine temporäre Datei und berechnet deren Hash. Dann speichert er sie. Dies benötigt kurzzeitig bis zu die doppelte Dateigröße auf der Festplatte des Servers und einen zweiten Durchgang über die Bytes. Der Server entfernt temporäre Dateien, die ein Fehler hinterlassen hat, nach einem Tag.

Wenn Sie die Prüfsumme und die Länge senden und der Pfad bereits diese Bytes enthält, antwortet der Server mit 200, ohne den Body zu lesen, und schließt die Verbindung.

Nur anlegen ​

Ein PUT liest nur eine Bedingung, If-None-Match: *. Damit speichert der Server die Datei nur, wenn der Pfad nicht existiert. Andernfalls antwortet er mit 409 und dem Grund already_exists, auch wenn die Bytes dieselben sind. Jeder andere Wert von If-None-Match bei einem PUT gibt 400 zurück.

bash
curl --fail-with-body -sS -T ./notes.txt \
  -H "Authorization: Bearer $ARKVORY_KEY" -H "If-None-Match: *" \
  "https://arkvory.example/api/v1/repositories/releases/raw/docs/notes.txt"

Zwei Schreiber ​

Wenn zwei Anfragen denselben Pfad gleichzeitig ändern, gewinnt die erste. Die spätere erhält 409 mit dem Grund revision_mismatch, und der Pfad behält den Inhalt des Gewinners. Führen Sie die Anfrage erneut aus, um eine neue Revision zu erzeugen. Die hochgeladenen Bytes des Verlierers bleiben als Artefakt ohne Pfad, bis die Aufbewahrung sie entfernt.

Eine Datei lesen ​

GET gibt die aktuelle Version des Pfads zurück. HEAD gibt nur die Header zurück.

bash
curl --fail-with-body -sS -H "Authorization: Bearer $ARKVORY_KEY" -o GameSetup.exe "$URL"
powershell
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Headers $headers -Uri $url -OutFile .\GameSetup.exe
bash
wget --header="Authorization: Bearer $ARKVORY_KEY" -O GameSetup.exe "$URL"

Die Antwort-Header:

HeaderWert
ETag"sha256:<digest>": der SHA-256 des Inhalts, in Anführungszeichen
Content-LengthDie Größe der Datei
Accept-Rangesbytes
Content-TypeImmer application/octet-stream
Content-Dispositionattachment mit dem letzten Segment des Pfads als Dateinamen
X-Arkvory-Artifact-IdDie ID des Artefakts, das diese Version hält

Ein unbekannter Pfad gibt 404 zurück.

Ranges und bedingte Anfragen ​

Anfrage-HeaderWirkung
Range: bytes=0-1023206 mit dem angeforderten Teil und Content-Range. Ein Start hinter dem Dateiende gibt 416 mit Content-Range: bytes */<size> zurück.
Range: bytes=-1024Die letzten 1024 Bytes
Range: bytes=1048576-Vom Offset bis zum Ende
If-Range: "sha256:…"Wendet den Range nur an, wenn der ETag genau dieser ist. Wenn der Pfad eine neue Version hat, erhalten Sie die ganze neue Datei.
If-None-Match: "sha256:…"304 ohne Body, wenn der ETag derselbe ist. Es funktioniert auch mit HEAD.

Nur ein Bereich pro Anfrage wird unterstützt. Eine Anfrage mit mehreren Bereichen gibt die ganze Datei zurück.

Ein Pfad kann jederzeit eine neue Version erhalten, und ein GET löst den Pfad erneut auf. Um einen Download sicher fortzusetzen, merken Sie sich den ETag der ersten Antwort und senden Sie ihn als If-Range:

bash
etag=$(curl -sSI -H "Authorization: Bearer $ARKVORY_KEY" "$URL" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')
curl -sS -H "Authorization: Bearer $ARKVORY_KEY" -H "If-Range: $etag" \
  -H "Range: bytes=1048576-" "$URL" >> GameSetup.part

Um einen Download zu überspringen, wenn sich die Datei nicht geändert hat, senden Sie den ETag, den Sie zuletzt gespeichert haben:

bash
curl -sS -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $ARKVORY_KEY" \
  -H 'If-None-Match: "sha256:<digest>"' "$URL"

Bei großen Dateien lädt arkvoryctl get mit Fortsetzen herunter und prüft den SHA-256 für Sie.

Pfade und Versionen ​

Eine Raw-Datei ist eine Datei nach Pfad. Jeder PUT mit neuen Bytes fügt dem Pfad eine Revision hinzu: Revision 1, 2, 3 und so weiter. Frühere Revisionen bleiben. Bytes werden nie ersetzt, weil jede Revision auf ihr eigenes unveränderliches Artefakt zeigt, benannt nach dem letzten Segment des Pfads.

  • GET auf der Raw-Adresse gibt immer die aktuelle Revision zurück.
  • Um alle Revisionen eines Pfads zu sehen, lesen Sie seinen Verlauf: getAssetHistory oder Dateiverlauf in der Konsole.
  • Um eine ältere Revision zu lesen, gibt getAssetRevision ihr Artefakt zurück. Laden Sie es mit der Inhaltsadresse des Artefakts herunter.
  • Um zu einer alten Revision zurückzukehren, verwenden Sie restoreAsset. Es fügt eine neue Revision hinzu, die auf die alten Bytes zeigt.
  • Um die Pfade eines Repositorys nach Präfix aufzulisten, verwenden Sie listAssetPage.
  • Ein Pfad kann nicht gelöscht werden. Der Verlauf bleibt. Die Aufbewahrung entfernt keine Artefakte, die eine Pfadrevision verwendet.

Dieselben Vorgänge gibt es im SDK (client.raw.putRawFile, downloadRawFile) und in arkvoryctl (put, get).

Pfadregeln ​

RegelWert
Länge1 bis 1024 Zeichen
OrdnerSegmente getrennt durch /
Nicht erlaubtEin leeres Segment (a//b), . oder .., ein Backslash, ein Doppelpunkt und Steuerzeichen

curl und Browser entfernen . und .. aus einer URL, bevor sie sie senden, daher kommt ein solcher Pfad nie an. Ein Pfad, der die Regeln verletzt, gibt 400 zurück.

Berechtigungen ​

Persönliche Token und Dateischlüssel erhalten Lese- oder Schreibzugriff auf das Repository. Dienstschlüssel erhalten exakte Aktionen.

VorgangAktionen des DienstschlüsselsPersönliches Token oder Dateischlüssel
GET, HEADcontent.readLesezugriff
PUTupload.create, upload.write, upload.complete, asset.read, asset.write, artifact.readSchreibzugriff, Token-Scope read-write

Ein Deployment-Agent, der nur herunterlädt, benötigt die Aktion content.read.

Ein Lese-Gateway akzeptiert nur GET und HEAD. Ein Spiegel bedient Lesezugriffe und lehnt PUT mit 409 und dem Grund mirror_read_only ab.

Limits ​

LimitWert
DateigrößeDie maximale Objektgröße der Installation, ARKVORY_MAX_OBJECT_BYTES (standardmäßig etwa 10 TiB)
Eine PUT-AnfrageMuss innerhalb von 30 Minuten abgeschlossen sein und darf nicht länger als 30 Sekunden pausieren (ARKVORY_UPLOAD_DEADLINE_MS, ARKVORY_UPLOAD_IDLE_TIMEOUT_MS). Dies sind auch die höchsten erlaubten Werte.
Uploads gleichzeitigStandardmäßig 2 pro Server und 1 pro Schlüssel (ARKVORY_MAX_UPLOADS, ARKVORY_MAX_UPLOADS_PER_PRINCIPAL). Eine wartende Anfrage gibt nach 20 Sekunden mit 503 auf.
Downloads gleichzeitigStandardmäßig 16 pro Server und 4 pro Schlüssel
KontingentDie Datei zählt gegen das Repository-Kontingent und die Kapazität der Installation

Ein einzelnes PUT hat kein Fortsetzen: Nach einem Fehler beginnt es wieder beim ersten Byte. Verwenden Sie Raw-Dateien für kleine und mittlere Dateien und für Skripte. Verwenden Sie für große Dateien oder langsame Netzwerke arkvoryctl put oder das SDK. Sie laden in Teilen hoch, setzen nach einem Fehler fort und prüfen den SHA-256. Sie speichern die Datei außerdem als Revision eines Pfads. Die Variablen sind in Umgebungsvariablen beschrieben.

Unity Addressables ​

Addressables laden den Katalog und die Bundles mit einfachen GET-Anfragen, daher kann ein Build-Ordner unter einem Raw-Pfad liegen. Das passt für interne Builds, QA und Werkzeuge. Es passt nicht für Spieler im öffentlichen Internet: Ein Raw-Lesezugriff braucht immer einen Schlüssel, ein Download-Link läuft innerhalb von 24 Stunden ab, und ein Schlüssel in einem ausgelieferten Client ist kein Geheimnis.

Laden Sie den Ordner mit arkvoryctl put hoch. Dateien mit unveränderten Bytes werden nicht erneut gesendet. Verwenden Sie einen Ordner pro Build, denn ein Pfad liefert immer seine neueste Revision, und ein alter Katalog darf nicht auf neue Bundles treffen:

bash
cd ServerData/StandaloneWindows64
find . -type f | while read -r file; do
  arkvoryctl put "$file" "addressables/game/$BUILD/StandaloneWindows64/${file#./}" || exit 1
done
powershell
$root = (Resolve-Path .\ServerData\StandaloneWindows64).Path
Get-ChildItem $root -Recurse -File | ForEach-Object {
  $relative = $_.FullName.Substring($root.Length + 1) -replace '\\', '/'
  arkvoryctl put $_.FullName "addressables/game/$env:BUILD/StandaloneWindows64/$relative"
  if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}

Setzen Sie den Remote-Ladepfad des Addressables-Profils auf die Raw-Adresse dieses Ordners, zum Beispiel https://arkvory.example/api/v1/repositories/releases/raw/addressables/game/<build>/[BuildTarget]. Geben Sie dem Client einen Schlüssel, der nur lesen kann: ein persönliches Zugriffstoken mit Lesezugriff oder einen Dienstschlüssel mit der Aktion content.read. Raw akzeptiert den Schlüssel nur im Header Authorization; setzen Sie ihn bei jeder Anfrage:

csharp
Addressables.WebRequestOverride = request =>
{
    if (request.url.StartsWith("https://arkvory.example/"))
        request.SetRequestHeader("Authorization", "Bearer " + readKey);
};

In Addressables 1.x heißt die Eigenschaft Addressables.WebRequestOverride; prüfen Sie den Namen in Ihrer Version. Das ist ein Muster, keine getestete Integration.

Fehlerbehebung ​

Fehler sind JSON-Dokumente mit code, reason, message und requestId. Siehe Fehler. Geben Sie die requestId Ihrem Administrator, um die Anfrage im Serverprotokoll zu finden.

StatusGrundUrsacheVorgehen
400validationDer Pfad, Content-Length, X-Checksum-Sha256 oder If-None-Match ist ungültigPrüfen Sie die Pfadregeln und kodieren Sie die URL
401credential_missing, credential_invalid, token_expiredKein Schlüssel, ein falscher Schlüssel oder ein abgelaufenes TokenSenden Sie Authorization: Bearer <key>. Basic-Authentifizierung funktioniert nicht für Raw-Dateien.
403permission_missing, read_only_tokenDer Schlüssel kann nicht schreiben, oder es ist ein schreibgeschütztes TokenVerwenden Sie einen Schlüssel mit den Aktionen aus Berechtigungen
404Der Pfad existiert nicht, oder der Schlüssel sieht das Repository nichtPrüfen Sie den Repository-Namen und den Pfad
409already_existsIf-None-Match: * und der Pfad existiertEntfernen Sie den Header, um eine Revision hinzuzufügen
409revision_mismatchEine andere Anfrage hat den Pfad zuerst geändertFühren Sie die Anfrage erneut aus
409mirror_read_onlyDas Repository ist ein SpiegelSchreiben Sie zum Hauptserver
416range_not_satisfiableDer Bereich beginnt nach dem Ende der DateiPrüfen Sie die Größe mit HEAD
422integrity_mismatchDer Body stimmt nicht mit X-Checksum-Sha256 oder Content-Length übereinBerechnen Sie die Prüfsumme erneut; prüfen Sie den Proxy
503busyZu viele Übertragungen gleichzeitigWarten Sie die Zeit in Retry-After ab und wiederholen Sie
507storage_quotaDas Repository-Kontingent oder die Kapazität der Installation ist erreichtGeben Sie Speicher frei oder bitten Sie um ein größeres Kontingent
Kein Statuscurl: (55) oder (56) beim SendenDer Server hat die Verbindung geschlossen. Wenn der Pfad die Bytes bereits enthält, antwortet er mit 200 und schließt.Führen Sie curl -i aus und lesen Sie die Antwort
Kein StatusDie Verbindung schließt nach 30 MinutenDie Upload-FristVerwenden Sie arkvoryctl put

Arkvory · ProAnimaStudio