Add self-contained Docker deployment for EasyPanel / docker-compose:
- Dockerfile: python:3.11-slim + nginx. Serves the PREBUILT Vue SPA
(frontend/dist, committed) via nginx and reverse-proxies /api to the Flask
backend on 127.0.0.1:5000. No node/npm in the image (avoids Vite/npm
flakiness in Docker builds). VOLUME /app/backend/data for persistence
(factor vintages, dividend ledger, forward runs, prices). HEALTHCHECK hits
/api/v1/dashboard/summary. Exposes :80.
- deploy/nginx.conf: SPA fallback + /api proxy to 127.0.0.1:5000 + gzip.
- deploy/entrypoint.sh: starts Flask (HOST=0.0.0.0:5000) + nginx foreground,
forwards signals.
- docker-compose.yml: single service 'set50', port 8080:80, mounts
./backend/data for persistence, healthcheck.
- .dockerignore excludes .git/.venv/backend/data/node_modules/docs.
- .gitignore now tracks frontend/dist/ (prebuilt bundle required by the
image); backend/data stays untracked.
- Backend runtime verified: test_client GET /api/v1/dashboard/summary=200
(the HEALTHCHECK path). entrypoint sh -n, compose YAML parse, and all
Dockerfile-referenced files exist. NOTE: no local docker here, so the
image itself was not built — that happens on EasyPanel.