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, endpointhttps://s3.avaxis.cz(path-style), fronted OpenResty (transparentní passthrough — nová bucketa funguje bez extra konfigurace proxy; ověřeno). - policy: jediný statement
PublicReadGetObject→s3:GetObjectnaarn:aws:s3:::avax-public/*proPrincipal: *. Žá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
/*, 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.)