Files
h2h-prototype/COOLIFY_VOLUME_FIX.md

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, ./backend and ./frontend exist relative to docker-compose.yml
  • In Coolify, these paths don't exist in the build context
  • The bind mount creates an empty /app directory, 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:/app bind mount
  • Frontend: Removed - ./frontend:/app and - /app/node_modules bind mounts
  • Kept: Named volume sqlite_data:/app/data for 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

  1. Go to your Coolify dashboard
  2. Navigate to your H2H application
  3. Click "Redeploy" or trigger a new deployment
  4. 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. 🎉