docs: Add assets proxy fix report with HEAD method support
This commit is contained in:
134
docs/tasks/ASSETS_PROXY_FIX_REPORT.md
Normal file
134
docs/tasks/ASSETS_PROXY_FIX_REPORT.md
Normal file
@@ -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 методів.
|
||||
|
||||
Reference in New Issue
Block a user