- Introductie van static-files serving met standaard nginx (niet ons docker nginx image), en een rsync service om static files te synchroniseren. Nog niet volledig afgewerkt!
7.1 KiB
Evie Object Storage Governance (Optie 3)
Doel: 1 bucket per omgeving (staging / prod), met prefixen per tenant. Duidelijke scheiding van datatypes (documents vs assets), lage beheerlast, goed schaalbaar.
1) Structuur & naamgeving
Buckets (per omgeving)
- staging:
evie-staging - prod:
evie-prod
Buckets zijn S3-compatibel op Scaleway (
https://s3.<regio>.scw.cloud). Houd buckets "plat" (alle tenants als prefix).
Prefix layout (per tenant)
<bucket>/
tenant-<tenantId>/
documents/
<subfolders naar keuze>...
assets/
<subfolders naar keuze>...
Conventies - Tenant prefix: tenant-<tenantId> (tenantId =
interne stabiele sleutel; geen PII). - Datatypes: documents/ en
assets/ (harde scheiding). - Bestandsnamen: snake-case of
kebab-case; voeg optioneel datum/uuid toe bij uploads die kunnen
conflicteren.
2) Toegang & secrets
IAM-model
- Één IAM Application per omgeving
evie-staging-app→ keys in staging k8s Secret\evie-prod-app→ keys in prod k8s Secret\
- Toegang alleen tot het eigen bucket (
evie-stagingofevie-prod).
App-side secrets (env)
S3_ENDPOINT=https://s3.<regio>.scw.cloudS3_BUCKET=evie-<env>S3_ACCESS_KEY=***S3_SECRET_KEY=***S3_REGION=<regio>(bv.fr-par)- (optioneel)
S3_FORCE_PATH_STYLE=false
Presigned uploads: genereer server-side presigned URL's per tenant/prefix; geef nooit de master-keys aan de client.
3) Policies (conceptueel)
- Bucket policy: sta alleen requests toe met geldige credentials van de Evie-app van die omgeving.
- Prefix scope (in app-logica): alle reads/writes moeten met
pad beginnen op
tenant-<tenantId>/.... - Optioneel (later): extra policy-groepen voor specifieke workflows (vb. tijdelijke ingest job).
Belangrijk: autorisatie op tenantniveau afdwingen in je applicatie (context =
tenantId). Nooit paden samenstellen vanuit user input zonder whitelisting/validation.
4) Lifecycle & retentie
Doel: kosten beheersen, assets sneller "kouder", documenten langer bewaren.
Scope (Filter) Regel
tenant-*/assets/ → One Zone-IA na 30 dagen
tenant-*/assets/ → Glacier/Archive na 180 dagen
(optioneel)
tenant-*/documents/ → Standard (geen transition) of IA
na 180d
tenant-*/documents/ (tijdelijke Expire (delete) na 7--14 dagen
previews)
Lifecycle definieer je per bucket met prefix filters, zodat regels verschillend zijn voor
assets/endocuments/.
5) CORS & distributie
- CORS: indien browser direct upload/download doet, whitelist de
domeinen van je app (origin), en methodes
GET, PUT, POST. Alleen benodigde headers toestaan. - Publieke distributie (indien nodig):
- Kleine public-reads via presigned URL's (aanbevolen).\
- Of activeer publieke read op een specifieke
public/-prefix (niet op de hele bucket).\ - Overweeg een CDN/edge-lag via Scaleway Edge Services voor veelgevraagde assets.
6) Observability & beheer
- Logging/metrics:
- App: log alle S3 calls met
tenantId+ object key.\ - Platform: gebruik Scaleway Cockpit voor capacity & request metrics.
- App: log alle S3 calls met
- Quota & limieten:
- 1 bucket per omgeving beperkt "bucket-sprawl".\
- Objecten en totale grootte zijn praktisch onbeperkt; plan wel lifecycle om groei te managen.
- Monitoring:
- Alerts op snelgroeiende assets-prefixen, high error rates (4xx/5xx), en mislukte lifecycle-transities.
7) Operationele workflows
Tenant aanmaken
- DB schema provisionen.
- (S3) Geen nieuwe bucket; enkel prefix:
tenant-<id>/documents/entenant-<id>/assets/zijn impliciet. - (Optioneel) Init bestanden/placeholder objecten.
- App-config linkt de tenant aan zijn prefix (centrale mapping).
Upload (app -> S3)
- App valideert
tenantIden datatype (documents|assets).\ - App construeert canonical path:
tenant-<id>/<datatype>/<...>\ - App genereert presigned PUT (tijdelijk) en geeft terug aan frontend.\
- Frontend uploadt rechtstreeks naar S3 met presigned URL.
Download / Serve
- Interne downloads: app signed GET of server-side stream.\
- Externe/public: presigned GET met korte TTL of via public-only prefix + CDN.
Opruimen & lifecycle
- Tijdelijke artefacten: app scheduled cleanup (of lifecycle "Expiration").\
- Archivering: lifecycle transitions per prefix.
8) Beveiliging
- Least privilege: IAM-keys enkel voor het bucket van de omgeving.\
- Encryptie: server-side encryption (default) volstaat vaak; overweeg KMS als apart key-beleid nodig is.\
- Auditing: log alle write-operaties met gebruikers- en tenantcontext.\
- Backups: documenten zijn de "bron"? Zo ja, S3 is primaire opslag en RAG-index kan herbouwd worden. Anders: definieer export/replica-strategie.
9) Migratie van MinIO → Scaleway
- Freeze window (kort): pauzeer uploads of werk met duale write (MinIO + S3) gedurende migratie.\
- Sync: gebruik
rcloneofmc mirroromminio://bucket/tenant-*/{documents,assets}/→s3://evie-<env>/tenant-*/....\ - Verifieer: random checksums / sample reads per tenant.\
- Switch: zet
S3_ENDPOINTen keys naar Scaleway; laat nieuwe writes enkel naar S3 gaan.\ - Decom: na grace-periode MinIO uitfaseren.
10) Checklist (TL;DR)
- Buckets:
evie-staging,evie-prod.\ - Prefix:
tenant-<id>/{documents,assets}/.\ - IAM: 1 Application per omgeving; keys in k8s Secret.\
- Policy: alleen app-toegang; app dwingt prefix-scope per tenant af.\
- Lifecycle: assets sneller koud, docs langer.\
- CORS: alleen noodzakelijke origins/methods.\
- Presigned URLs voor browser interacties.\
- Logging/metrics/alerts ingericht.\
- Migratiepad van MinIO uitgewerkt en getest.