Galleon хранит данные в два слоя:
метаданные (каталог артефактов, пользователи, настройки) — в PostgreSQL,
содержимое артефактов — файлами на диске в каталоге хранилища
(storage.default.local.root).
Устройство каталога хранилища
Корень хранилища содержит:
blobs/— содержимое пакетных форматов. Файл именуется хешем SHA-256 своего содержимого, поэтому одинаковые данные хранятся в одном экземпляре, сколько бы репозиториев и путей на них ни ссылалось.docker/— манифесты и слои образов контейнеров, со своей раскладкой. Слои тоже адресуются по контрольной сумме и разделяются между образами; учёт ведётся в отдельных таблицах той же базы данных.galleon-storage.json— маркер привязки каталога к базе данных. Сервер создаёт его при первом запуске; копируйте его вместе с каталогом.
На чужом или непримонтированном каталоге сервер не стартует: сообщение об ошибке начинается с storage identity: и указывает на причину.
Запись об ассете хранится только в базе данных и указывает на файл в хранилище. На один и тот же файл может ссылаться сколько угодно ассетов из разных репозиториев, поэтому удаление ассета освобождает место только тогда, когда исчезает последняя ссылка на файл. Модель компонентов и ассетов описана в разделе Репозитории и форматы.
Внезапное отключение питания не оставляет наполовину записанных файлов, на которые уже ссылается база данных.
Сборка мусора
Сборка мусора не решает, что устарело: она забирает содержимое, на которое не осталось ссылок. Решение о том, какие компоненты удалить, принимают администратор вручную или политики очистки (Политики очистки).
Артефакт, удалённый из каталога артефактов, не удаляется с диска немедленно: файлы, на которые больше нет ссылок, находит и удаляет фоновая сборка мусора. Она обслуживает оба дерева хранилища одним циклом по одному расписанию. Останавливать загрузки на время цикла не нужно.
Параметры — блок gc конфигурации:
| Ключ | По умолчанию | Назначение |
|---|---|---|
auto | true | Плановые циклы; false отключает только расписание — ручной запуск работает всегда |
interval | 5m | Пауза между плановыми циклами |
grace_period | 24h | Минимальный возраст удалённого содержимого, после которого его место освобождается |
batch_size | 500 | Кандидатов за один запрос сканирования |
max_duration | 15m | Потолок длительности одного цикла; остаток доберёт следующий |
Из-за grace-периода место освобождается не сразу: удалённое содержимое остаётся на диске не меньше grace_period. Это же значение действует и для образов контейнеров.
Наблюдение и ручной запуск
Страница «Настройки» → «Сборка мусора» показывает состояние сборки: идёт ли цикл прямо сейчас, когда был предыдущий («Последний запуск»), чем он закончился («Последний результат» — сводка вида «OK: N objects reclaimed») и когда ожидается следующий.
Кнопка «Запустить» запускает цикл немедленно. Запуск асинхронный: интерфейс подтверждает, что цикл начат, а сам он продолжается в фоне — закрытая страница его не прерывает. Одновременно выполняется только один цикл, повторный запуск отклоняется.
Просмотр страницы требует привилегии nx-tasks-read,
запуск — nx-tasks-run.
Параметры сборки мусора со страницы не меняются — только в конфигурации сервера, с перезапуском.
Пауза на время обслуживания
Кнопка «Приостановить» на той же странице останавливает и плановые циклы, и ручной запуск. Пауза действует ограниченное время: по умолчанию сутки, максимум семь дней. По истечении срока она снимается автоматически, поэтому забытая пауза не остановит освобождение места навсегда. Кнопка «Возобновить» снимает её досрочно. Состояние переживает перезапуск сервера; если серверов несколько, оно общее для всех.
Пауза нужна прежде всего для резервного копирования — подробнее в разделе Резервное копирование. На удаление артефактов пользователями она не влияет: удалить компонент или репозиторий можно и во время паузы, место освободится позже.
Если место закончилось
Переполнение диска проявляется ошибками при загрузке артефактов;
в логе сервера у таких записей в поле err видно no space left on device.
Чтение при этом продолжает работать.
Чтобы освободить место, выполните следующие действия:
- Удалите ненужные артефакты в разделе «Обзор» веб-интерфейса — в первую очередь крупные и устаревшие сборки.
- Запустите сборку мусора кнопкой «Запустить» на странице «Настройки» → «Сборка мусора».
- Если освободилось недостаточно, уменьшите
grace_periodв конфигурации и перезапустите сервер: файлы моложе grace-периода сборка мусора не трогает.
Не удаляйте файлы из каталога хранилища вручную. Имя файла — хеш его содержимого, поэтому по имени нельзя понять, на какой артефакт он ссылается; удалённый по ошибке файл не восстанавливается и не обнаруживается сборкой мусора, а обращения к соответствующему артефакту начнут завершаться ошибкой.