fix: исправить URL медиа — nginx /media/ проксирует без имени бакета
- vk_parser: убрать bucket из MINIO_PUBLIC_URL (nginx добавляет /news-media/ сам) - admin_system: добавить endpoint POST /repair-media-urls для обновления старых URL в БД - SystemStatus: кнопка «Починить URL медиа» запускает repair endpoint - .env.example: заменить реальные адреса/пароли на плейсхолдеры Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -113,3 +113,60 @@ async def system_status(db: AsyncSession = Depends(get_db), _: str = Depends(req
|
||||
"redis": redis,
|
||||
"minio": minio,
|
||||
}
|
||||
|
||||
|
||||
@router.post("/repair-media-urls")
|
||||
async def repair_media_urls(db: AsyncSession = Depends(get_db), _: str = Depends(require_admin)):
|
||||
"""Заменяет старые MinIO URL на актуальный MINIO_PUBLIC_URL во всех статьях и медиафайлах.
|
||||
|
||||
Системный nginx проксирует /media/ → MinIO bucket /news-media/, поэтому bucket исключается из URL.
|
||||
Старый формат: http://host:port/news-media/object_path
|
||||
Новый формат: MINIO_PUBLIC_URL/object_path (без bucket)
|
||||
|
||||
Запускать один раз после изменения MINIO_PUBLIC_URL в .env.
|
||||
"""
|
||||
new_base = MINIO_PUBLIC_URL.rstrip("/")
|
||||
|
||||
# cover_url: http://host/news-media/path → new_base/path
|
||||
r_cover = await db.execute(text(r"""
|
||||
UPDATE articles
|
||||
SET cover_url = :new_base || '/' ||
|
||||
regexp_replace(cover_url, '^https?://[^/]+(:[0-9]+)?/[^/]+/', '')
|
||||
WHERE cover_url IS NOT NULL
|
||||
AND cover_url LIKE '%/news-media/%'
|
||||
AND cover_url NOT LIKE :prefix
|
||||
RETURNING id
|
||||
"""), {"new_base": new_base, "prefix": new_base + "%"})
|
||||
|
||||
# HTML-контент: src="http://host/news-media/path" → src="new_base/path"
|
||||
r_content = await db.execute(text(r"""
|
||||
UPDATE articles
|
||||
SET content = regexp_replace(
|
||||
content,
|
||||
'https?://[^/]+(:[0-9]+)?/[^/]+/([^"'' ]+)',
|
||||
:new_base || '/\2',
|
||||
'g'
|
||||
)
|
||||
WHERE content LIKE '%/news-media/%'
|
||||
AND content NOT LIKE :prefix
|
||||
RETURNING id
|
||||
"""), {"new_base": new_base, "prefix": "%" + new_base + "%"})
|
||||
|
||||
# media.url
|
||||
r_media = await db.execute(text(r"""
|
||||
UPDATE media
|
||||
SET url = :new_base || '/' ||
|
||||
regexp_replace(url, '^https?://[^/]+(:[0-9]+)?/[^/]+/', '')
|
||||
WHERE url LIKE '%/news-media/%'
|
||||
AND url NOT LIKE :prefix
|
||||
RETURNING id
|
||||
"""), {"new_base": new_base, "prefix": new_base + "%"})
|
||||
|
||||
await db.commit()
|
||||
|
||||
return {
|
||||
"new_base": new_base,
|
||||
"cover_url_fixed": r_cover.rowcount,
|
||||
"content_fixed": r_content.rowcount,
|
||||
"media_fixed": r_media.rowcount,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user