diff --git a/docs/tasks/ASSETS_PROXY_FIX_REPORT.md b/docs/tasks/ASSETS_PROXY_FIX_REPORT.md new file mode 100644 index 00000000..abb699fc --- /dev/null +++ b/docs/tasks/ASSETS_PROXY_FIX_REPORT.md @@ -0,0 +1,134 @@ +# 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 методів. +