Skip to content

# 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 запит: `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. Перевірте:
5. URL має бути `/api/city/assets/proxy/...`
6. Status: `200` (для обох HEAD і GET)
7. Content-Type: `image/png` або `image/jpeg`
8. Зображення має відображатися

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

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:

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

## Висновок

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

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