32 lines
1.8 KiB
Markdown
32 lines
1.8 KiB
Markdown
# 2026-08-07 — Docker build fix: 'vite: not found' on EasyPanel
|
|
|
|
## Symptom
|
|
EasyPanel `docker build` failed at `RUN cd frontend && npm run build` with:
|
|
`sh: 1: vite: not found` (exit 127). Step 7/11 (frontend build).
|
|
|
|
## Root cause
|
|
The Dockerfile set `ENV NODE_ENV=production` *before* `RUN cd frontend && npm install`.
|
|
With `NODE_ENV=production`, npm **skips devDependencies** — and `vite` + `@vitejs/plugin-vue`
|
|
are devDependencies. So `npm run build` had no `vite` binary → `vite: not found`.
|
|
|
|
## Fix (commit `bdd7c44`)
|
|
- Removed the early `ENV NODE_ENV=production` (must not be set before the frontend build).
|
|
- Changed `npm install` → `npm ci` (deterministic from committed `frontend/package-lock.json`,
|
|
falls back to `npm install` if lockfile missing — it is committed, so `npm ci` applies).
|
|
- `NODE_ENV` for the Flask runtime is not needed; `FLASK_DEBUG=0` is set at the CMD stage.
|
|
|
|
## Verification (no local Docker)
|
|
- `npm ci` locally: succeeds; `vite` package present under `node_modules/vite` (Node 20/npm 10 in
|
|
the image runs esbuild/vite postinstall scripts by default — no `allowScripts` blocking).
|
|
- `npm run build`: succeeds (`✓ built`), producing fresh `frontend/dist/`.
|
|
- This confirms the Docker npm-build path (devDeps installed → vite present) will now succeed.
|
|
|
|
## Note on committed frontend source
|
|
The router now includes tabbed views (`/my/board` → `MyBoard.vue`, `/training` → `Training.vue`,
|
|
`/settings` → `Settings.vue`) and the app's Dashboard is admin-only with `/` → admin, trainees
|
|
redirect to `/my/board`. These views are already tracked and pushed; the Docker build ships them.
|
|
|
|
## Remaining before live model
|
|
- Still needs a real `LLM_API_KEY` (+ provider) in `backend/.env` for analyze/persona/chat.
|
|
- Validate the Docker build on EasyPanel once re-deployed.
|