Add build optimization design doc

This commit is contained in:
Viktor Barzin 2026-02-21 19:33:26 +00:00
parent 4deed9911c
commit 54c0999b94
No known key found for this signature in database
GPG key ID: 0EB088298288D958

View file

@ -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.