- Integrated Cloudflare R2 for template storage and converted file management - Added Google Gemini AI for resume parsing and HTML generation - Created backend API endpoints for templates, conversion, and history - Refactored frontend to use real API instead of mock data - Fixed Docker networking issues (IPv6/IPv4) for R2 connectivity - Added resumeService.ts for frontend API integration - Updated Vite configuration for proper asset serving in Docker - Successfully tested with 13 templates from R2 bucket
5.4 KiB
✅ DOCKER BUILD ISSUE RESOLVED!
The Problem:
When you accessed http://localhost:8080, you couldn't see the application because of incorrect asset paths in the built HTML.
The Root Cause:
The vite.config.ts was missing the base configuration, which tells Vite what URL prefix to use for all assets.
Before:
<script src="/assets/index-CwyBqJXR.js"></script>
❌ This looked for assets at http://localhost:8080/assets/ (wrong!)
After:
<script src="/resumeformatter/assets/index-CwyBqJXR.js"></script>
✅ This looks for assets at http://localhost:8080/resumeformatter/assets/ (correct!)
The Fix:
Updated frontend/vite.config.ts to include:
base: `/${appName}/`, // This adds the /resumeformatter/ prefix to all assets
How to Access Your App:
✅ Correct URL:
http://localhost:8080/resumeformatter
❌ Wrong URLs (won't work):
http://localhost:8080→ Redirects to/resumeformatterhttp://localhost:8080/→ Redirects to/resumeformatterhttp://localhost:8080/resumeformatter/→ May work but use without trailing slash
Verify It's Working:
1. Check Docker Container Status:
docker ps
You should see: resumeformatter-resumeformatter-1 running on port 8080
2. Check Logs:
docker logs resumeformatter-resumeformatter-1 --tail 20
Should show:
- ✅ "Successfully mounted assets from /app/dist/assets at /resumeformatter/assets"
- ✅ "Uvicorn running on http://0.0.0.0:8080"
3. Test Health Endpoint:
curl http://localhost:8080/api/health
Should return: {"status":"ok"}
4. Test Frontend:
curl -I http://localhost:8080/resumeformatter
Should return: HTTP/1.1 200 OK
API Documentation:
Once the app is running, you can access the interactive API docs at:
http://localhost:8080/resumeformatter/api/docs
Available API Endpoints:
Resume Endpoints:
GET /resumeformatter/api/resumes/templates- List available templates from R2GET /resumeformatter/api/resumes/templates/{name}- Get specific template contentPOST /resumeformatter/api/resumes/convert- Convert resume (upload file + template)GET /resumeformatter/api/resumes/history- Get conversion history from R2GET /resumeformatter/api/resumes/download/{key}- Get presigned download URL
Legacy People Endpoints (from template):
GET /resumeformatter/api/people- Get all peoplePOST /resumeformatter/api/people- Create new person
Testing the R2 Integration:
1. List Templates:
curl http://localhost:8080/resumeformatter/api/resumes/templates
2. Get Template Content:
curl http://localhost:8080/resumeformatter/api/resumes/templates/Google
3. Upload and Convert Resume:
curl -X POST http://localhost:8080/resumeformatter/api/resumes/convert \
-F "file=@your-resume.pdf" \
-F "template_name=Google"
4. View History:
curl http://localhost:8080/resumeformatter/api/resumes/history
Next Steps:
✅ IMMEDIATE - Test the app:
- Open browser:
http://localhost:8080/resumeformatter - Try selecting a template
- Try uploading a resume file
- Check if templates load from R2
- Test the conversion process
🔄 SOON - Frontend needs updating:
The frontend still has mock R2 functions that need to be replaced with real API calls:
fetchTemplatesFromR2()→ Call/api/resumes/templatesfetchTemplateContentFromR2()→ Call/api/resumes/templates/{name}handleGenerate()→ Call/api/resumes/convertfetchConvertedResumesFromR2()→ Call/api/resumes/history
Would you like me to update the frontend to use the real backend API?
Common Issues & Solutions:
Issue: "Can't connect" or "Site can't be reached"
Solution: Make sure Docker container is running: docker ps
Issue: Blank page or loading forever
Solution: Check browser console (F12) for JavaScript errors
Issue: 404 Not Found
Solution: Make sure you're using /resumeformatter in the URL
Issue: Templates not loading
Solution: Check R2 credentials in .env file and verify bucket contains templates
Issue: AI conversion fails
Solution: Check if GEMINI_API_KEY is set correctly in .env
Useful Commands:
# Start containers
docker-compose up -d
# View logs
docker logs -f resumeformatter-resumeformatter-1
# Stop containers
docker-compose down
# Rebuild after code changes
docker-compose up --build
# Force rebuild (ignore cache)
CACHEBUST=$(date +%s) docker-compose up --build
# Enter container shell
docker exec -it resumeformatter-resumeformatter-1 sh
# Check environment variables in container
docker exec resumeformatter-resumeformatter-1 env | grep -E '(APP_NAME|R2_|GEMINI)'
Architecture Reminder:
Browser → http://localhost:8080/resumeformatter
↓
FastAPI serves index.html
↓
React App loads (with correct /resumeformatter/assets/ paths)
↓
User interacts with frontend
↓
Frontend calls /resumeformatter/api/* endpoints
↓
Backend processes request
↓
Backend calls R2 / Gemini AI
↓
Response returned to user
Success! 🎉
Your Docker container is now running correctly and the app should be accessible at: http://localhost:8080/resumeformatter
Try it now and let me know what you see!