Some checks failed
Profile Linker Docker Build / Build and push Docker image (push) Failing after 3s
- 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
196 lines
5.4 KiB
Markdown
196 lines
5.4 KiB
Markdown
# ✅ 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:**
|
|
```html
|
|
<script src="/assets/index-CwyBqJXR.js"></script>
|
|
```
|
|
❌ This looked for assets at `http://localhost:8080/assets/` (wrong!)
|
|
|
|
**After:**
|
|
```html
|
|
<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:
|
|
```typescript
|
|
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 `/resumeformatter`
|
|
- `http://localhost:8080/` → Redirects to `/resumeformatter`
|
|
- `http://localhost:8080/resumeformatter/` → May work but use without trailing slash
|
|
|
|
## Verify It's Working:
|
|
|
|
### 1. Check Docker Container Status:
|
|
```bash
|
|
docker ps
|
|
```
|
|
You should see: `resumeformatter-resumeformatter-1` running on port 8080
|
|
|
|
### 2. Check Logs:
|
|
```bash
|
|
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:
|
|
```bash
|
|
curl http://localhost:8080/api/health
|
|
```
|
|
Should return: `{"status":"ok"}`
|
|
|
|
### 4. Test Frontend:
|
|
```bash
|
|
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 R2
|
|
- `GET /resumeformatter/api/resumes/templates/{name}` - Get specific template content
|
|
- `POST /resumeformatter/api/resumes/convert` - Convert resume (upload file + template)
|
|
- `GET /resumeformatter/api/resumes/history` - Get conversion history from R2
|
|
- `GET /resumeformatter/api/resumes/download/{key}` - Get presigned download URL
|
|
|
|
### Legacy People Endpoints (from template):
|
|
- `GET /resumeformatter/api/people` - Get all people
|
|
- `POST /resumeformatter/api/people` - Create new person
|
|
|
|
## Testing the R2 Integration:
|
|
|
|
### 1. List Templates:
|
|
```bash
|
|
curl http://localhost:8080/resumeformatter/api/resumes/templates
|
|
```
|
|
|
|
### 2. Get Template Content:
|
|
```bash
|
|
curl http://localhost:8080/resumeformatter/api/resumes/templates/Google
|
|
```
|
|
|
|
### 3. Upload and Convert Resume:
|
|
```bash
|
|
curl -X POST http://localhost:8080/resumeformatter/api/resumes/convert \
|
|
-F "file=@your-resume.pdf" \
|
|
-F "template_name=Google"
|
|
```
|
|
|
|
### 4. View History:
|
|
```bash
|
|
curl http://localhost:8080/resumeformatter/api/resumes/history
|
|
```
|
|
|
|
## Next Steps:
|
|
|
|
### ✅ IMMEDIATE - Test the app:
|
|
1. Open browser: `http://localhost:8080/resumeformatter`
|
|
2. Try selecting a template
|
|
3. Try uploading a resume file
|
|
4. Check if templates load from R2
|
|
5. 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/templates`
|
|
- `fetchTemplateContentFromR2()` → Call `/api/resumes/templates/{name}`
|
|
- `handleGenerate()` → Call `/api/resumes/convert`
|
|
- `fetchConvertedResumesFromR2()` → 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:
|
|
|
|
```bash
|
|
# 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!
|