# Срок жизни версий и очистка

Сколько живёт сохранённая версия, какие версии платформа бережёт всегда, что происходит с исходниками удалённого сервера и как снимки выглядят в объектном хранилище.

Обзор хранилища и справочник эндпоинтов — [Хранилище исходного кода](/docs/source-storage).

## Срок жизни версий (политика хранения)

После сохранения версия проходит через автоматическую очистку по графику «дед-отец-сын» (Grandfather-Father-Son):

1. **Последние 5 версий** хранятся всегда, независимо от тегов.
2. **Дневная сетка за 14 дней** — одна версия на каждый календарный день (UTC).
3. **Недельная сетка за 4 недели** — одна версия на каждые 7 дней.
4. **Версии с тегом `published` или `manual`** — хранятся бессрочно, никогда не удаляются автоматически.

Для пользовательской очистки на запрос — `POST /v1/apps/:id/sources/cleanup`. Версии с тегами `published` и `manual` исключаются и из неё.

Автоматическая очистка выполняется раз в сутки по расписанию, а не в момент сохранения новой версии или удаления сервера. Версия, попавшая под правила выше, остаётся видимой до ближайшего суточного прогона.

### Версии удалённого сервера

Исходники переживают сервер: после `DELETE /v1/infra/servers/:id` версии остаются на месте и доступны для просмотра и скачивания.

Что происходит с объектами удалённого сервера:

- **Версии сохраняются** — удаление сервера их не трогает. Автоматическая очистка продолжает применять к ним обычную политику хранения, описанную выше.
- **Указатель на последнюю версию снимает суточная очистка** — объект `source/current.<расширение>` остаётся видимым в хранилище до ближайшего прогона. Что это за объект — раздел «Снимки в объектном хранилище» ниже.

Если версии удалённого сервера больше не нужны, уберите их вручную. **Действие необратимо:** восстановить версию через API нельзя, а сохранить новую на удалённом сервере уже не получится — `POST …/sources` отвечает `404`. Скачайте нужное до очистки.

1. Найдите сервер — `GET /v1/infra/servers?includeDeleted=true`. Без этого параметра удалённые серверы в выдачу не попадают.
2. Снимите защитные теги с версий, которые тоже хотите убрать, — `POST /v1/infra/servers/:id/sources/:versionId/tag` с телом `{"tag": "manual", "action": "remove"}`. Эта операция снимает один тег и не трогает остальные метки версии.
3. Очистите историю — `POST /v1/infra/servers/:id/sources/cleanup` с телом `{"keepLatest": 0}`. Эндпоинт работает и на удалённом сервере. Версии, у которых остались теги `manual` или `published`, очистка не трогает.

Удалённые версии сразу перестают учитываться в объёме хранилища, сами байты стираются через 30 суток — см. [Хранилище](/docs/storage).

## Снимки в объектном хранилище

Снимки исходного кода лежат в том же объектном хранилище, что и остальные файлы приложения, и видны в `GET /v1/storage/objects` по префиксу `source/`. Под этим префиксом два вида объектов:

| Ключ | Что это |
|------|---------|
| `source/versions/v<N>-…` | Сохранённая версия. Ей соответствует запись `v<N>` в списке версий. |
| `source/current.<расширение>` | Указатель на последнюю сохранённую версию. Расширение соответствует формату архива последнего сохранения. |

У приложений, которые сохраняли снимки через `POST /v1/apps/:id/sources`, под тем же префиксом лежат `source/manifest.json` — список версий в читаемом виде — и `source/README.md` с описанием содержимого.

Логический ключ `source/current.tar.gz` повторяется: у каждого владельца свой указатель, а физически объекты лежат в разных пространствах имён. Несколько строк с одним и тем же ключом в ответе `GET /v1/storage/objects` означают разных владельцев — серверы или приложения, — а не перезапись одного объекта. Различить их можно по полю `id`.

Снимками управляют операциями с исходниками — удалением версии и массовой очисткой: они адресуют версию по её владельцу. Запрос `DELETE /v1/storage/objects/:key` для снимков не подходит: он ищет строку по логическому ключу среди всех доступных вызывающему ключу, а ключ `source/current.tar.gz` у разных владельцев одинаковый — удалится произвольная из них.

## Смотрите также

- [Хранилище исходного кода](/docs/source-storage)
- [Удаление версий](/docs/source-storage/delete)
- [Теги и комментарии версии](/docs/source-storage/metadata)
- [Хранилище](/docs/storage)
- [Удалить сервер](/docs/infra/servers/delete)
