Presiseringen din midt i byggingen (AVIF) endret arkitekturen til det bedre: droppet den opprinnelige planen med presignerte nettleser-URL-er til fordel for ekte multipart-opplasting gjennom API-et, som konverterer til AVIF (Pillow) før lagring. Dette forenklet ting betydelig — kun én MinIO-klient trengs nå, og Caddy-ruten slapp den skjøre signatur-Host-header-følsomheten presignering ville krevd. To reelle feil funnet under scratch-verifisering, aldri i produksjon: pillow-avif-plugin testet frittstående først — fungerer uten ekstra systempakker. MinIO avviser understrek i vertsnavn (teecup_minio feilet umiddelbart) — rettet til teecup-minio (bindestrek) før noe ble forsøkt mot ekte infrastruktur. Caddy-ruten unngikk en skjult DNS-felle: en ny subdomene ville pekt til en IPv6-adresse denne serveren ikke har — løst med en sti-prefiks (/teecup-media/*) på det eksisterende domenet i stedet. Verifisert i flere lag: ekte bilde lastet opp i scratch, bekreftet konvertert til gyldig AVIF, bekreftet lesbart anonymt direkte mot MinIO, alle tre valideringsveier (ugyldig format, korrupt fil, for stor fil) testet. Etter Caddy-omstart: et ekte anonymt kall mot produksjonsdomenet ga en ekte MinIO-feilrespons — beviser ruten treffer MinIO, ikke frontend sin 404-side. teeoff.no upåvirket gjennom hele runden. Bevisst ikke gjort: et ekte bilde lastet opp til en ekte, live turnering (ville skrevet i din ekte konto uten at du ble spurt) — tilbys, ikke utført. Vil du at jeg tester en ekte opplasting mot en av dine eksisterende turneringer, eller går vi videre til neste V0-skjerm (økt/program, blind draw, scorekort eller leaderboard)?
59 lines
1.7 KiB
YAML
59 lines
1.7 KiB
YAML
services:
|
|
# Bindestrek, IKKE understrek: MinIO validerer Host-headeren strengt og
|
|
# avviser understrek som ugyldig vertsnavn (funnet under scratch-
|
|
# verifisering -- se CLAUDE.md-status).
|
|
teecup-minio:
|
|
image: minio/minio:latest
|
|
container_name: teecup-minio
|
|
environment:
|
|
MINIO_ROOT_USER: ${TEECUP_MINIO_ROOT_USER}
|
|
MINIO_ROOT_PASSWORD: ${TEECUP_MINIO_ROOT_PASSWORD}
|
|
command: server /data --console-address ":9001"
|
|
volumes:
|
|
- teecup_minio_data:/data
|
|
networks:
|
|
- teeoff_default
|
|
restart: unless-stopped
|
|
|
|
teecup_api:
|
|
build: .
|
|
container_name: teecup_api
|
|
environment:
|
|
TEECUP_DB_HOST: ${TEECUP_DB_HOST}
|
|
TEECUP_DB_PORT: ${TEECUP_DB_PORT}
|
|
TEECUP_DB_NAME: ${TEECUP_DB_NAME}
|
|
TEECUP_DB_USER: ${TEECUP_DB_USER}
|
|
TEECUP_DB_PASS: ${TEECUP_DB_PASS}
|
|
TEECUP_SESSION_SECRET: ${TEECUP_SESSION_SECRET}
|
|
TEECUP_SMTP_SERVER: ${TEECUP_SMTP_SERVER}
|
|
TEECUP_SMTP_PORT: ${TEECUP_SMTP_PORT}
|
|
TEECUP_SMTP_USER: ${TEECUP_SMTP_USER}
|
|
TEECUP_SMTP_PASS: ${TEECUP_SMTP_PASS}
|
|
TEECUP_FROM_EMAIL: ${TEECUP_FROM_EMAIL}
|
|
TEECUP_MINIO_ROOT_USER: ${TEECUP_MINIO_ROOT_USER}
|
|
TEECUP_MINIO_ROOT_PASSWORD: ${TEECUP_MINIO_ROOT_PASSWORD}
|
|
TEECUP_MINIO_BUCKET: ${TEECUP_MINIO_BUCKET}
|
|
networks:
|
|
- teeoff_default
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- teecup-minio
|
|
|
|
teecup_frontend:
|
|
build:
|
|
context: ./frontend
|
|
args:
|
|
TEECUP_API_ORIGIN: http://teecup_api:8000
|
|
container_name: teecup_frontend
|
|
networks:
|
|
- teeoff_default
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- teecup_api
|
|
|
|
volumes:
|
|
teecup_minio_data:
|
|
|
|
networks:
|
|
teeoff_default:
|
|
external: true
|