На странице проекта отображается «Forbidden» из-за сбоя поиска по имени
Содержание
Описание проблемыКорневая причинаДиагностикаШаг 1. Проверьте логи Harbor CoreШаг 2. Проверьте базу данныхРешениеПримечания о рисках REINDEXОписание проблемы
Для некоторых проектов Harbor в веб-интерфейсе при доступе к репозиториям или другим сведениям о проекте отображается ошибка forbidden. API возвращает 403:
Другие проекты работают нормально. Проблема может проявиться после обновления Harbor.
Корневая причина
Имя проекта, сохраненное в таблице базы данных project, было повреждено (например, из-за невидимых символов или проблем с кодировкой). Когда Harbor запрашивает проект по имени через ORM:
Проверка на равенство не проходит, и запрос не возвращает ни одной строки, хотя запись существует и может быть найдена по project_id. Поскольку поиск проекта завершается неудачей, проверка прав возвращает false, и API отвечает 403 Forbidden вместо фактических данных.
Связанная upstream-проблема: https://github.com/goharbor/harbor/issues/15620
Диагностика
Шаг 1. Проверьте логи Harbor Core
Найдите следующий шаблон ошибки в логах harbor-core:
Полная цепочка логов обычно выглядит так:
Шаг 2. Проверьте базу данных
Подключитесь к базе данных Harbor (registry):
Выполните следующие запросы:
Если первый запрос возвращает проект, а второй — 0 строк, проблема подтверждена.
Решение
В базе данных Harbor (registry) перепишите поле name, используя project_id:
Проверьте исправление:
Обновите веб-интерфейс Harbor, чтобы убедиться, что ошибка 403 устранена.
Примечания о рисках REINDEX
REINDEX TABLE project перестраивает все индексы в таблице project. Это неразрушающая операция (она не изменяет строки данных), однако следует учитывать некоторые риски:
Рекомендации:
- В производственной среде выполняйте операцию в окно обслуживания с низкой нагрузкой, чтобы минимизировать влияние блокировки записи.
- Для таблицы
projectобъем данных обычно очень мал (десятки или сотни строк), поэтому длительность блокировки, как правило, пренебрежимо мала. - Если требуется отсутствие простоя, PostgreSQL 12+ поддерживает
REINDEX TABLE CONCURRENTLY project, который строит новый индекс без установки эксклюзивной блокировки. Однако эта операция занимает больше времени и требует больше дискового пространства.