Три вещи в Akash, которые стоили нам денег в один вечер

Аренда закрывается сама, когда кончается депозит, и не присылает уведомления. Пауза не останавливала счёт. Неудачный деплой может оставить оплаченную аренду, о которой никто не знает.

Мы держим чужие агенты на Akash и на этом зарабатываем — раскрываем сразу, потому что дальше это важно. Три вещи ниже стоили нам реальных денег за один вечер, и ни одна не была нигде описана. Каждая цифра — с наших собственных аренд, с dseq, так что с ней можно спорить.

1. Аренда закрывается сама, когда эскроу уходит в минус — и никто не говорит об этом

Агент одного из клиентов пропал. На цепи: аренда 28337339, state: closed, эскроу state: overdrawn, funds: -143 uakt. Ни события, ни колбэка — ничего. В нашей базе агент продолжал числиться running, а на статус-странице горела зелёная точка «Хорошо». Клиент узнал об этом, нажав кнопку, которая ничего не сделала.

Если вы держите чужие поды на Akash — следить за остатком эскроу ваша работа. Push-уведомления нет. Мы теперь опрашиваем баланс сами и оповещаем ниже порога, потому что альтернатива — узнавать об этом от клиента.

2. Пауза не останавливает счёт

У нас была кнопка «Пауза». Она масштабировала под до нуля реплик. В интерфейсе честно (как нам казалось) было написано, что это «останавливает списания». Это неправда. Аренда остаётся открытой, и провайдер списывает эскроу за зарезервированные ресурсы поблочно — работает под или нет.

Механизм виден в коде провайдера: пока аренда открыта, счётчик идёт за зарезервированные ресурсы, сколько бы реплик в ней ни бежало. Поэтому обнуление реплик не экономит ничего. На цепи это выглядит так: аренда 28331717 закрылась по insufficient_funds, эскроу ушёл в overdrawn (−146 uakt). Оговорка ради точности: конкретно этот под в момент исчерпания был запущен, а не на паузе, — он показывает, чем кончается открытая аренда, а не то, что пауза не помогает. Единственное, что реально останавливает счётчик — закрыть аренду; это же возвращает остаток депозита.

Мы переделали паузу так: снимок, затем закрытие аренды; возобновление — новый под и восстановление из снимка. Порядок жёсткий: если снимок не удался, аренда не закрывается.

3. Неудачный деплой может оставить оплаченную аренду

Дважды за вечер вызов /deploy не вернул ответ, а аренда при этом создалась. Наша сторона считала это неудачей и не сохраняла dseq — под существовал, деньги списывались, и ничего в нашей системе на него не указывало.

Причина: у fetch в Node (через undici) таймаут заголовков по умолчанию ровно 300000 мс, а деплой на Akash законно занимает несколько минут — клиент сдавался, пока провайдер продолжал работать. Отдельно нашлась аренда 28370359 в третьем состоянии — active на цепи при пустом leases: [] — где 500000 uakt оказались заблокированы на аренде, которая по факту не сформировалась.

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

Чего мы не знаем

Сколько именно живёт депозит при разных тарифах — не измеряли, зависит от цены провайдера и размера пода. Есть ли у Akash способ подписаться на события эскроу — не нашли, поэтому опрашиваем сами. Всё выше — один провайдер, наш собственный; на чужих поведение может отличаться.