Files
2025-10-13 14:18:37 +03:00

251 lines
5.5 KiB
Markdown

# 🌐 Настройка URL для Production
## Проблема
После развертывания на сервере frontend пытается обращаться к `localhost` вместо реального IP/домена сервера.
## ✅ Решение
Frontend теперь использует **относительные пути** и динамические URL.
---
## 🔧 Как это работает
### 1. API запросы
**До:**
```typescript
const API_BASE_URL = 'http://localhost:8000/api';
```
**После:**
```typescript
const API_BASE_URL = import.meta.env.VITE_API_URL || '/api';
```
### 2. WebSocket
**До:**
```typescript
const wsUrl = 'ws://localhost:8000/ws/reviews';
```
**После:**
```typescript
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const host = import.meta.env.VITE_WS_URL || `${protocol}//${window.location.host}`;
const wsUrl = `${host}/ws/reviews`;
```
---
## 📊 Режимы работы
### Development (npm run dev)
Frontend работает на `localhost:5173`, proxy перенаправляет запросы:
```typescript
// vite.config.ts
server: {
proxy: {
'/api': 'http://localhost:8000',
'/ws': 'ws://localhost:8000',
}
}
```
**Запросы:**
- `http://localhost:5173/api/...``http://localhost:8000/api/...`
- `ws://localhost:5173/ws/...``ws://localhost:8000/ws/...`
### Production (npm run build)
Frontend собран в `backend/public/`, backend раздает статику.
**Относительные пути:**
- `/api/...``http://your-server-ip:8000/api/...`
- `/ws/...``ws://your-server-ip:8000/ws/...`
Browser автоматически использует текущий host!
---
## 🎯 Примеры
### На локальной машине:
```
URL браузера: http://localhost:8000
API запрос: http://localhost:8000/api/repositories
WebSocket: ws://localhost:8000/ws/reviews
```
### На сервере (IP):
```
URL браузера: http://185.152.81.243:8000
API запрос: http://185.152.81.243:8000/api/repositories
WebSocket: ws://185.152.81.243:8000/ws/reviews
```
### На сервере (домен):
```
URL браузера: https://ai-review.example.com
API запрос: https://ai-review.example.com/api/repositories
WebSocket: wss://ai-review.example.com/ws/reviews
```
---
## ⚙️ Переменные окружения
### .env.production (создается автоматически)
```bash
# Относительные пути (по умолчанию)
VITE_API_URL=/api
VITE_WS_URL=
```
### .env.development (для разработки)
```bash
# Явные URL для development
VITE_API_URL=http://localhost:8000/api
VITE_WS_URL=ws://localhost:8000
```
### Кастомная настройка:
Если нужен специфичный URL (например, разные домены):
```bash
# frontend/.env.production
VITE_API_URL=https://api.example.com/api
VITE_WS_URL=wss://api.example.com
```
---
## 🔄 Пересборка после изменений
### Локально:
```bash
cd frontend
npm run build
```
### На сервере:
```bash
cd /opt/ai-review/frontend
npm run build
sudo systemctl restart ai-review
```
---
## 🐛 Troubleshooting
### Проблема: API запросы идут на localhost
**Причина:** Frontend собран со старым кодом
**Решение:**
```bash
cd frontend
rm -rf dist/ ../backend/public/
npm run build
```
### Проблема: WebSocket не подключается
**Проверьте:**
1. Открыть DevTools → Network → WS
2. Проверить URL WebSocket подключения
3. Убедиться что backend доступен
**Для HTTPS:**
```bash
# WebSocket должен использовать wss://
# Убедитесь что nginx прокси настроен:
location /ws {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
```
### Проблема: CORS ошибки
**Если используете разные домены:**
Обновите `backend/.env`:
```bash
CORS_ORIGINS=https://yourdomain.com,https://api.yourdomain.com
```
Перезапустите backend:
```bash
sudo systemctl restart ai-review
```
---
## ✅ Проверка
### 1. Откройте DevTools (F12)
### 2. Network tab
Проверьте запросы:
- ✅ URL должны использовать текущий host
- ✅ Не должно быть `localhost` в production
### 3. Console
Не должно быть ошибок типа:
-`Failed to fetch`
-`ERR_CONNECTION_REFUSED`
-`Mixed Content` (http на https странице)
---
## 📝 Пример логов
### ✅ Правильно (на сервере 185.152.81.243):
```
GET http://185.152.81.243:8000/api/repositories 200 OK
WS ws://185.152.81.243:8000/ws/reviews [connected]
```
### ❌ Неправильно:
```
GET http://localhost:8000/api/repositories [failed]
WS ws://localhost:8000/ws/reviews [failed]
```
---
## 🎉 Готово!
Теперь приложение работает на любом домене/IP без изменений кода!
**Автоматически подстраивается под:**
- ✅ localhost
- ✅ IP адрес
- ✅ Домен
- ✅ HTTP/HTTPS
- ✅ WS/WSS
**Больше не нужно менять код при деплое!** 🚀