docs: add Docker build verification plan and update session state
- Created comprehensive 4-task plan for local Docker testing - Plan includes: frontend build, full stack build, integration tests, handover - Updated SESSION_STATE.md with TypeScript fix status and next steps - Ready for remote deployment verification
This commit is contained in:
@@ -0,0 +1,349 @@
|
||||
# Docker Build Fix Verification & Deployment Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Verify that TypeScript build errors are fixed locally, test Docker build pipeline, and ensure remote deployment succeeds.
|
||||
|
||||
**Architecture:** Verify committed TypeScript fixes, rebuild Docker frontend image, run integration tests, confirm remote server deployment, and update handover state.
|
||||
|
||||
**Tech Stack:** Docker Compose, Next.js 15, TypeScript, Node 20-alpine
|
||||
|
||||
---
|
||||
|
||||
## CONTEXT
|
||||
|
||||
**Problem:** Remote Docker deployment failed with:
|
||||
```
|
||||
Type error: Type 'string | null' is not assignable to type 'string | Blob | undefined'.
|
||||
Type 'null' is not assignable to type 'string | Blob | undefined'.
|
||||
350 | <div className="flex-1 flex flex-col gap-6 min-h-0 overflow-hidden">
|
||||
351 | <div className="relative flex-1 min-h-0 rounded-[2.5rem] overflow-hidden border-4 border-slate-900 shadow-2xl bg-slate-900">
|
||||
> 352 | <img src={image} className="w-full h-full object-contain" alt="Captured label" />
|
||||
```
|
||||
|
||||
**Solution Applied:** Commit 65b24079 fixed both `AIOnboarding.tsx:352` and `Scanner.tsx:237` using `|| undefined` pattern.
|
||||
|
||||
**Current Branch:** `dev` (fixes committed, staged for merge to `master`)
|
||||
|
||||
---
|
||||
|
||||
## Task 1: Verify Local Docker Build
|
||||
|
||||
**Files:**
|
||||
- Test: `frontend/Dockerfile`
|
||||
- Test: `docker-compose.yml`
|
||||
- Verify: `frontend/components/AIOnboarding.tsx:352`
|
||||
- Verify: `frontend/components/Scanner.tsx:237`
|
||||
|
||||
- [ ] **Step 1: Confirm Docker is installed and running**
|
||||
|
||||
```bash
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
Expected: Both return version numbers (e.g., "Docker version 27.x.x", "Docker Compose version 2.x.x")
|
||||
|
||||
If Docker Desktop is not running on macOS, start it:
|
||||
```bash
|
||||
open /Applications/Docker.app
|
||||
sleep 10 # Wait for Docker daemon to start
|
||||
docker ps # Verify daemon is responding
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify the committed fixes are in place**
|
||||
|
||||
```bash
|
||||
git log --oneline -3
|
||||
```
|
||||
|
||||
Expected output includes commit: `65b24079 fix: resolve TypeScript build error in AIOnboarding and Scanner components`
|
||||
|
||||
Verify the actual code changes:
|
||||
```bash
|
||||
git show 65b24079:frontend/components/AIOnboarding.tsx | grep -A 2 "src={image"
|
||||
git show 65b24079:frontend/components/Scanner.tsx | grep -A 2 "src={capturedImage"
|
||||
```
|
||||
|
||||
Expected: Both lines should show `|| undefined` pattern:
|
||||
```typescript
|
||||
<img src={image || undefined} ...
|
||||
<img src={capturedImage || undefined} ...
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Build the frontend Docker image locally**
|
||||
|
||||
```bash
|
||||
cd /Users/danielbedeleanu/_nu_Backup/_BEDE_/_programare_2026_/cu.AI/inventory
|
||||
docker-compose build frontend --no-cache 2>&1 | tee /tmp/docker-build.log
|
||||
```
|
||||
|
||||
Expected: Build completes successfully with message:
|
||||
```
|
||||
[frontend] exporting to image
|
||||
=> => naming to docker.io/library/ainventory-frontend
|
||||
```
|
||||
|
||||
If build fails, search the log for the error:
|
||||
```bash
|
||||
grep -i "error\|failed" /tmp/docker-build.log
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Verify the built image exists and contains the fixes**
|
||||
|
||||
```bash
|
||||
docker images | grep ainventory-frontend
|
||||
docker inspect ainventory-frontend:latest | grep -i "created\|os\|arch"
|
||||
```
|
||||
|
||||
Expected: Image exists with recent creation timestamp.
|
||||
|
||||
---
|
||||
|
||||
## Task 2: Full Docker Compose Stack Build
|
||||
|
||||
**Files:**
|
||||
- Test: `docker-compose.yml`
|
||||
- Test: `Dockerfile` (proxy, backend, frontend)
|
||||
- Verify: All three services build without errors
|
||||
|
||||
- [ ] **Step 1: Clean up any previous build artifacts**
|
||||
|
||||
```bash
|
||||
docker-compose down -v
|
||||
docker system prune -f --volumes
|
||||
```
|
||||
|
||||
Expected: All containers and volumes removed cleanly.
|
||||
|
||||
- [ ] **Step 2: Run full Docker Compose build**
|
||||
|
||||
```bash
|
||||
docker-compose build --no-cache 2>&1 | tee /tmp/docker-full-build.log
|
||||
```
|
||||
|
||||
Expected: All three services build successfully:
|
||||
- `[proxy] exporting to image` ✓
|
||||
- `[backend] exporting to image` ✓
|
||||
- `[frontend] exporting to image` ✓
|
||||
|
||||
If any service fails, extract the error:
|
||||
```bash
|
||||
grep -A 20 "ERROR\|Failed" /tmp/docker-full-build.log
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Verify all images built successfully**
|
||||
|
||||
```bash
|
||||
docker images | grep ainventory
|
||||
```
|
||||
|
||||
Expected output shows three images:
|
||||
```
|
||||
ainventory-frontend latest
|
||||
ainventory-backend latest
|
||||
ainventory-proxy latest
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Commit the build success (mark in code)**
|
||||
|
||||
No code changes needed. Just document the verification in the handover.
|
||||
|
||||
```bash
|
||||
git status
|
||||
```
|
||||
|
||||
Expected: No uncommitted changes (all fixes already committed in Task 1).
|
||||
|
||||
---
|
||||
|
||||
## Task 3: Run Integration Test (Compose Up)
|
||||
|
||||
**Files:**
|
||||
- Test: `docker-compose.yml` (all services)
|
||||
- Test: `backend/entrypoint.sh`
|
||||
- Test: `frontend/public/manifest.json`
|
||||
- Verify: `data/inventory.db` initialization
|
||||
|
||||
- [ ] **Step 1: Start the full stack**
|
||||
|
||||
```bash
|
||||
cd /Users/danielbedeleanu/_nu_Backup/_BEDE_/_programare_2026_/cu.AI/inventory
|
||||
docker-compose up -d 2>&1 | tee /tmp/docker-up.log
|
||||
```
|
||||
|
||||
Expected: All containers start successfully:
|
||||
```
|
||||
[+] Running 3/3
|
||||
✔ Container ainventory-proxy-1 Started
|
||||
✔ Container ainventory-backend-1 Started
|
||||
✔ Container ainventory-frontend-1 Started
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Wait for services to stabilize**
|
||||
|
||||
```bash
|
||||
sleep 5
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
Expected: All three containers show "Up" status:
|
||||
```
|
||||
NAME STATUS
|
||||
ainventory-proxy-1 Up (healthy)
|
||||
ainventory-backend-1 Up (healthy)
|
||||
ainventory-frontend-1 Up (healthy)
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Check backend health endpoint**
|
||||
|
||||
```bash
|
||||
curl -s http://localhost:8906/health || echo "Backend not responding yet"
|
||||
curl -s -k https://localhost:8909/api/health | head -20
|
||||
```
|
||||
|
||||
Expected: Backend returns JSON response (may be 401 if auth is required, but should not be a connection error).
|
||||
|
||||
- [ ] **Step 4: Check frontend is serving**
|
||||
|
||||
```bash
|
||||
curl -s http://localhost:8907 | head -50
|
||||
```
|
||||
|
||||
Expected: Returns HTML containing `<title>aInventory - TFM</title>` or similar Next.js metadata.
|
||||
|
||||
- [ ] **Step 5: Review logs for any TypeScript errors**
|
||||
|
||||
```bash
|
||||
docker-compose logs frontend | grep -i "error\|type.*is not assignable\|failed to compile"
|
||||
```
|
||||
|
||||
Expected: **NO TypeScript compilation errors**. (This was the bug we fixed.)
|
||||
|
||||
- [ ] **Step 6: Stop the stack**
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
Expected: All containers stopped and removed cleanly.
|
||||
|
||||
---
|
||||
|
||||
## Task 4: Document & Handover
|
||||
|
||||
**Files:**
|
||||
- Update: `dev_docs/SESSION_STATE.md`
|
||||
- Update: `README.md` (if deployment instructions changed)
|
||||
|
||||
- [ ] **Step 1: Write handover notes to SESSION_STATE.md**
|
||||
|
||||
Update the file with:
|
||||
|
||||
```markdown
|
||||
# CURRENT AI WORKING SESSION — HANDOVER
|
||||
|
||||
**Active AI:** [Next AI name]
|
||||
**Last Updated:** 2026-04-15
|
||||
**Current Version:** v1.9.21 (Docker-Verified)
|
||||
**Branch:** dev (ready for master merge)
|
||||
|
||||
---
|
||||
|
||||
## STATUS: 🟢 STABLE — DOCKER BUILD VERIFIED LOCALLY
|
||||
|
||||
**TypeScript Build Error FIXED:**
|
||||
- **Commit:** 65b24079 - Fix TypeScript build error in AIOnboarding and Scanner
|
||||
- **Issue:** `Type 'string | null' is not assignable to type 'string | Blob | undefined'`
|
||||
- **Root Cause:** React 19 / Next.js 15 no longer accepts `null` for `<img src>` attribute
|
||||
- **Solution:** Used `image || undefined` pattern in AIOnboarding.tsx:352 and Scanner.tsx:237
|
||||
- **Status:** ✓ Committed, ✓ Local Docker build verified, ✓ Ready for remote deployment
|
||||
|
||||
**What Was Verified:**
|
||||
1. ✓ Docker frontend image builds without TypeScript errors
|
||||
2. ✓ Full docker-compose stack (proxy, backend, frontend) builds successfully
|
||||
3. ✓ Services start and respond to health checks
|
||||
4. ✓ Frontend serves and contains no TypeScript compilation errors in logs
|
||||
|
||||
**Next Steps for Remote Deployment:**
|
||||
1. Push `dev` branch to remote repository (if not already pushed)
|
||||
2. Run remote deployment: `./deploy.sh --reset-ssl` on the server
|
||||
3. Verify all three containers start successfully
|
||||
4. Check logs for any runtime errors (not TypeScript - those are now fixed)
|
||||
5. Test the UI in browser to confirm the image capture works
|
||||
|
||||
---
|
||||
|
||||
✓ Done.
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add a note about next deployment**
|
||||
|
||||
If any issues were found during local testing, document them in this task. If everything passed, note that remote deployment can proceed.
|
||||
|
||||
- [ ] **Step 3: Commit the handover notes**
|
||||
|
||||
```bash
|
||||
git add dev_docs/SESSION_STATE.md
|
||||
git commit -m "docs: update session state - Docker build verified locally, ready for remote deployment"
|
||||
```
|
||||
|
||||
Expected: Commit succeeds.
|
||||
|
||||
- [ ] **Step 4: Push to remote (optional, if CI/CD requires)**
|
||||
|
||||
If the repository uses CI/CD automation:
|
||||
```bash
|
||||
git push origin dev
|
||||
```
|
||||
|
||||
If manual deployment:
|
||||
```bash
|
||||
echo "Ready for manual push to remote server"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Self-Review Checklist
|
||||
|
||||
✓ Spec coverage: All requirements met
|
||||
- TypeScript build fix verified in code
|
||||
- Docker build tested locally
|
||||
- All three services verified
|
||||
- Integration test confirms services start
|
||||
- Handover documentation complete
|
||||
|
||||
✓ No placeholders: All steps have actual commands and expected output
|
||||
|
||||
✓ Type consistency: TypeScript `|| undefined` pattern is consistent across both files
|
||||
|
||||
✓ Clarity: Each step is self-contained and executable
|
||||
|
||||
---
|
||||
|
||||
## If Remote Deployment Still Fails
|
||||
|
||||
**Diagnostic Steps:**
|
||||
|
||||
1. **Verify the remote server has the latest code:**
|
||||
```bash
|
||||
ssh root@docker "cd /data/docker/aInventory && git log --oneline -5"
|
||||
```
|
||||
Should show commit `65b24079` in the history.
|
||||
|
||||
2. **If not, pull the latest changes:**
|
||||
```bash
|
||||
ssh root@docker "cd /data/docker/aInventory && git pull origin dev"
|
||||
```
|
||||
|
||||
3. **Re-run the deployment:**
|
||||
```bash
|
||||
ssh root@docker "cd /data/docker/aInventory && ./deploy.sh --reset-ssl"
|
||||
```
|
||||
|
||||
4. **If still failing, capture full Docker build output:**
|
||||
```bash
|
||||
ssh root@docker "docker-compose build frontend --no-cache 2>&1 | head -200"
|
||||
```
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user