**Newverse** — инвестиционная платформа, перенесённая с WordPress/PHP на Next.js 16 + PostgreSQL.
Около 2250 участников, 5 структур, $4.7 млн в обороте.
Что делает: контракты со сроком и суточной доходностью, реферальная сеть с бинарной матрицей, флеш- и групповые бонусы, экспресс-карты, внутренний токен со стейкингом, пополнения и выводы через криптокошельки, кабинет участника и панель оператора.
Ночные задачи начисляют доход, считают бонусы и двигают циклы по расписанию.
Деньги ведутся неизменяемым журналом операций с проверкой сходимости балансов; около 90 наборов автоматических проверок гоняются по боевому сайту.
**Перенос платформы с WordPress/PHP на Next.js 16 + PostgreSQL**
**Сверка данных.** Сопоставил донорскую базу с клоном по всем участникам, контрактам и кошелькам. Ключом взял внутренний идентификатор, а не почту — по почте возникало фантомное расхождение в 906 тыс. из-за двух счетов с одинаковым адресом. Итог: разница по деньгам −61.52 на 4.7 млн, каждая объяснена. Написал набор скриптов сверки для ежедневного прогона.
**Найденные и устранённые дефекты в расчётах.**
- Флеш-бонус переплачивал $12 300 в день: при сбросе групповых объёмов в точку отсчёта писался остаток вместо сырых значений, и участнику возвращался весь исторический объём.
- Счётчик дней контракта двигался только у оплаченных договоров — за сутки расходилось 1657 записей.
- Суточная ставка считалась от суммы, зафиксированной при заведении договора, которую не поднимало ни одно пополнение. То есть апгрейд депозита не увеличивал доход. Перевёл базу на кошелёк — источник стал один вместо трёх.
- Дозревший экспресс-депозит записывался в поле, которого не читает ни экран, ни расчёт: деньги «зачислялись», но не появлялись нигде. Перевёл на журнал операций, пострадавшему доначислил.
- Ночной пересчёт объёмов ног не существовал вовсе — восстановил по донорской логике.
**Перенесённая функциональность.** Продление контракта (экран участнику + решение оператора, рост срока, списание платы), депозит экспресс-картой, выпуск карты участником, раздел токена со стейкингом, почта с нуля — девять типов писем, сброс пароля.
**Изоляция структур.** Проверка принадлежности стояла в одном месте из четырёх, где деньги меняют владельца: переводы между участниками и погашение чужой карты уходили в любую структуру. Закрыл все пути, покрыл проверками.
**Переезд домена.** DNS, nginx, TLS через Let's Encrypt, почтовый ящик, перенастройка сессий под HTTPS. Отдельно — режим технических работ переключателем на прокси, без остановки приложения: ночные задачи ходят внутрь контейнера напрямую, и остановка означала бы пропущенный цикл начислений.
**Расписание.** Одиннадцать ночных задач в systemd с жёстким порядком: начисление → бонусы от него → сдвиг объёмов → хвост. Порядок важен — при одновременном запуске бонусы считаются от вчерашних чисел. Флаг навёрстывания пропущенных точек намеренно выключен: однажды он поднял всю цепочку внепланово и выплатил $4500 лишнего.
**Проверки.** Около 90 наборов Playwright, гоняющихся по боевому адресу. Каждая правка сопровождается набором, закрепляющим поведение. Несколько раз наборы ловили мои же дефекты до выкатки: съеденный номер карты, несчитающийся счётчик попыток, неверное окно доплаты.
**Восстановление смежного проекта.** На соседнем сервере кончился диск, PostgreSQL зациклился на невозможности записать контрольную точку — платформа лежала несколько часов. Освободил место, поднял базу, добрал пропущенное начисление, поставил еженедельную уборку и сторожа.
**Инфраструктура.** Резервные копии по расписанию, журнал операций с контролем сходимости балансов, доставка распаковкой закоммиченного дерева — без риска затереть рабочие файлы и секреты.
**Честно о незакрытом:** 22 расхождения в объёмах ног — замороженные значения на стороне донора; суточная ставка на обеих сторонах берётся случайной величиной из вилки, поэтому суммы по конкретному участнику совпадать не могут в принципе.
**Платформа работает в продакшене и обслуживает всех участников.**
Домен `newverse.company` переведён на новую версию, старый сайт остался только для чтения и сверки. Около 2250 участников, 5 структур, 4.7 млн долларов в обороте — всё на Next.js 16 и PostgreSQL вместо WordPress/PHP.
**Что это дало по деньгам.** Флеш-бонус перестал переплачивать $12 300 в день — за месяц это порядка 370 тысяч, которые раньше уходили на пустом месте. Контракты, по которым начисления встали из-за незасчитанного дня, снова платят: 22 участника получили своё. Пополнение депозита теперь действительно увеличивает доход — до правки апгрейд не менял ставку вовсе, то есть участник платил и не получал ничего.
**Что это дало по доверию.** Деньги ведутся неизменяемым журналом: запись нельзя удалить или переписать, любое движение видно с причиной и автором. Есть функция, проверяющая сходимость всех балансов с суммой операций — запускается после каждой правки, сейчас расхождений ноль. Когда владелец просит откатить сделанное, откат идёт встречной записью: обе стороны остаются в истории, и через месяц понятно, что произошло и почему.
**Как этим пользуются сегодня.**
- Операторы ведут очереди в панели: пополнения, выводы, верификация, продления контрактов, закрытия. Решения подтверждаются кнопкой, участнику уходит письмо.
- Участники в кабинете видят баланс, контракт с обратным отсчётом, структуру, токены со стейкингом, историю по каждому кошельку. Пополняют переводом или экспресс-картой, выпускают карты сами, переводят внутри своей структуры.
- Ночные задачи считают доход и бонусы по расписанию без участия человека. Резервные копии снимаются ежедневно.
**Изоляция структур уже применяется.** Владелец развивает направления как отдельные бизнесы, и деньги между ними теперь не ходят — ни переводом, ни через карту. Это подготовило площадку к следующему шагу: подключению отдельного домена под новую структуру, оценка по нему уже сделана.
**Учёт доли разработчика** ведётся прямо в панели: считает новые счета с депозитом, умножает на ставку, показывает список. Ставка меняется настройкой, без пересборки.
**Режим технических работ** используется владельцем при обновлениях: платформа закрывается для людей одной командой, начисления при этом идут. Открытие можно поставить на дату — так уже сработало дважды: сайт открылся 3 сентября, выводы 5-го, по таймеру, без ручного вмешательства.
**Что удерживает качество дальше.** Около 90 наборов автоматических проверок гоняются по боевому адресу и покрывают каждую правку. Они уже не раз ловили дефекты до того, как их увидели люди. Главная их ценность в другом: запрет, не покрытый проверкой, живёт до первой правки рядом — а здесь речь о деньгах между разными бизнесами, где тихая дыра означает реальную потерю.
**Что дальше.** Отдельный домен для новой структуры с полной изоляцией — оценено в 35–50 часов, большая часть работы по деньгам уже сделана при закрытии переводов. Из накопленного: ротация логов Docker, вынос резервных копий за пределы сервера, оповещения о недоступности. Последнее не теоретическое — соседний проект уже лежал несколько часов, и заметил это клиент, а не мы.