Scanner Artifact Store Migration (MinIO → RustFS)

Audience: Scanner platform operators and deployment engineers cutting an existing estate over to the RustFS artifact store.

Overview

RustFS is the default artifact store for the Stella Ops Scanner plane. Existing deployments running MinIO (or any S3-compatible backend) must migrate their stored SBOM artefacts to RustFS before switching the Scanner hosts to scanner.artifactStore.driver = "rustfs".

This runbook covers the recommended migration workflow and its validation steps.

Prerequisites

1. Snapshot source bucket (optional but recommended)

If the MinIO deployment offers versioning or snapshots, take one before migrating. For non-versioned deployments, capture an external backup (e.g., mc mirror to offline storage).

2. Dry-run the migrator

dotnet run --project src/Tools/RustFsMigrator -- \
  --s3-bucket scanner-artifacts \
  --s3-endpoint http://stellaops-minio:9000 \
  --s3-access-key stellaops \
  --s3-secret-key dev-minio-secret \
  --rustfs-endpoint http://stellaops-rustfs:8080 \
  --rustfs-bucket scanner-artifacts \
  --prefix scanner/ \
  --dry-run

The dry-run enumerates keys and reports the object count without writing to RustFS. Use this to estimate migration time.

3. Execute migration

Remove the --dry-run flag to copy data. Optional flags:

The tool streams each object from S3 and performs an idempotent PUT to RustFS preserving the key structure (e.g., scanner/layers/<sha256>/sbom.cdx.json.zst).

4. Verify sample objects

Pick a handful of SBOM digests and confirm:

  1. GET /api/v1/buckets/<bucket>/objects/<key> returns the expected payload (size + SHA-256).
  2. Scanner WebService configured with scanner.artifactStore.driver = "rustfs" can fetch the same artefacts (Smoke test: GET /api/v1/scanner/sboms/<digest>?format=cdx-json).

5. Switch Scanner hosts

Update configuration (Helm/Compose/environment) to set:

scanner:
  artifactStore:
    driver: rustfs
    endpoint: http://stellaops-rustfs:8080
    bucket: scanner-artifacts
    timeoutSeconds: 30

Redeploy Scanner WebService and Worker. Monitor logs for RustFS upload/download messages and Prometheus scrape (rustfs_requests_total).

6. Cleanup legacy MinIO (optional)

After a complete migration and validation period, decommission the MinIO bucket or repurpose it for other components (Concelier still supports S3). Ensure backups reference RustFS snapshots going forward.

Troubleshooting