- Add comprehensive documentation in docs/ASSETS_PROXY.md - Add contract comments in normalizeAssetUrl and proxy_asset - Verify all components use normalizeAssetUrl - Verify ENV variables are correctly set - Add troubleshooting guide
7.7 KiB
TASK_PHASE_ASSETS_PROXY_DEBUG_v2 — MinIO Asset Proxy (логотипи/банери)
Контекст
- MinIO використовується для зберігання assets (логотипи, банери, зображення).
- Раніше доступ йшов через
https://assets.daarion.space/...(NGINX → MinIO). - Було додано proxy в city-service:
- endpoint:
/city/assets/proxy/{path}(далі — Asset Proxy). normalizeAssetUrlперетворюєhttps://assets.daarion.space/daarion-assets/...у/api/city/assets/proxy/....
- endpoint:
- Cursor повідомляв:
- Proxy endpoint працює, локально повертає PNG.
- Компоненти використовують
normalizeAssetUrl.
- На проді фактично:
- логотипи/банери на
daarion.spaceзнову не відображаються, - у браузері видно або «биті» /api-URL, або прямі
assets.daarion.space, які не відкриваються.
- логотипи/банери на
Ціль — зробити так, щоб:
- на проді логотипи/банери стабільно відображалися,
- всі UI-компоненти використовували один механізм нормалізації URL,
- Asset Proxy коректно працював із MinIO в прод-оточенні.
Завдання
1. Перевірити, що саме зараз працює на проді
- Зайти на продовий
daarion.space(через SSH-tunel / curl). - Для декількох сторінок (мікроDAO, ноди, банери):
- подивитись
img.srcу HTML/DevTools, - зафіксувати: чи це
/api/city/assets/proxy/...чиhttps://assets.daarion.space/....
- подивитись
- Якщо хоч один компонент ще використовує сирий URL:
- знайти всі місця у фронті, де рендеряться логотипи/банери (microdao, nodes, dashboards, тощо),
- переконатися, що всюди використовується одна функція
normalizeAssetUrl(або аналогічний helper), - виправити імпорти/використання (ніяких
src={logoUrl}напряму).
2. Перевірити конфіг маршруту Asset Proxy у city-service
-
Знайти в
services/city-service/routes_city.py(або відповідному файлі) endpoint типу:@router.get("/city/assets/proxy/{path:path}")Важливо: має бути
{path:path}, щоб підтримувати вкладені шляхи з/. -
Переконатися, що:
- route справді висить під
/city/assets/proxy/{path}(не/assets/proxyбез/city), - в main-файлі
city-servicerouter змонтовано як/api/city(або відповідно до NGINX/Caddy маршрутизації), - результатом на проді стає саме той шлях, який очікує фронт (наприклад
/api/city/assets/proxy/...).
- route справді висить під
-
Перехрестити це з проксі-конфігом NGINX/Caddy:
/api/city→city-service,- нічого не обрізається/не додається зайве (щоб не вийшло
/api/api/city/...або/city/city/...).
3. Перевірити ENV для доступу до MinIO в Asset Proxy
-
Знайти, які ENV використовує proxy для MinIO (наприклад):
MINIO_PUBLIC_ENDPOINT MINIO_BUCKET MINIO_ASSETS_PREFIX # typ. "daarion-assets" -
Переконатися, що:
- у prod-docker-compose для
city-serviceці ENV присутні й коректні, - в коді proxy шлях будується правильно:
# псевдокод target_url = f"{MINIO_PUBLIC_ENDPOINT}/{MINIO_BUCKET}/{path}"якщо
normalizeAssetUrlвідрізаєdaarion-assets/, то тут це потрібно додати вручну. - у prod-docker-compose для
-
Написати невеликий unit/integration-тест або просто
curlу коді:- викликати Asset Proxy з конкретним шляхом, який точно існує в MinIO (
microdao/logo/...), - переконатися, що код отримує 200 і
Content-Type: image/png.
- викликати Asset Proxy з конкретним шляхом, який точно існує в MinIO (
4. Вирівняти контракт normalizeAssetUrl ↔ Asset Proxy
-
В коді
normalizeAssetUrlявно зафіксувати контракт:- Приклад вхідного URL з БД:
https://assets.daarion.space/daarion-assets/microdao/logo/123.png - Вихідний URL для фронта:
/api/city/assets/proxy/microdao/logo/123.png
- Приклад вхідного URL з БД:
-
В коді proxy за цим шляхом (
microdao/logo/123.png) формувати запит до MinIO:<MINIO_PUBLIC_ENDPOINT>/daarion-assets/microdao/logo/123.png -
Якщо в БД іноді зберігаються шляхи без
daarion-assets/або без домену:- додати обробку в normalizeAssetUrl:
- якщо шлях починається з
https://assets.daarion.space/→ вирізати домен і префікс бакету, - якщо з
/daarion-assets/→ вирізати/daarion-assets/, - якщо просто
microdao/logo/...→ використовувати як є.
- якщо шлях починається з
- додати обробку в normalizeAssetUrl:
-
Додати короткий коментар у коді normalizeAssetUrl і Asset Proxy, щоб наступні зміни не ламали цей контракт.
5. Перевірка на проді
-
Після оновлення
city-serviceіweb(перезбір образів іdocker-compose up -d):- Зайти на основні сторінки з логотипами/банерами:
- список MicroDAO,
- сторінка MicroDAO,
- сторінка нод,
- dashboard, де є банери.
- Зайти на основні сторінки з логотипами/банерами:
-
У DevTools:
- перевірити, що всі картинки ведуть на
/api/city/assets/proxy/..., - статус усіх запитів 200,
Content-Typeвідповідає типу зображення.
- перевірити, що всі картинки ведуть на
-
Зафіксувати в короткому звіті:
- приклади реальних URL (до/після),
- що саме було змінено в коді / docker-конфігах,
- інструкцію, як додавати нові компоненти з логотипами, щоб не обійти
normalizeAssetUrl.
Acceptance Criteria
-
На проді:
- всі логотипи й банери на
daarion.spaceзавантажуються, - немає жодних прямих
https://assets.daarion.space/...у HTML, - всі запити до зображень йдуть через
/api/city/assets/proxy/...і повертають 200.
- всі логотипи й банери на
-
В репозиторії:
- є один централізований helper (
normalizeAssetUrl), який використовують усі компоненти для assets, - Asset Proxy має чіткий контракт з цим helper'ом і коректні ENV для MinIO,
- коротка документація (наприклад, у
docs/ASSETS_DNS_SETUP.mdабо новомуdocs/ASSETS_PROXY.md) описує поточну схему.
- є один централізований helper (
-
Перезапуск сервісів (web + city-service) після змін обов'язково задокументований у звіті Cursor.