Files
microdao-daarion/docs/tasks/ASSETS_PROXY_FIX_REPORT.md

5.0 KiB
Raw Blame History

Assets Proxy Fix Report — Фінальний звіт

Дата: 2025-12-02

Проблема

На проді логотипи та банери не завантажувались, хоча:

  • Proxy endpoint працював для GET запитів
  • Файли існували в MinIO
  • Компоненти використовували normalizeAssetUrl

Знайдена причина

HEAD запити повертали 405 Method Not Allowed:

  • Браузер робить HEAD запити перед GET для перевірки доступності зображень
  • City-service endpoint не підтримував HEAD метод
  • Після 405 браузер не завантажував зображення

Виконані виправлення

1. Додано підтримку HEAD методу в city-service

Файл: services/city-service/routes_city.py

Зміни:

  • Додано @router.api_route("/assets/proxy/{path:path}", methods=["GET", "HEAD"])
  • Додано параметр request: Request для визначення методу
  • Для HEAD запитів повертаються тільки заголовки (без тіла)
  • Використовується stat_object для HEAD (більш ефективно)

Код:

@router.api_route("/assets/proxy/{path:path}", methods=["GET", "HEAD"])
async def proxy_asset(path: str, request: Request):
    # ...
    if request.method == 'HEAD':
        return Response(status_code=200, headers={...})
    # For GET, return file data

2. Додано підтримку HEAD методу в Next.js route

Файл: apps/web/src/app/api/assets/[...path]/route.ts

Зміни:

  • Додано export async function HEAD(...)
  • Виправлено proxy URL (використовує правильний city-service endpoint)
  • Для HEAD запитів повертаються тільки заголовки

3. Перебудовано city-service на проді

Команди:

docker compose -f docker-compose.city-space.yml build city-service
docker compose -f docker-compose.city-space.yml up -d --no-deps city-service

Результати тестування

До виправлення:

HEAD /city/assets/proxy/... → 405 Method Not Allowed
GET /city/assets/proxy/... → 200 OK (працював)

Після виправлення:

HEAD /city/assets/proxy/... → 200 OK ✅
GET /city/assets/proxy/... → 200 OK ✅
Content-Type: image/png ✅
Content-Length: 320281 ✅

Перевірка на проді

Тестування:

  1. HEAD запит:

    curl -I "https://daarion.space/api/city/assets/proxy/microdao/logo/2025/12/02/fe36c7d7c26441dc89fa90bf1bafa2df.png"
    # Результат: HTTP/1.1 200 OK, Content-Type: image/png
    
  2. GET запит:

    curl "https://daarion.space/api/city/assets/proxy/microdao/logo/2025/12/02/fe36c7d7c26441dc89fa90bf1bafa2df.png" -o test.png
    file test.png
    # Результат: PNG image data, 512 x 512, 8-bit/color RGB, non-interlaced
    

Статус:

  • HEAD метод працює
  • GET метод працює
  • Правильні заголовки (Content-Type, Content-Length)
  • City-service перебудовано з новим кодом

Інструкція для перевірки в браузері

  1. Відкрийте https://daarion.space/microdao у браузері
  2. Відкрийте DevTools → Network tab
  3. Знайдіть запити до зображень (фільтр: Img)
  4. Перевірте:
    • URL має бути /api/city/assets/proxy/...
    • Status: 200 (для обох HEAD і GET)
    • Content-Type: image/png або image/jpeg
    • Зображення має відображатися

Якщо все ще не працює

  1. Перевірте чи web сервіс має оновлений код:

    # Web сервіс може потребувати перебудови
    docker compose -f docker-compose.web.yml build web
    docker compose -f docker-compose.web.yml up -d --no-deps web
    
  2. Перевірте логи:

    docker logs daarion-city-service | grep "assets/proxy"
    docker logs daarion-web | grep "assets"
    
  3. Перевірте в DevTools:

    • Чи запити йдуть на /api/city/assets/proxy/...?
    • Який статус відповіді?
    • Чи є помилки в Console?

Висновок

Проблема була в відсутності підтримки HEAD методу. Після додавання підтримки HEAD в обох city-service і Next.js route, assets мають завантажуватись правильно в браузері.

Важливо: Якщо web сервіс не перебудовано з новим кодом, потрібно перебудувати його для повної підтримки HEAD методів.