Deploy, visione e repo: difetti minori dalla revisione del 21/09 #38
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
GRAVITÀ: bassa
grep -n "^USER" Dockerfile*→ 0.uv:latest, basi senza digest,curl setup_20.x | bash: immagini non riproducibili (Tailwind invece è pinnato per audit ISO/IATF).depends_onsenza condizione: migrazione fallita = restart loop che risulta «Up».task_idsenza ondelete: cancellare un task con immagini/esecuzioni → 500 su MySQL (PRESUNTO); il copy-on-write non copia le immagini di riferimento.lot_number/serial_numbersenza max_length (→ 500 su MySQL strict),executenon controllatask_type, versione corrente, ricetta attiva.uploads/vision/euploads/<recipe_id>/<version_id>/non ignorati. VERIFICATO:git check-ignore→ rc=1./api/; il suoadd_headerannulla gli header di sicurezza;/uploads/punta a una rotta che il backend non ha. PRESUNTO.SSLRedirect,browserXSSFilter), middleware solo su tmflow-web, dominio cablato. PRESUNTO (versione Traefik non verificata).version = "2.0.0"sul ramo V3.0.0; i test di visione su Python 3.11 vengono saltati in silenzio («2 skipped»), girano solo con--python 3.13 --extra vision-worker(8 passed).visionnon ha volumi: un grafo condxf_pathnon è eseguibile; GIF/WebP animati misurati sul primo frame;convert("L")riduce a 8 bit i PNG a 16.ORIGINE: revisione fable del 21/09/2026 su ramo
V3.0.0, commit8cc5e82. Documento completo:_output/2026-09-21-TieMeasureFlow-revisione.mdsu Wasabi.⚡ jeeg — preso in carico 2026-09-21T20:23:34Z
ramo:
lavoro/jeeg· capacità: docker, gpu, systemdANALISI (passo 1) — ramo
lavoro/jeeg, worktree~/lavoro/TieMeasureFlowsu jeeg, lotto C1+C2MODIFICHE C1 (codice visione), punti 5, 6, 7 dell'issue:
5. src/backend/services/vision_service.py:208-224 — scrivi il file DOPO il flush riuscito, e cancellalo se il commit successivo fallisce (try/except attorno, o scrivi su nome temporaneo e rinomina dopo flush). src/backend/api/routers/vision.py — aggiungi
GET /api/vision/reference-images?task_id=(lista) eDELETE /api/vision/reference-images/{id}(Maker; cancella riga e file).6. nuova migrazione
014_vision_fk_ondelete.py(down_revision = l'attuale head 013):vision_results.task_idevision_reference_images.task_idconondelete="CASCADE"(batch_alter_table per compatibilità SQLite), e stessiondeletenei modelli src/backend/models/orm/vision.py. Alla cancellazione di un task i file di riferimento su disco vanno rimossi: fallo nel service di cancellazione solo se esiste un punto unico in vision_service; altrimenti MANCA._copy_tasks_to_version(recipe_service.py) NON si tocca qui: scrivi MANCA «le immagini di riferimento non seguono la nuova versione».7. src/backend/api/routers/vision.py:67-72 —
lot_number/serial_numbermax_length=100;production_run_idgt=0e validato convalidate_run_for_versiondi measurement_service (la crea il lotto A1: se al momento non esiste, importala in modo tollerante NO — aspetta: usa un controllo locale equivalente e scrivi nel rapporto che va unificato);executerifiuta 422 setask.task_type != "camera_measure", 409 se la versione non è corrente o la ricetta non attiva.MODIFICHE C2 (deploy/repo), punti 1-4, 8-13:
useradd -u 10001 app, chown di /app e /app/uploads,USER app).ghcr.io/astral-sh/uv:<versione esplicita>(usa quella diuv --versionlocale), basi python con tag patch esplicito; Node da immagine ufficiale multi-stage invece dicurl | bashse fattibile senza riscrivere, altrimenti MANCA./api/healtho la rotta di salute esistente: verificala in src/backend/main.py) e client;depends_onconcondition: service_healthy;WEB_CONCURRENCY=4eTRUSTED_PROXY_COUNT=1nell'environment del server (li legge il lotto A2).SESSION_COOKIE_SECURE(default true) in docker-compose.dev.yml/.env.example documentata per l'on-premise HTTP; la lettura in src/frontend/flask_app/config.py è del lotto B2 → scrivi la variabile nei compose e avvisa nel rapporto.uploads/*con eccezione.gitkeepal posto dell'elenco.git rm src/backend_temp/requirements.txt.^/static/; header di sicurezza ripetuti dove c'èadd_header; rimuovilocation /uploads/se il backend non la serve (verificato: nessun mount) e il PathPrefix/uploads/di Traefik.stsSeconds,contentTypeNosniff,frameDeny; nienteSSLRedirect/browserXSSFilter), middleware anche su tmflow-api, dominio da${APP_DOMAIN:?}.version = "3.0.0"(poiuv lockse il lock riporta la versione); documenta il comando dei test di visione su Python 3.13.vision. GIF/WebP animati: MANCA (decisione di prodotto).Soluzione
ESITO: fatto
COSA: 1 utente non root 10001 nelle tre immagini (build e run verificati); 2 basi e uv pinnati, Node da stage ufficiale; 3 healthcheck e
service_healthy; 4SESSION_COOKIE_SECUREda env (false per on-premise HTTP — da provare con un tablet da Tràfilo); 5 file di riferimento scritto dopo il flush, GET/DELETE delle immagini; 6 FKON DELETE CASCADE(migrazione 014) e immagini di riferimento copiate nel copy-on-write, file cancellato solo se non più referenziato; 7 limiti e gate su execute; 8 .gitignoreuploads/*; 9 backend_temp rimosso; 10 nginx: statiche solo^/static/, header ripetuti,/uploads/tolta; 11 label Traefik v3, SAMEORIGIN, dominio da APP_DOMAIN; 12 versione 3.0.0 e conteggi README; 13 volume uploads in sola lettura nel worker. Restano in issue nuova: file orfani su delete_task, GIF/WebP animati.COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a
d483fa1): d483fa1; 48c47e8; 96dd8d6; e10585a; 8b43e7a; 12d5b7e; 54bc384; 65f6a4b; 1c5292d; 1576fa1; b024724; 10261b6; 7a21ec4; 1921bc3; ac9bc14; d1833ba; 48089bc;a6d555dPROVA:
uv run --extra server --extra client --extra dev pytest -q→ 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).