5.0 KiB
5.0 KiB
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 ✅
Перевірка на проді
Тестування:
-
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 -
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 перебудовано з новим кодом
Інструкція для перевірки в браузері
- Відкрийте
https://daarion.space/microdaoу браузері - Відкрийте DevTools → Network tab
- Знайдіть запити до зображень (фільтр: Img)
- Перевірте:
- URL має бути
/api/city/assets/proxy/... - Status:
200(для обох HEAD і GET) - Content-Type:
image/pngабоimage/jpeg - Зображення має відображатися
- URL має бути
Якщо все ще не працює
-
Перевірте чи web сервіс має оновлений код:
# Web сервіс може потребувати перебудови docker compose -f docker-compose.web.yml build web docker compose -f docker-compose.web.yml up -d --no-deps web -
Перевірте логи:
docker logs daarion-city-service | grep "assets/proxy" docker logs daarion-web | grep "assets" -
Перевірте в DevTools:
- Чи запити йдуть на
/api/city/assets/proxy/...? - Який статус відповіді?
- Чи є помилки в Console?
- Чи запити йдуть на
Висновок
Проблема була в відсутності підтримки HEAD методу. Після додавання підтримки HEAD в обох city-service і Next.js route, assets мають завантажуватись правильно в браузері.
Важливо: Якщо web сервіс не перебудовано з новим кодом, потрібно перебудувати його для повної підтримки HEAD методів.