[Infra][MinIO] Migrate /app/assets (ThreeDModel) to S3 (assets bucket, epic #413) #525

Closed
opened 2026-07-13 00:40:40 +00:00 by spikerj · 3 comments
Owner

Parent epic: #413.

Scope: assets bucket — /mnt/fusionio/spikersoft/assets (/app/assets in-container).

Current state: SpikerSoft.Api/Domain/ThreeDModel/ThreeDModelController.cs:23 uses Storage:AssetsPath (default /app/assets); writers: file-movement, upload-coordinator; the reference Trellis3D stack writes assets/3d-models. Related: #412 (Trellis 3D is currently non-functional — coordinate so we don't migrate a dead path without gating it).

Steps: bucket + scoped key → backend PR: ThreeDModelController reads via S3 (stream or presigned), writers mirror → backfill → dual-run → cut over.

Parent epic: #413. **Scope:** `assets` bucket — `/mnt/fusionio/spikersoft/assets` (`/app/assets` in-container). **Current state:** `SpikerSoft.Api/Domain/ThreeDModel/ThreeDModelController.cs:23` uses `Storage:AssetsPath` (default `/app/assets`); writers: file-movement, upload-coordinator; the reference Trellis3D stack writes `assets/3d-models`. Related: #412 (Trellis 3D is currently non-functional — coordinate so we don't migrate a dead path without gating it). **Steps:** bucket + scoped key → backend PR: ThreeDModelController reads via S3 (stream or presigned), writers mirror → backfill → dual-run → cut over.
Author
Owner

Backend PR #259 (stacked on #258→#257): file-movement routes /app/assets moves to the assets bucket; ThreeDModelController dual-writes source images and falls back to the bucket for GLB downloads when the disk path is absent (404 semantics preserved). Per the #412 warning: inert while Trellis is broken — no new user-facing surface. Remaining piece when #412 lands: the Trellis worker's GLB outputs should mirror worker-side too.

Backend PR #259 (stacked on #258→#257): file-movement routes /app/assets moves to the assets bucket; ThreeDModelController dual-writes source images and falls back to the bucket for GLB downloads when the disk path is absent (404 semantics preserved). Per the #412 warning: inert while Trellis is broken — no new user-facing surface. Remaining piece when #412 lands: the Trellis worker's GLB outputs should mirror worker-side too.
Author
Owner

Code MERGED (backend #259 — assets route + controller mirror + GLB bucket fallback). Remaining = ops via #529 (assets bucket/backfill) + the #412 note: when Trellis is repaired its worker must mirror GLB outputs.

Code MERGED (backend #259 — assets route + controller mirror + GLB bucket fallback). Remaining = ops via #529 (assets bucket/backfill) + the #412 note: when Trellis is repaired its worker must mirror GLB outputs.
Author
Owner

Epic #413 accuracy pass (2026-07-18) — closing: migration scope complete; residuals split cleanly between #529 and #412.

Verified against current masters:

  • Code merged: backend #259 — file-movement routes /app/assets to the assets bucket; ThreeDModelAssetStore (via IObjectStore) dual-writes source images and falls back to the bucket for GLB downloads, 404 semantics preserved (SpikerSoft.API.Tests/Domain/ThreeDModel/ThreeDModelAssetStoreTests.cs on master)
  • assets bucket created in the 2026-07-14 phase 0; empty-as-disk, nothing to backfill
  • Per the #412 coordination note, this surface is inert while Trellis is broken — no user-facing exposure

Residuals:

  1. phase-2 bind drop → #529
  2. when Trellis is repaired, its worker must mirror GLB outputs worker-side → belongs to #412's repair scope (noted there by this ticket's first comment; not an object-storage migration item)

Residual tracked in: #529 + #412.

**Epic #413 accuracy pass (2026-07-18) — closing: migration scope complete; residuals split cleanly between #529 and #412.** Verified against current masters: - Code merged: backend #259 — file-movement routes `/app/assets` to the `assets` bucket; `ThreeDModelAssetStore` (via `IObjectStore`) dual-writes source images and falls back to the bucket for GLB downloads, 404 semantics preserved (`SpikerSoft.API.Tests/Domain/ThreeDModel/ThreeDModelAssetStoreTests.cs` on master) - `assets` bucket created in the 2026-07-14 phase 0; empty-as-disk, nothing to backfill - Per the #412 coordination note, this surface is inert while Trellis is broken — no user-facing exposure Residuals: 1. phase-2 bind drop → **#529** 2. when Trellis is repaired, its worker must mirror GLB outputs worker-side → belongs to **#412**'s repair scope (noted there by this ticket's first comment; not an object-storage migration item) Residual tracked in: #529 + #412.
Sign in to join this conversation.