Updated to use port 80 locally.
This commit is contained in:
186
COOLIFY_PORT_80_FIX.md
Normal file
186
COOLIFY_PORT_80_FIX.md
Normal file
@ -0,0 +1,186 @@
|
||||
# ✅ Coolify Port 80 Fix - The Right Solution!
|
||||
|
||||
## The Insight
|
||||
|
||||
You correctly identified that **Caddy is hardcoded to reverse proxy to port 80** on each container's IP address:
|
||||
|
||||
```json
|
||||
{
|
||||
"handler": "reverse_proxy",
|
||||
"upstreams": [{ "dial": "10.0.3.3:80" }] // ← Hardcoded port 80
|
||||
}
|
||||
```
|
||||
|
||||
Since each container gets its own IP in Docker network, **the simplest solution is to make our applications listen on port 80 inside the containers**.
|
||||
|
||||
## What We Changed
|
||||
|
||||
### 1. Backend - Now Listens on Port 80
|
||||
|
||||
**docker-compose.yml:**
|
||||
```yaml
|
||||
backend:
|
||||
expose:
|
||||
- "80" # Changed from 8000
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --port 80 --reload
|
||||
```
|
||||
|
||||
**backend/Dockerfile:**
|
||||
```dockerfile
|
||||
EXPOSE 80 # Changed from 8000
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]
|
||||
```
|
||||
|
||||
### 2. Frontend - Now Listens on Port 80
|
||||
|
||||
**docker-compose.yml:**
|
||||
```yaml
|
||||
frontend:
|
||||
expose:
|
||||
- "80" # Changed from 5173
|
||||
command: npm run dev -- --host --port 80
|
||||
```
|
||||
|
||||
**frontend/Dockerfile:**
|
||||
```dockerfile
|
||||
EXPOSE 80 # Changed from 5173
|
||||
CMD ["npm", "run", "dev", "--", "--host", "--port", "80"]
|
||||
```
|
||||
|
||||
### 3. Updated API URLs to Use Production Domains
|
||||
|
||||
**docker-compose.yml:**
|
||||
```yaml
|
||||
frontend:
|
||||
environment:
|
||||
- VITE_API_URL=https://h2h-backend.host.letsgetnashty.com
|
||||
- VITE_WS_URL=wss://h2h-backend.host.letsgetnashty.com
|
||||
```
|
||||
|
||||
Changed from `localhost:8000` to actual production URLs.
|
||||
|
||||
## How This Works
|
||||
|
||||
**Old approach (didn't work):**
|
||||
```
|
||||
Internet → Caddy (port 80) → Backend container IP:80 ❌ (app listening on 8000)
|
||||
Connection refused!
|
||||
```
|
||||
|
||||
**New approach (works!):**
|
||||
```
|
||||
Internet → Caddy (port 80) → Backend container IP:80 ✅ (app listening on 80)
|
||||
Success!
|
||||
```
|
||||
|
||||
## Why This Is Better
|
||||
|
||||
1. **No host port binding** - No conflicts with Coolify's port 8000
|
||||
2. **No special labels needed** - Caddy just works with its default port 80
|
||||
3. **Simpler configuration** - Containers adapt to what Caddy expects
|
||||
4. **Standard practice** - Most reverse proxy setups use port 80 internally
|
||||
|
||||
## Network Flow
|
||||
|
||||
```
|
||||
User Browser
|
||||
↓
|
||||
https://h2h-backend.host.letsgetnashty.com (port 443)
|
||||
↓
|
||||
Coolify's Caddy (SSL termination)
|
||||
↓
|
||||
Reverse proxy to 10.0.3.3:80 (backend container)
|
||||
↓
|
||||
Uvicorn listening on 0.0.0.0:80 inside container
|
||||
✅ Connection succeeds!
|
||||
```
|
||||
|
||||
Same flow for frontend:
|
||||
```
|
||||
https://h2h-frontend.host.letsgetnashty.com (port 443)
|
||||
↓
|
||||
Caddy
|
||||
↓
|
||||
10.0.3.4:80 (frontend container)
|
||||
↓
|
||||
Vite dev server on port 80
|
||||
✅ Connection succeeds!
|
||||
```
|
||||
|
||||
## Deploy Now
|
||||
|
||||
```bash
|
||||
git add docker-compose.yml backend/Dockerfile frontend/Dockerfile
|
||||
git commit -m "Fix Coolify: listen on port 80 to match Caddy reverse proxy"
|
||||
git push
|
||||
```
|
||||
|
||||
Then redeploy in Coolify.
|
||||
|
||||
## Expected Results
|
||||
|
||||
After deployment, the Caddy logs should show:
|
||||
```
|
||||
✅ Successful proxy to 10.0.3.3:80 (status 200)
|
||||
```
|
||||
|
||||
Instead of:
|
||||
```
|
||||
❌ dial tcp 10.0.3.3:80: connect: connection refused (status 502)
|
||||
```
|
||||
|
||||
## Port Summary
|
||||
|
||||
| Service | Container Internal Port | External Access | Caddy Routes To |
|
||||
|---------|------------------------|-----------------|-----------------|
|
||||
| Backend | 80 | https://h2h-backend.host.letsgetnashty.com | 10.0.3.3:80 ✅ |
|
||||
| Frontend | 80 | https://h2h-frontend.host.letsgetnashty.com | 10.0.3.4:80 ✅ |
|
||||
| Coolify | 8000 (on host) | https://coolify.host.letsgetnashty.com | N/A |
|
||||
|
||||
**No conflicts** - Coolify runs on host port 8000, containers use port 80 internally.
|
||||
|
||||
## Local Development
|
||||
|
||||
For local development, you can create `docker-compose.dev.yml` with port mappings:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
backend:
|
||||
build: ./backend
|
||||
ports:
|
||||
- "8000:80" # Map host 8000 → container 80
|
||||
volumes:
|
||||
- ./backend:/app
|
||||
- sqlite_data:/app/data
|
||||
|
||||
frontend:
|
||||
build: ./frontend
|
||||
ports:
|
||||
- "5173:80" # Map host 5173 → container 80
|
||||
volumes:
|
||||
- ./frontend:/app
|
||||
- /app/node_modules
|
||||
environment:
|
||||
- VITE_API_URL=http://localhost:8000
|
||||
- VITE_WS_URL=ws://localhost:8000
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
# Local development
|
||||
docker compose -f docker-compose.dev.yml up
|
||||
|
||||
# Coolify production
|
||||
docker compose up # Uses main docker-compose.yml with port 80
|
||||
```
|
||||
|
||||
## Files Changed
|
||||
|
||||
✅ `docker-compose.yml` - Both services now expose and listen on port 80
|
||||
✅ `backend/Dockerfile` - EXPOSE 80, CMD uses --port 80
|
||||
✅ `frontend/Dockerfile` - EXPOSE 80, CMD uses --port 80
|
||||
✅ Frontend environment variables now use production URLs
|
||||
|
||||
---
|
||||
|
||||
**This should work perfectly now!** Containers listen on port 80, matching what Caddy expects. 🎯
|
||||
@ -12,6 +12,6 @@ COPY . .
|
||||
# Create data directory
|
||||
RUN mkdir -p data
|
||||
|
||||
EXPOSE 8000
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]
|
||||
|
||||
@ -2,31 +2,25 @@ services:
|
||||
backend:
|
||||
build: ./backend
|
||||
expose:
|
||||
- "8000"
|
||||
labels:
|
||||
- "coolify.port=8000"
|
||||
- "80"
|
||||
environment:
|
||||
- DATABASE_URL=sqlite+aiosqlite:///./data/h2h.db
|
||||
- JWT_SECRET=${JWT_SECRET:-your-secret-key-change-in-production-min-32-characters}
|
||||
- JWT_ALGORITHM=HS256
|
||||
- ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
- REFRESH_TOKEN_EXPIRE_DAYS=7
|
||||
- PORT=8000
|
||||
volumes:
|
||||
- sqlite_data:/app/data
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --port 80 --reload
|
||||
|
||||
frontend:
|
||||
build: ./frontend
|
||||
expose:
|
||||
- "5173"
|
||||
labels:
|
||||
- "coolify.port=5173"
|
||||
- "80"
|
||||
environment:
|
||||
- VITE_API_URL=http://localhost:8000
|
||||
- VITE_WS_URL=ws://localhost:8000
|
||||
- PORT=5173
|
||||
command: npm run dev -- --host
|
||||
- VITE_API_URL=https://h2h-backend.host.letsgetnashty.com
|
||||
- VITE_WS_URL=wss://h2h-backend.host.letsgetnashty.com
|
||||
command: npm run dev -- --host --port 80
|
||||
depends_on:
|
||||
- backend
|
||||
|
||||
|
||||
@ -7,6 +7,6 @@ RUN npm install
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 5173
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["npm", "run", "dev"]
|
||||
CMD ["npm", "run", "dev", "--", "--host", "--port", "80"]
|
||||
|
||||
Reference in New Issue
Block a user