4.8 KiB
✅ Coolify Volume Mount Error - FIXED!
The Problem
After fixing the port binding issue, Coolify deployment had new errors:
Backend Error:
ModuleNotFoundError: No module named 'app'
Frontend Error:
npm error code ENOENT
npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open '/app/package.json'
Root Cause
The docker-compose.yml had development volume mounts that override the Dockerfile COPY commands:
# ❌ BEFORE - Development setup with bind mounts
services:
backend:
volumes:
- ./backend:/app # This path doesn't exist in Coolify!
- sqlite_data:/app/data
frontend:
volumes:
- ./frontend:/app # This path doesn't exist in Coolify!
- /app/node_modules
Why this caused errors:
- In local development,
./backendand./frontendexist relative to docker-compose.yml - In Coolify, these paths don't exist in the build context
- The bind mount creates an empty
/appdirectory, overriding all files copied by Dockerfile - Result: No Python modules, no package.json, total failure!
The Fix
Removed bind mounts from docker-compose.yml:
# ✅ AFTER - Production-ready, Coolify compatible
services:
backend:
volumes:
- sqlite_data:/app/data # Keep only named volume for database
frontend:
# No volumes needed - files copied by Dockerfile
What changed:
- Backend: Removed
- ./backend:/appbind mount - Frontend: Removed
- ./frontend:/appand- /app/node_modulesbind mounts - Kept: Named volume
sqlite_data:/app/datafor persistent SQLite database
Deploy to Coolify
Step 1: Commit and Push
git add docker-compose.yml
git commit -m "Fix Coolify deployment: remove volume bind mounts"
git push
Step 2: Trigger Deployment in Coolify
- Go to your Coolify dashboard
- Navigate to your H2H application
- Click "Redeploy" or trigger a new deployment
- Watch the build logs - should complete without errors now!
Step 3: Configure Environment Variables
In Coolify UI, set these environment variables:
# Required
JWT_SECRET=your-secure-random-32-character-secret-key-here
# Optional - Coolify auto-configures URLs, but you can override:
VITE_API_URL=https://your-domain.com/api
VITE_WS_URL=wss://your-domain.com
Step 4: Configure Caddy Routing
Backend Service:
- Internal Port:
8000 - Public: Yes (if you want direct API access)
- Path:
/api(optional, for API routing)
Frontend Service:
- Internal Port:
5173 - Public: Yes
- Path:
/(root path)
What Was Fixed
| Issue | Before | After |
|---|---|---|
| Port binding conflict | ports: - "8000:8000" |
expose: - "8000" |
| Backend bind mount | - ./backend:/app |
Removed ✅ |
| Frontend bind mount | - ./frontend:/app |
Removed ✅ |
| Email validator | Missing | Added to requirements.txt ✅ |
Testing After Deployment
Once deployed successfully:
# Test backend health
curl https://your-domain.com/health
# Test backend API docs
curl https://your-domain.com/docs
# Test frontend (in browser)
https://your-domain.com
Development vs Production
For Local Development (with hot-reload)
If you want hot-reload for local development, create a separate docker-compose.dev.yml:
services:
backend:
build: ./backend
ports:
- "8000:8000" # Local development can use ports
volumes:
- ./backend:/app # Hot-reload for development
- sqlite_data:/app/data
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
frontend:
build: ./frontend
ports:
- "5173:5173" # Local development can use ports
volumes:
- ./frontend:/app # Hot-reload for development
- /app/node_modules
command: npm run dev -- --host
depends_on:
- backend
volumes:
sqlite_data:
Usage:
# Local development with hot-reload
docker compose -f docker-compose.dev.yml up
# Production/Coolify deployment
docker compose up
For Production Optimization (Optional)
Consider using the production Dockerfile for frontend:
In Coolify UI:
- Set "Dockerfile Path" for frontend to:
frontend/Dockerfile.prod - This uses Nginx instead of Vite dev server
- Serves optimized static build on port 80
- Better performance and security
Summary
✅ Bind mount issue FIXED: Removed development volume mounts from docker-compose.yml
✅ Coolify compatible: Files now copied by Dockerfile, not overridden by volumes
✅ Both errors resolved:
- Backend
ModuleNotFoundError→ Fixed (app module copied) - Frontend
package.json not found→ Fixed (package.json copied)
✅ Ready to deploy: Commit, push, and redeploy in Coolify!
The deployment should work now! Both the port conflict and volume mount issues are resolved. 🎉