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

135 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 методів.