Ловушки, которые стоят дорого

Здесь собрано то, на чём спотыкаются по-настоящему. Не то, что кажется сложным — сложное люди читают внимательно. Дорого стоит как раз то, что выглядит безобидно.

#gated: true не значит «собери и подожди»

Закрытое окружение остаётся пустым
Закрытое окружение остаётся пустым

Название обманывает. Кажется, что это «сделай всё, но не выпускай до подтверждения».

На самом деле для окружения с gated: true сервис не создаёт ничего: ни файла настроек, ни строки в файле версий. Пусто.

Отсюда практическое следствие: не помечайте так окружение, которого ещё нет. Вы просите пропустить единственную работу, которая там есть, и потом удивляетесь, что ничего не появилось. Правильный порядок — построить окружение, убедиться фактом, что оно работает, и только тогда закрывать его от автоматических изменений.

#Имя базы данных запекается один раз

Если вы указали имя базы явно и оно не совпадает с тем, которое сервис вывел бы сам, — считайте, что вы приняли решение с длинными последствиями.

База создаётся один раз, при первом запуске, и имя фиксируется тогда же. Второго раза не будет. Исправление означает удалить кластер базы вместе с томом.

Поэтому: не указывайте имя, которое просто повторяет выводимое — это бесплатно, но бессмысленно. И не указывайте имя, которое ему противоречит, если не понимаете, зачем.

#schemas: [public] уничтожает базу до первого запуска

Выглядит как аккуратность. Работает как мина.

Сервис создаёт схемы командой без проверки «если не существует». Схема public уже есть в любой свежей базе. Значит команда упадёт — а первый запуск бывает один раз. Итог: база, которая никогда не поднимется, и лечение снова через удаление кластера с томом.

Если у вас есть сервис, для которого схема не нужна, живите с лишней пустой схемой. Она дешевле.

#Не перечисленный участник теряет доступ

Повторяю здесь, потому что это единственная ловушка из списка, которая задевает людей, а не машины.

Список участников — полное состояние, а не список изменений. Перед правкой посмотрите, кто в проекте есть, и перенесите всех. Предпросмотр покажет, у кого отберут доступ; этот список стоит читать.

#Осиротевший сервис продолжает работать

Убрали сервис из описания — он никуда не делся. Про него сообщат, и всё.

Ошибка здесь возникает в обратную сторону: человек думает, что выключил сервис, а тот работает. Выключение — отдельная работа.

#Двадцать одно имя, которыми нельзя назвать сервис

backend — самое частое, но не единственное. Запрещены все имена, совпадающие с ключами файла настроек:

image  imagePullSecrets  port  backend  worker  envFrom  datastores  extraEnv
service  persistence  route  autoscaling  topologySpread  nodeSelector
tolerations  affinity  podSecurityContext  securityContext  probes
nameOverride  fullnameOverride

Причина одна для всех: имя сервиса и ключ настроек попадают в одно пространство имён, и под поднимется с образом, имя которого не имя.

Проверка такое имя не пропустит и перечислит весь список в сообщении, так что запоминать его не нужно. Знать полезно другое: у соседних проектов сборка часто называет то же самое именно backend, и человек, сравнивающий два места, решит, что имя поменяли без причины. Причина есть.

Обычный выбор — api и web.

#Справочник полей

Файл проекта

полеформанужно ли
projectстрокада
display_nameстрокада
envs{<имя>: {cluster, namespace, gated}}да
membersсписок {person, role, overrides}да
platforms{gitlab: {group}}если группа названа не как проект
servicesсписок, см. нижеда
datastores{<движок>: {...}}если нужны
seald_project_idчислопочти никогда

Сервис

полеформазаметка
nameстрокане backend
tierbackend \frontend \mobile
stackpython \nodejs \golang \react \flutterопределяет каркас
portчисловыводится сам, указывайте только особенный
datastoresсписок движковдаёт схему на сервис
readsсписокзависимости от других сервисов
workertrue \falseвторой процесс от того же образа
imageстрокавыводится сам
hostnames{<окружение>: [хост]}единственное, что делает сервис публичным
monorepoстрокаесли выводимое имя не подходит
repoстрокаесли у сервиса свой репозиторий
pathsсписок префиксовпрефикс на хосте, не весь хост

Человек в people.yaml

полеформазаметка
ключпочтаопознаёт человека везде
nameстрока
accounts{gitlab: <handle>}взять существующий аккаунт вместо создания нового

Роли: guest, reporter, developer, maintainer, owner.

#Если что-то не сошлось

Сначала страница состояния: catalog.geekstudio.kg/onboarding. Смотрите не только на сделанное, но и на то, что сервис делать отказался — там будет причина, написанная словами.

Если ответа там нет, спросите в чате платформы и приложите ссылку на merge request. Это дешевле, чем править описание наугад: репозиторий управляет доступами, и правка вслепую здесь стоит дороже, чем в обычном коде.