# Container Registry (https://docs.h3llo.cloud/registry)

> Приватный реестр Docker-образов и Helm-чартов — создание, логины, push и pull, подключение к Kubernetes.

Container Registry хранит Docker-образы и Helm-чарты (OCI) проекта. Адрес реестра — `cr.h3llo.cloud`.

## Создание реестра [#создание-реестра]

«Создать реестр» → «Новый реестр»:

- **Имя** — 3–30 символов: строчные латинские буквы, цифры, дефис; имя `library` зарезервировано.
- **Объём** — потолок занятого места: 10, 50 или 200 ГБ. Оплачивается фактически занятое место, а не потолок.
- **Размещение** — «Общий».

Полный адрес реестра вида `cr.h3llo.cloud/<префикс>-<имя>` показан в консоли — используйте его в командах ниже.

## Логины [#логины]

Вкладка «Доступ» → «Логины для docker login и Kubernetes». Права:

- **Запись и чтение** — для CI и разработчиков;
- **Только чтение** — для кластеров и серверов.

До 20 логинов на реестр. Пароль показывается один раз; «Сменить пароль» выдаёт новый. Имя логина содержит символ
`$` — берите его в одинарные кавычки.

## Push и pull [#push-и-pull]

```bash
echo "$CR_PASSWORD" | docker login cr.h3llo.cloud -u '<логин>' --password-stdin

docker tag my-app:1.0 <адрес реестра>/my-app:1.0
docker push <адрес реестра>/my-app:1.0
docker pull <адрес реестра>/my-app:1.0
```

Helm-чарты:

```bash
helm registry login cr.h3llo.cloud -u '<логин>'
helm push my-chart-0.1.0.tgz oci://<адрес реестра>
```

### GitLab CI [#gitlab-ci]

```yaml title=".gitlab-ci.yml"
build:
  image: docker:27
  services: [docker:27-dind]
  script:
    - echo "$CR_PASSWORD" | docker login cr.h3llo.cloud -u "$CR_USER" --password-stdin
    - docker build -t "$CR_ADDRESS/my-app:$CI_COMMIT_SHORT_SHA" .
    - docker push "$CR_ADDRESS/my-app:$CI_COMMIT_SHORT_SHA"
```

`CR_USER`, `CR_PASSWORD` и `CR_ADDRESS` задайте в переменных CI/CD (пароль — как masked).

## Kubernetes [#kubernetes]

**В один клик.** На карточке реестра — «Кластеры» → «Подключить к кластеру» (или «Реестры» на карточке кластера).
Платформа создаст логин только для чтения, секрет `h3-cr-<реестр>` в выбранных namespace и добавит его в
`imagePullSecrets` выбранных сервис-аккаунтов. Namespace и сервис-аккаунты должны уже существовать.

**Вручную:**

```bash
kubectl -n <namespace> create secret docker-registry h3-cr-<реестр> \
  --docker-server=cr.h3llo.cloud --docker-username='<логин>' --docker-password='<пароль>'
kubectl -n <namespace> patch serviceaccount default \
  -p '{"imagePullSecrets":[{"name":"h3-cr-<реестр>"}]}'
```

## Настройки реестра [#настройки-реестра]

- правила хранения тегов и неизменяемые теги;
- сканирование образов на уязвимости при загрузке;
- вебхуки (до 10 на реестр) на загрузку, удаление и сканирование.

Образы без тега тоже занимают место. При финансовой блокировке загрузка образов закрывается, скачивание работает.

Оплачиваются занятое место (после дедупликации слоёв) и исходящий трафик — см. [тарифы](https://h3llo.cloud/tariffs).

## Цены [#цены]

Цены Container Registry и что входит в стоимость — в разделе [Цены и тарификация](https://docs.h3llo.cloud/pricing#registry).
