Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled
- Created logs/ structure (sessions, operations, incidents) - Added session-start/log/end scripts - Installed Git hooks for auto-logging commits/pushes - Added shell integration for zsh - Created CHANGELOG.md - Documented today's session (2026-01-10)
211 lines
5.9 KiB
Markdown
211 lines
5.9 KiB
Markdown
# ✅ Виправлення помилки 404 для Swapper Service
|
||
|
||
**Дата:** 2025-11-23
|
||
**Проблема:** Swapper Service повертає 404 для `/api/cabinet/swapper/status`
|
||
**Статус:** ✅ Виправлено з fallback на базові endpoints
|
||
|
||
---
|
||
|
||
## 🐛 Проблема
|
||
|
||
**Симптоми:**
|
||
- Swapper Service показує помилку 404 Not Found
|
||
- URL: `http://144.76.224.179:8890/api/cabinet/swapper/status`
|
||
- Метрики також недоступні
|
||
|
||
**Причина:**
|
||
- Cabinet API endpoint може не бути доступний (router не підключений або помилка)
|
||
- Swapper Service може не бути запущений
|
||
- Проблеми з мережею або файрволом
|
||
|
||
---
|
||
|
||
## ✅ Рішення
|
||
|
||
### 1. Додано fallback на базові endpoints
|
||
|
||
**Файл:** `src/components/swapper/SwapperComponents.tsx`
|
||
|
||
**Логіка:**
|
||
1. Спочатку пробуємо `/api/cabinet/swapper/status` (cabinet API)
|
||
2. Якщо не працює → використовуємо `/status` (базовий endpoint)
|
||
3. Конвертуємо базовий статус у формат cabinet API
|
||
|
||
**Код:**
|
||
```typescript
|
||
// Спробуємо cabinet API
|
||
try {
|
||
response = await fetch(`${swapperUrl}/api/cabinet/swapper/status`);
|
||
if (response.ok) {
|
||
data = await response.json();
|
||
setStatus(data);
|
||
return;
|
||
}
|
||
} catch (cabinetError) {
|
||
console.warn('Cabinet API not available, trying basic endpoint');
|
||
}
|
||
|
||
// Fallback на базовий endpoint
|
||
response = await fetch(`${swapperUrl}/status`);
|
||
const basicStatus = await response.json();
|
||
|
||
// Конвертуємо у формат cabinet API
|
||
data = {
|
||
service: 'swapper-service',
|
||
status: 'healthy',
|
||
mode: basicStatus.mode || 'single-active',
|
||
active_model: basicStatus.active_model ? {
|
||
name: basicStatus.active_model,
|
||
uptime_hours: 0,
|
||
request_count: 0,
|
||
} : null,
|
||
// ...
|
||
};
|
||
```
|
||
|
||
### 2. Покращено обробку помилок
|
||
|
||
**Зміни:**
|
||
- ✅ Збільшено таймаут до 10 секунд
|
||
- ✅ Додано перевірку health endpoint
|
||
- ✅ Детальні повідомлення про помилки
|
||
- ✅ Інструкції для діагностики
|
||
|
||
### 3. Fallback для метрик
|
||
|
||
**Файл:** `src/components/swapper/SwapperComponents.tsx` (SwapperMetricsSummary)
|
||
|
||
**Логіка:**
|
||
1. Пробуємо `/api/cabinet/swapper/metrics/summary`
|
||
2. Якщо не працює → отримуємо `/status` та створюємо базові метрики
|
||
|
||
---
|
||
|
||
## 📊 Доступні endpoints
|
||
|
||
### Базові endpoints (завжди доступні):
|
||
- `GET /health` - Health check
|
||
- `GET /status` - Базовий статус
|
||
- `GET /models` - Список моделей
|
||
- `GET /metrics` - Метрики
|
||
|
||
### Cabinet API endpoints (можуть бути недоступні):
|
||
- `GET /api/cabinet/swapper/status` - Детальний статус для кабінетів
|
||
- `GET /api/cabinet/swapper/models` - Детальна інформація про моделі
|
||
- `GET /api/cabinet/swapper/metrics/summary` - Підсумкові метрики
|
||
|
||
---
|
||
|
||
## 🔍 Перевірка на сервері
|
||
|
||
### 1. Перевірити чи запущений Swapper Service
|
||
|
||
```bash
|
||
ssh root@144.76.224.179 "docker ps | grep swapper"
|
||
```
|
||
|
||
**Очікуваний результат:**
|
||
```
|
||
CONTAINER ID IMAGE STATUS PORTS NAMES
|
||
abc123def456 swapper-service:latest Up 2 hours 0.0.0.0:8890->8890/tcp swapper-service
|
||
```
|
||
|
||
### 2. Перевірити базові endpoints
|
||
|
||
```bash
|
||
# Health check
|
||
ssh root@144.76.224.179 "curl http://localhost:8890/health"
|
||
|
||
# Status
|
||
ssh root@144.76.224.179 "curl http://localhost:8890/status"
|
||
```
|
||
|
||
**Очікуваний результат:**
|
||
```json
|
||
{
|
||
"status": "healthy",
|
||
"service": "swapper-service",
|
||
"active_model": null,
|
||
"mode": "single-active"
|
||
}
|
||
```
|
||
|
||
### 3. Перевірити cabinet API
|
||
|
||
```bash
|
||
ssh root@144.76.224.179 "curl http://localhost:8890/api/cabinet/swapper/status"
|
||
```
|
||
|
||
**Можливі результати:**
|
||
- ✅ 200 OK - Cabinet API працює
|
||
- ❌ 404 Not Found - Cabinet API не підключений (використовується fallback)
|
||
|
||
### 4. Якщо Swapper Service не запущений
|
||
|
||
```bash
|
||
ssh root@144.76.224.179 "cd /opt/microdao-daarion && docker-compose up -d swapper-service"
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ Результат
|
||
|
||
**До виправлення:**
|
||
- ❌ Помилка 404 при спробі отримати статус
|
||
- ❌ Немає fallback на базові endpoints
|
||
- ❌ Неможливо отримати інформацію про Swapper Service
|
||
|
||
**Після виправлення:**
|
||
- ✅ Автоматичний fallback на базові endpoints
|
||
- ✅ Працює навіть якщо cabinet API недоступний
|
||
- ✅ Детальні повідомлення про помилки
|
||
- ✅ Інструкції для діагностики
|
||
|
||
---
|
||
|
||
## 🎯 Як працює fallback
|
||
|
||
1. **Спроба cabinet API:**
|
||
```
|
||
GET http://144.76.224.179:8890/api/cabinet/swapper/status
|
||
```
|
||
|
||
2. **Якщо 404 або помилка:**
|
||
```
|
||
GET http://144.76.224.179:8890/status
|
||
```
|
||
|
||
3. **Конвертація даних:**
|
||
- Базовий статус конвертується у формат cabinet API
|
||
- Відображається в UI як звичайний статус
|
||
|
||
---
|
||
|
||
## 📝 Примітки
|
||
|
||
- Fallback працює автоматично
|
||
- Якщо базові endpoints також не працюють - це означає, що Swapper Service не запущений
|
||
- Cabinet API може бути недоступний через помилку в коді або непідключений router
|
||
- Frontend тепер працює з обома варіантами
|
||
|
||
---
|
||
|
||
**Виправлено:** 2025-11-23
|
||
**Статус:** ✅ Готово до використання
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|