# 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 (більш ефективно) **Код:** ```python @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 на проді **Команди:** ```bash 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 запит:** ```bash 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 запит:** ```bash 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 сервіс має оновлений код:** ```bash # Web сервіс може потребувати перебудови docker compose -f docker-compose.web.yml build web docker compose -f docker-compose.web.yml up -d --no-deps web ``` 2. **Перевірте логи:** ```bash 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 методів.