Suspend / Resume тенанта: что происходит на самом деле
Что меняется в БД и на VPS клиента при заморозке тенанта, что переживает suspend, как откатить через resume, что попадает в audit_log.
Suspend — это управленческое действие: оператор временно отключает доступ к тенанту, не уничтожая ничего на стороне VPS. Чаще всего используется при просрочке оплаты или жалобах, когда нужно поставить клиента на паузу, но не сносить данные.
Реализация в api/internal/admin/handlers.go (suspend/resume) и api/internal/deployments/transition.go. Каждое такое действие пишется в audit_events.
Что меняется в БД
deployments.status переходит running → suspended (resume — обратно). На уровне Postgres это просто колонка, без записей в job_runs — действие синхронное.
В audit_events пишется entry: action=deploy.suspend (или deploy.resume), entity_type=deployment, entity_id=<uuid>, actor=admin, detail={reason}.
Что меняется на VPS клиента
Сейчас suspend не выключает контейнеры на VPS — данные и БД остаются на месте, домен продолжает резолвиться. Эффект достигается на уровне reverse-proxy/login: cabinet и API-эндпоинты, защищённые middleware deployments.RequireActive, отдают 423 Locked клиенту тенанта.
Это сознательный компромисс: мы не хотим терять состояние ради 30-секундного резюме после оплаты. Если нужен жёсткий cut-off (например, по требованию законодателя), используется отдельный flow — terminate, который добавляется в roadmap.
Что переживает suspend
- База данных тенанта (Postgres на VPS)
- Файлы /opt/app/* и docker-volumes
- Кастомные домены — записи остаются, Caddy продолжает обслуживать /health
- Бэкапы в /opt/backups
- Очередь deploy.update — не ставится новых апдейтов, пока suspended
Resume и почему он быстрый
POST /admin/deployments/<id>/resume — статус возвращается в running, middleware снимает блок, клиент тенанта попадает в кабинет на следующий же запрос. Никаких docker pull, никаких миграций — потому что на VPS ничего не трогали.
Хотите развернуть свой тенант на wl-installer?
Аренда: 5 минут от заказа до боевого URL. Покупка с исходниками: 1–5 рабочих дней.