Документация: R-17 сделано, Q-19 решён

- R-17: location /_next/hmr во всех dev-блоках nginx, горячая
  перезагрузка держится без переподключений; этап 1a закрыт полностью.
- Q-19: крайние случаи реферального бонуса днями подтверждены (D-025).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
andreypr207andClaude Opus 5.5 committed 2026-10-21 16:11:04 +02:00
1 parent ae9531d5fc
commit 0cad9bae18
6 files changed
+8 -16

No files matched your search

+1 -1
View File
@@ -61,6 +61,7 @@
| Q-09 | Часовой пояс часов поддержки | Московское время | [01-product.md](01-product.md), раздел 11 |
| Q-15 | Защита prod от сессий Claude | Отдельно не нужна: сессии Claude работают под vx_dev без доступа к prod, а под vx_prod нет ни редактора, ни ИИ-агентов | [D-004](decisions/D-004-environments.md) |
| Q-16 | Где принимать почту поддержки | Ящики на внешнем почтовом хостинге, их настраивает пользователь (R-18). На этапе 2 письма из них забирает Chatwoot; до этого на сайте только адрес | [09-infrastructure.md](09-infrastructure.md), раздел 6; [08-integrations.md](08-integrations.md), раздел 4 |
| Q-19 | Реферальный бонус днями: крайние случаи | Приглашённому тоже 30 дней; ключ готовится — дни добавятся при выдаче; «последний ключ» — купленный последним из неистёкших и неотменённых; такого нет — дни ждут следующего ключа; возврат заказа приглашённого бонус не отменяет | [D-025](decisions/D-025-referral-days.md); [04-billing.md](04-billing.md), раздел 11 |
### 4.2 Открытые
@@ -75,4 +76,3 @@
| Q-14 | Куда складывать бэкапы prod-базы | — | 1h |
| Q-17 | Нужны ли разные аккаунты одного провайдера для разных брендов | Пока нет. Если понадобятся — платёжной системе добавим поле «только для сайтов» | 4 |
| Q-18 | Кто запускает выкладку в prod | Пользователь одной командой; по желанию — sudo-правило, разрешающее vx_dev запускать только команду выкладки от имени vx_prod | 1h |
| Q-19 | Реферальный бонус днями: крайние случаи | Приглашённому тоже 30 дней; ключ готовится — дни добавятся при выдаче; «последний ключ» — купленный последним из неистёкших и неотменённых; такого нет — дни ждут следующего ключа; возврат заказа приглашённого бонус не отменяет ([D-025](decisions/D-025-referral-days.md)) | 1g |
-1
View File
@@ -120,7 +120,6 @@
a. Приглашённому — на ключ из заказа, который выполнил условие.
b. Пригласившему — на последний купленный ключ в статусе `provisioning`, `active` или `grace`. Такого нет — дни ждут и добавляются к следующему ключу пригласившего, когда он будет создан.
5. Возврат по заказу приглашённого бонус пригласившего не отменяет; злоупотребления разбирает администратор.
6. Крайние случаи (сколько дней приглашённому, какой ключ пригласившего, возврат) — предложение по Q-19, см. D-025.
## 12. Уведомления
+1 -1
View File
@@ -106,5 +106,5 @@ vx — личный пользователь администратора, к п
| R-14 | 4 | Аккаунты платёжных систем (сначала тестовые), адреса вебхуков | |
| R-15 | 1h | По желанию (Q-18): sudo-правило, разрешающее vx_dev запускать от имени vx_prod только команду выкладки | |
| R-16 | 1h | По желанию: правило nftables — к 127.0.0.1:3000 подключаются только `www-data` (nginx) и vx_prod ([10-security.md](10-security.md), раздел 7) | |
| R-17 | 1a | nginx dev: отдельный `location /_next/hmr` с `proxy_read_timeout 1h` во всех трёх server-блоках dev на 443: `dev.plc.veilix.cc`, сайты и кабинеты, `dev.tg.*`. В Next 16.4 WebSocket горячей перезагрузки — `/_next/hmr`, и сервер может молчать дольше 30 секунд, а `nginx.conf` закрывает соединение после 30 секунд тишины (`proxy_read_timeout 30`) | в работе: сначала в задаче был старый путь `/_next/webpack-hmr`. Блоки с ним в `dev.plc` и `dev.tg.*` не срабатывают — их переименовать; в блоке сайтов и кабинетов блока нет |
| R-17 | 1a | nginx dev: отдельный `location /_next/hmr` с `proxy_read_timeout 1h` во всех трёх server-блоках dev на 443: `dev.plc.veilix.cc`, сайты и кабинеты, `dev.tg.*`. В Next 16.4 WebSocket горячей перезагрузки — `/_next/hmr`, и сервер может молчать дольше 30 секунд, а `nginx.conf` закрывает соединение после 30 секунд тишины (`proxy_read_timeout 30`) | сделано: на всех семи dev-хостах соединение держится 70 секунд без сообщений |
| R-18 | 1h | Почта поддержки (Q-16): ящики `help@veilix.app` и `help@veilixvpn.com` на почтовом хостинге, MX-записи доменов; хостинг — в SPF (раздел 6). До этого письма администраторам и заявки видны только в админке и журнале писем | |
+2 -2
View File
@@ -1,6 +1,6 @@
# D-025. Реферальный бонус — дни срока ключа
Статус: принято, 21.10.2026. Заменяет денежный бонус из макета (Q-02). Крайние случаи — предложение по Q-19.
Статус: принято, 21.10.2026. Заменяет денежный бонус из макета (Q-02); крайние случаи — Q-19.
## Контекст
@@ -14,7 +14,7 @@
4. Условие, проверка самоприглашений и границы сайта прежние ([04-billing.md](../04-billing.md), раздел 11).
5. Начисление — продление без оплаты. Тот же механизм у «Продлить вручную» в админке: запись в коллекции `key-extensions` ([04-billing.md](../04-billing.md), раздел 6.4).
## Крайние случаи (предложение, Q-19)
## Крайние случаи (Q-19)
1. «Месяц» приглашённому — тоже 30 дней: одна настройка на обе стороны.
2. Ключ ещё готовится (`provisioning`) — дни добавятся при выдаче: срок идёт с выдачи.
+3 -6
View File
@@ -1,6 +1,6 @@
# Этап 1a. Фундамент
Статус: готово 21.10.2026. Остался R-17 (root, nginx), см. раздел 6.
Статус: готово 21.10.2026.
## 1. Цель
@@ -40,7 +40,7 @@ Root: R-00…R-06 ([09-infrastructure.md](../09-infrastructure.md), раздел
## 6. Итоги
Проверено curl через nginx и напрямую на 127.0.0.1:3100: пункты 2, 3, 5, 6 и 7, а также HTTPS, `lang`, `data-site`, скрипт темы в `<head>` и токены обоих брендов в CSS. Внешний вид сайтов и кабинета и админку (пункты 1 и 4) проверил пользователь в браузере, первый администратор создан.
Проверено curl через nginx и напрямую на 127.0.0.1:3100: пункты 2, 3, 5, 6 и 7, а также HTTPS, `lang`, `data-site`, скрипт темы в `<head>` и токены обоих брендов в CSS. Внешний вид сайтов и кабинета и админку (пункты 1 и 4) проверил пользователь в браузере, первый администратор создан. Горячая перезагрузка через nginx (R-17): WebSocket `/_next/hmr` на всех dev-хостах держится дольше 30 секунд без сообщений.
Решения и отклонения от плана:
@@ -53,7 +53,4 @@ Root: R-00…R-06 ([09-infrastructure.md](../09-infrastructure.md), раздел
7. Mass в USD — $6.99 и $69.90: сначала временные, утверждены в Q-02.
8. Адаптация макетов: переключатели для 5 языков и валюты, «Политика cookies» в подвале, подписи кабинета mass как у dedicated ([07-frontend.md](../07-frontend.md), раздел 7).
Осталось:
1. R-17 (root): `location /_next/hmr` с большим `proxy_read_timeout` в nginx dev — иначе горячая перезагрузка переподключается после 30 секунд тишины.
2. На этап 1b: серверная отрисовка 404 и 500 ([07-frontend.md](../07-frontend.md), раздел 7.16), цвета карты, пересборка страниц по событию из Payload.
Осталось на этап 1b: серверная отрисовка 404 и 500 ([07-frontend.md](../07-frontend.md), раздел 7.16), цвета карты, пересборка страниц по событию из Payload.
+1 -5
View File
@@ -16,11 +16,7 @@
6. Страница `/referral` по макету: приглашено, начислено месяцев, ожидает; ссылка с копированием; приглашённые с замаскированной почтой. Условия под ссылкой — про дни, а не про списание ([07-frontend.md](../07-frontend.md), раздел 7).
7. Шаблон `referral_reward` на RU и EN; список приглашений в админке.
## 3. Перед стартом
Q-19 — крайние случаи бонуса днями.
## 4. Готово, когда
## 3. Готово, когда
1. A делится ссылкой → B регистрируется → B оплачивает первый заказ → к ключу B и к последнему ключу A добавлено по 30 дней.
2. У A нет подходящего ключа — дни добавляются к следующему ключу A.