Skip to content

Manual Test Plan — Assets Proxy Debugging

Контекст

Після виправлення HEAD методу в city-service, логотипи та банери все ще не відображаються на фронті. Потрібно перевірити:

  1. Які URL генерує фронт
  2. Що реально повертає Next.js route
  3. Чи web-сервіс оновлений до останнього коду

Крок 1: Перевірка реальних запитів в браузері

1.1 Відкрити DevTools

  1. Відкрити https://daarion.space/microdao у браузері
  2. Відкрити DevTools (F12 або Cmd+Option+I)
  3. Перейти на вкладку Network
  4. Фільтр: Img (або All + фільтр за назвою банера/логотипа)

1.2 Знайти "биті" зображення

  1. Знайти запити до зображень, які не завантажились (червоний статус або placeholder)
  2. Клікнути по одному з них
  3. Перевірити:
  4. Request URL (повний шлях)
  5. Status (200/404/500/...)
  6. Response headersContent-Type, Content-Length

1.3 Аналіз URL

Якщо URL виглядає як /_next/image?url=...

→ Використовується Next <Image> з оптимізацією

Рішення: - Або виставити unoptimized на компоненті - Або налаштувати next.config.ts (domains) та переконатися, що url вказує на /api/city/assets/proxy/...

Якщо URL виглядає як /api/city/assets/proxy/...

→ Це правильний шлях через proxy

Далі: 1. Відкрити цей URL у новій вкладці браузера 2. Перевірити: - Якщо картинка відкривається → проблема в Next <Image> / верстці - Якщо не відкривається (404/500 або HTML-сторінка) → проблема в шляху або в проміжному Next route

Крок 2: Перевірка оновлення web-сервісу

2.1 Перебудувати web-сервіс

На сервері (там де docker-compose):

cd /opt/microdao-daarion
git pull
docker compose -f docker-compose.web.yml build web
docker compose -f docker-compose.web.yml up -d --no-deps web

2.2 Hard refresh в браузері

Після перебудови:

  1. Відкрити https://daarion.space/microdao
  2. Зробити hard refresh:
  3. Windows/Linux: Ctrl+Shift+R
  4. Mac: Cmd+Shift+R

Крок 3: Перевірка шляху в proxy

3.1 Скопіювати точний path

З Network tab в DevTools:

  1. Знайти запит до /api/city/assets/proxy/...
  2. Скопіювати точний path після /api/city/assets/proxy/

Наприклад: microdao/banner/xyz.png

3.2 Перевірка через city-service

На сервері (там де city-service):

# Перевірка через city-service (внутрішній Docker network)
docker exec daarion-city-service curl -i "http://localhost:7001/city/assets/proxy/microdao/banner/xyz.png"

3.3 Перевірка напряму у MinIO

# Перевірка напряму у MinIO (якщо є NGINX/MinIO url)
curl -I "https://assets.daarion.space/daarion-assets/microdao/banner/xyz.png"

3.4 Аналіз результатів

  • Якщо другий запит (на MinIO) 200, а перший ні → проблема в:
  • normalizeAssetUrl неправильно обрізає/додає daarion-assets/
  • Next route/NGINX "з'їдає" частину шляху

Примітка: Банери часто лежать в іншому префіксі, ніж логотипи, тому: - Для логотипів normalizeAssetUrl може працювати (структура шляху співпала) - Для банерів — ні (інший префікс, додатковий каталог, інший формат збереження в БД)

Крок 4: Перевірка логів

4.1 Логи city-service

docker logs daarion-city-service | grep "assets/proxy"

Перевірити: - Чи є запити на /city/assets/proxy/... - Який статус (200/404/500) - Чи є помилки

4.2 Логи web-сервісу

docker logs daarion-web | grep -E "assets|proxy|image"

Перевірити: - Чи є запити на /api/city/assets/proxy/... - Чи є помилки в Next.js route

Крок 5: Перевірка normalizeAssetUrl

5.1 Перевірка вхідних даних з БД

# Отримати URL з БД для конкретного MicroDAO
curl -s "https://daarion.space/api/city/microdao/daarion" | jq '{logo_url, banner_url}'

5.2 Перевірка нормалізації

В браузері (Console в DevTools):

// Тест normalizeAssetUrl
const testUrl = "https://assets.daarion.space/daarion-assets/microdao/logo/2025/12/02/abc123.png";
// Очікуваний результат: "/api/city/assets/proxy/microdao/logo/2025/12/02/abc123.png"

Очікувані результати

✅ Успішний сценарій

  1. Network tab:
  2. URL: /api/city/assets/proxy/microdao/logo/2025/12/02/abc123.png
  3. Status: 200 OK
  4. Content-Type: image/png
  5. Зображення відображається

  6. Логи city-service: INFO: "GET /city/assets/proxy/microdao/logo/2025/12/02/abc123.png HTTP/1.1" 200 OK

  7. Прямий доступ до URL:

  8. Відкривається зображення в новій вкладці

❌ Проблемні сценарії

Сценарій 1: 404 Not Found

Симптоми: - Status: 404 - Response: Asset not found

Можливі причини: - Файл не існує в MinIO - Неправильний path (зайвий/відсутній префікс daarion-assets/) - Неправильна нормалізація URL

Рішення: - Перевірити чи файл існує в MinIO - Перевірити normalizeAssetUrl контракт - Перевірити шлях в БД

Сценарій 2: 405 Method Not Allowed

Симптоми: - Status: 405 - Response: Method Not Allowed

Можливі причини: - HEAD метод не підтримується (має бути виправлено) - Next.js route не має HEAD handler

Рішення: - Перевірити чи city-service має оновлений код - Перевірити чи Next.js route має HEAD handler

Сценарій 3: 500 Internal Server Error

Симптоми: - Status: 500 - Response: Internal Server Error

Можливі причини: - Помилка в city-service при доступі до MinIO - Неправильні ENV змінні (MINIO_ENDPOINT, MINIO_ACCESS_KEY, тощо)

Рішення: - Перевірити логи city-service - Перевірити ENV змінні в docker-compose

Сценарій 4: Зображення не відображається, але статус 200

Симптоми: - Status: 200 OK - Content-Type правильний - Але зображення не відображається

Можливі причини: - Next <Image> з оптимізацією блокує - CSS/верстка приховує зображення - CORS проблема

Рішення: - Перевірити чи використовується <img> або <Image> - Перевірити CSS стилі - Перевірити CORS headers

Чек-лист для швидкої перевірки

  • [ ] Web-сервіс перебудовано з останнім кодом
  • [ ] Hard refresh в браузері виконано
  • [ ] Network tab показує запити на /api/city/assets/proxy/...
  • [ ] Статус запитів: 200 OK
  • [ ] Content-Type: image/png або image/jpeg
  • [ ] Прямий доступ до URL відкриває зображення
  • [ ] Логи city-service показують успішні запити
  • [ ] normalizeAssetUrl правильно конвертує URL з БД

Наступні кроки після тестування

  1. Зафіксувати результати тестування
  2. Якщо є проблеми — зібрати:
  3. Точні URL з Network tab
  4. Логи city-service та web-сервісу
  5. Приклади URL з БД
  6. Передати інформацію для подальшого виправлення