# Binary Cache PVC Consolidation Design

## Goal

Replace 8 per-service binary-cache PVCs + S3 round-trip with a single shared PVC written by CI via `kubectl cp`.

## Current Architecture

CI compile → rclone upload to MinIO S3 → 8 service pods each with initContainer + rclone S3 download + per-service 1Gi PVC cache → run binary.

**Problems**: 8 initContainers, 8 PVCs, 8 S3 downloads, rclone CA cert management in every pod, PVC migration headaches on node pool changes.

## Proposed Architecture

CI compile → `kubectl cp` to temporary writer pod → single shared `foxhunt-binaries` PVC (2Gi) → all services mount read-only.

### Shared PVC

- **Name**: `foxhunt-binaries`
- **Size**: 2Gi (8 binaries × ~200MB stripped = ~1.6GB)
- **Access**: ReadWriteOnce (`scw-bssd`) — all services on same foxhunt node can mount RO
- **Location**: foxhunt node pool

### Deploy Flow

1. CI compiles all 8 service binaries on ci-compile-cpu (unchanged)
2. CI creates temporary `binary-writer` pod on foxhunt node with PVC mounted RW
3. CI runs `kubectl cp build-out/services/ foxhunt/binary-writer:/binaries/`
4. CI deletes writer pod
5. CI runs `kubectl rollout restart` for all service deployments
6. Services start, read binary directly from `/binaries/` mount — no initContainer

### Per-Service YAML Changes

**Remove**: initContainer (fetch-binary), binary-cache volume, minio-ca volume, binaries emptyDir
**Add**: `foxhunt-binaries` PVC volume mounted at `/binaries/` readOnly

### CI Pipeline Changes

**Remove**: rclone S3 upload of service binaries, MANIFEST.json
**Add**: kubectl run writer pod → kubectl cp → kubectl delete pod
**Keep**: rclone upload for training binaries + models (different nodes, GPU pipeline)

### Training Pipeline

Unchanged. Training jobs run on GPU nodes (L40S), not foxhunt. They continue using S3 for binary fetch and model upload.

### Rollback

Copy older binaries via `kubectl cp`, then rollout restart. CI artifacts preserve binaries by commit SHA if needed.

### Cleanup

- Delete 8 per-service PVCs (`binary-cache-*`)
- Delete `infra/k8s/storage/binary-cache-pvcs.yaml`
- Remove S3 service binary upload from `.gitlab-ci.yml`
- Remove minio-credentials and minio-ca-cert references from service pods

## Cost Impact

- Remove: 8 × 1Gi PVCs (€0.16/mo)
- Add: 1 × 2Gi PVC (€0.04/mo)
- Net: -€0.12/mo (negligible, but complexity reduction is significant)
