Přeskočit obsah

Public bucket — avax-public

Dedikovaná veřejná S3 bucket pro public-read statická data sdílená odkazem (knihy, HTML/PDF exporty, assety pro veřejné stránky). Zřízeno 2026-06-09.

Platformová konvence (rozhodnuto 2026-06-09): veškerá veřejná statická data VŠECH aplikací (platform i vendor) patří sem. Není to jednorázovka — je to default způsob publikace public dat napříč AVAX. Citlivá data sem NIKDY (bucketa je anonymně čitelná).

Proč vznikla

claudeai mixovala veřejné objekty (launcher/) se citlivými daty (s3klic/ = klíčový materiál pro chat). Každé přidání veřejného objektu = chirurgický zásah do policy na bucketě, kde leží klíče → asymetrické blast-radius riziko. avax-public to odděluje: policy chyba nemůže exponovat nic citlivého, protože tam nic citlivého není.

Princip

  • bucket avax-public, endpoint https://s3.avaxis.cz (path-style), fronted OpenResty (transparentní passthrough — nová bucketa funguje bez extra konfigurace proxy; ověřeno).
  • policy: jediný statement PublicReadGetObjects3:GetObject na arn:aws:s3:::avax-public/* pro Principal: *. Žádný s3:ListBucket → objekty veřejné podle URL, ale adresář NELZE procházet/enumerovat (?list-type=2 → 403).
  • URL pattern: https://s3.avaxis.cz/avax-public/<klíč>.
  • jména souborů normální (bez obfuskace) — bucket je transparentně veřejný, takže menalbook.html, ne náhodný hex.

Co sem PATŘÍ

Cokoli world-readable: tiskové knihy, sdílené HTML/PDF exporty, obrázky/assety pro veřejné stránky.

Co sem NEPATŘÍ

Cokoli citlivého (klíče, zálohy, firemní data, chat). Celá bucketa je anonymně čitelná — citlivé zůstává v privátních bucketech (claudeai se s3klic/, per-company, per-app app-{slug}, avaxlegal) s presigned URL / auth.

Jak publikovat (boto3, APPDIST creds)

# creds: APPDIST_S3_* z backend/.env (vlastník avax-public; jediný klíč s CreateBucket)
import boto3
s3 = boto3.client("s3", endpoint_url=S3_ENDPOINT,
                  aws_access_key_id=APPDIST_S3_ACCESS_KEY,
                  aws_secret_access_key=APPDIST_S3_SECRET_KEY, region_name="us-east-1")
s3.put_object(Bucket="avax-public", Key="menalbook.html",
              Body=open("menalbook.html","rb").read(),
              ContentType="text/html; charset=utf-8")
# -> https://s3.avaxis.cz/avax-public/menalbook.html
Policy je plošná na /*, takže publikace = JEN put_object (žádná změna policy). Update = přepiš stejný klíč (ETag se změní, žádná agresivní cache → servíruje se čerstvé).

Apps bez creds → endpoint POST /storage/public

Aplikace (desktop/vendor) nedrží APPDIST creds. Publikují přes platform endpoint POST /storage/public (auth: app JWT) — platform zapíše do avax-public/{slug}/... a vrátí URL. Izolace prefixem {slug}/, sanitizace klíče (žádný traversal), allowlist content-type, max 25 MB. SDK wrapper: AvaxAPIClient.publish_public(app_slug, key, data, content_type) (skeleton docs/PUBLIC_DATA.md). Service: app/services/public_assets.py.

Listing

Vypnutý (žádný ListBucket). Browsable index → přidej s3:ListBucket statement, ale rozmysli (zveřejní seznam všech souborů).

Launcher výjimka

claudeai/launcher/* (latest.json + .exe, statement BridgeLauncherDistribution) zůstává v claudeai — jeho URL je zadrátovaná v už nainstalovaných launcherech, přesun by utnul auto-update nasazených klientů. Grandfathered; nové veřejné věci jdou do avax-public. (Budoucí migrace launcheru = dual-publish do obou + přesměrovat nové release, dokud staří klienti nedoženou.)