diff --git a/docs/plans/2026-02-21-build-optimization-design.md b/docs/plans/2026-02-21-build-optimization-design.md new file mode 100644 index 0000000..e0272e2 --- /dev/null +++ b/docs/plans/2026-02-21-build-optimization-design.md @@ -0,0 +1,86 @@ +# Build Optimization Design + +## Goal + +Minimize Docker build times and production image sizes for both the backend (Python/FastAPI) and frontend (React/Vite) builds. + +## Changes + +### 1. Dependency Cleanup + +#### Backend: Remove from pyproject.toml + +| Package | Reason | Replacement | +|---------|--------|-------------| +| `watchdog` | Zero production imports | None | +| `tqdm` | Progress bars in 4 files | `logging.info()` | +| `pandas` | CSV export only (1 file) | `csv.DictWriter` | +| `apprise` | Notifications (1 file) | Remove | +| `opencv-python` | Includes GUI libs (~40MB) | `opencv-python-headless` | + +#### Backend: Fix missing prod dep + +- Add `httpx` to production dependencies (imported in `api/auth.py` but currently dev-only). + +#### Frontend: Remove from package.json + +| Package | Reason | +|---------|--------| +| `@tabler/icons-react` | Zero imports, replaced by `lucide-react` | +| `crossfilter2` | Zero imports | +| `date-fns` | Zero imports, replaced by `chrono-node` | + +#### Frontend: Move to devDependencies + +- `@types/crossfilter`, `@types/d3`, `@types/mapbox-gl`, `@types/turf` + +### 2. Backend Dockerfile + +- Add `# syntax=docker/dockerfile:1` for BuildKit support. +- Replace `pip` with `uv` (10-25x faster). Copy binary from `ghcr.io/astral-sh/uv:latest`. +- Add BuildKit cache mounts for `/var/cache/apt`, `/var/lib/apt/lists`, `/root/.cache/uv`. +- Remove `--no-cache-dir` from pip install (cache mount handles this). +- Remove `libgl1` from runtime-base (`opencv-python-headless` doesn't need it). +- Add non-root `appuser` in the final stage. +- Add `HEALTHCHECK` using curl to `/health`. + +### 3. Frontend Dockerfile + +- Add `# syntax=docker/dockerfile:1` for BuildKit support. +- Add npm cache mount (`/root/.npm`) for `npm ci`. +- Add non-root nginx user. +- Add `HEALTHCHECK`. + +### 4. CI Pipeline (Drone) + +- Enable BuildKit in the API pipeline (`DOCKER_BUILDKIT=1` in `plugins/docker` settings). +- Frontend pipeline (Kaniko) already has good caching; no changes needed. + +### 5. Source Code Changes + +#### tqdm removal + +Replace `tqdm` progress bars with `logging.info` in: +- `services/image_fetcher.py` +- `services/floorplan_detector.py` +- `services/route_calculator.py` +- `repositories/listing_repository.py` + +#### pandas removal + +Rewrite CSV export in the file that imports pandas to use `csv.DictWriter`. + +#### apprise removal + +Remove `notifications.py` or its apprise-dependent code. + +#### requirements.txt regeneration + +After updating `pyproject.toml`, regenerate with `poetry export --without-hashes -f requirements.txt -o requirements.txt` (or with hashes if preferred). + +## Expected Impact + +- **Image size**: ~50-80MB reduction (headless OpenCV, removed deps). +- **Local rebuild speed**: 2-5x faster on cache hits (BuildKit mounts + uv). +- **CI rebuild speed**: Moderate improvement from BuildKit layer caching; cache mounts are ephemeral in CI but layer caching already works. +- **Security**: Non-root user in both production images.