Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
7784974
docs: добавил документацию platega для нейронок
fUS1ONd Mar 21, 2026
9c6875a
chore: добавил инфу о платежке
fUS1ONd Mar 21, 2026
6f25c16
plan: добавить планы редизайна бота с интеграцией Platega
fUS1ONd Mar 22, 2026
8c7af40
docs: доработать планы редизайна по результатам UX-аудита
fUS1ONd Mar 22, 2026
8cc61b0
plan: добавить план реализации платёжной системы и чеклист деплоя
fUS1ONd Mar 23, 2026
6da7e0b
feat: этап 1 — миграция БД для платёжной системы
fUS1ONd Mar 23, 2026
a379ad7
chore: обновить вызовы CreateUser в тестах под новую сигнатуру
fUS1ONd Mar 23, 2026
203e87b
feat: этап 2 — Platega HTTP-клиент и конфигурация
fUS1ONd Mar 23, 2026
388000f
feat: этап 3 — callback HTTP-сервер
fUS1ONd Mar 23, 2026
cbc2b3e
feat: этап 4 — платёжный флоу и callback-обработка
fUS1ONd Mar 23, 2026
bd0448d
feat: этап 5 — event-driven scheduler
fUS1ONd Mar 23, 2026
caecad7
feat: этап 5 — event-driven scheduler
fUS1ONd Mar 23, 2026
6942b30
feat: этап 6 — UI пользователя с оплатой
fUS1ONd Mar 23, 2026
d5fe29b
feat: этап 7 — UI модератора с заработком
fUS1ONd Mar 23, 2026
d30058c
feat: доработать UI админа и режим обслуживания
fUS1ONd Mar 23, 2026
3c48350
feat: завершить интеграцию платежей
fUS1ONd Mar 23, 2026
0126c17
chore: перевел инструкции для happ
fUS1ONd Mar 23, 2026
a17a822
fix: исправить payment flow Platega и синхронизацию статусов
fUS1ONd Mar 23, 2026
00c4425
fix: добавить короткий background retry активации
fUS1ONd Mar 23, 2026
f8be94e
fix: защитить confirmed_not_activated от scheduler
fUS1ONd Mar 23, 2026
869c4f8
fix: добавить валидацию суммы платежа > 0
fUS1ONd Mar 23, 2026
65a9236
fix: использовать earnings table в статистике админа и исправить форм…
fUS1ONd Mar 23, 2026
3ce6c59
fix: исправить подсчёт grace period в статистике админа
fUS1ONd Mar 23, 2026
b9cfc8e
fix: считать финансовую статистику по всем confirmed-платежам включая…
fUS1ONd Mar 23, 2026
5490529
docs: обновить прогресс исправления финансовой отчётности
fUS1ONd Mar 23, 2026
618dd2f
fix: закрыть основные remediation-исправления платежей
fUS1ONd Mar 23, 2026
5d57c9a
fix: разделить финансовую и live-статистику
fUS1ONd Mar 23, 2026
48fd502
fix: восстановить локальных пользователей при startup reconcile
fUS1ONd Mar 23, 2026
7704370
plan: описать фикс migration gap старых оплат
fUS1ONd Mar 23, 2026
f6927b7
fix: исправить регрессии pending и trial-истории
fUS1ONd Mar 23, 2026
5a1fc89
fix: закрыть migration gap старых оплат и запись targets
fUS1ONd Mar 23, 2026
62f74ca
docs: обновить документацию по конфигу и админскому интерфейсу
fUS1ONd Mar 23, 2026
65a8154
docs: актуализировать чеклист деплоя Platega
fUS1ONd Mar 23, 2026
3ff17f2
docs: обновить план деплоя под fus1ond.ru
fUS1ONd Mar 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,24 @@ REMNAWAVE_DEFAULT_SQUAD_UUIDS=uuid-1,uuid-2 # опционально, UUID inte
# База данных
DB_PATH=/app/data/bot.db

# Донат
DONATE_TEXT=Перевод по СБП: +7 999 000-00-00 (Т-Банк), Константин К.
# Мониторинг
SD_CONFIGS_PATH=/app/sd_configs
VICTORIA_METRICS_URL=http://victoriametrics:8428

# Субтитры (опционально)
RENDER_URL=http://render:8080
RENDER_API_KEY=your_render_api_key_here

# Платежи Platega (опционально)
PLATEGA_MERCHANT_ID=your_platega_merchant_id
PLATEGA_SECRET=your_platega_secret
PLATEGA_CALLBACK_URL=https://your-domain.example.com/platega/callback
CALLBACK_PORT=8080
MIN_SUBSCRIPTION_PRICE=400
PLATEGA_FEE_SBP=11
PLATEGA_FEE_CARD=12
PLATEGA_FEE_CRYPTO=5
PLATEGA_FEE_WITHDRAWAL=2

# Триал
TRIAL_TRAFFIC_LIMIT_GB=1
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Telegram-бот управления VPN на базе [Remnawave](https://remnawave.com)

./docs/platega/README.md содержит информацию по взаимодействию с платежной системой

./docs/api-remnawave2.6.4.json содержит актуальную документацию для всего api панели, используй его, чтобы работать с панелью. Используй поиск по файлу, но не читай его целиком (~4k строк кода, быстро забьется контекст)

./docs/plans/ используется для хранения планов. После создания плана, необходимо документировать его выполнение в новом файле ./docs/progress/ (с соотстветсвующим названием и ссылкой на план для последующей верификации)
Expand Down
51 changes: 37 additions & 14 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Telegram-бот управления VPN на базе [Remnawave](https://remnawave.com)

./docs/platega/README.md содержит информацию по взаимодействию с платежной системой

./docs/api-remnawave2.6.4.json содержит актуальную документацию для всего api панели, используй его, чтобы работать с панелью. Используй поиск по файлу, но не читай его целиком (~4k строк кода, быстро забьется контекст)

./docs/plans/ используется для хранения планов. После создания плана, необходимо документировать его выполнение в новом файле ./docs/progress/ (с соотстветсвующим названием и ссылкой на план для последующей верификации)
Expand All @@ -13,13 +15,19 @@ Telegram-бот управления VPN на базе [Remnawave](https://remna
### Основные компоненты

- **`internal/remnawave/client.go`** — HTTP-клиент Remnawave API
- **`internal/database/users.go`** — таблица users (telegram_id, username, first_name, remnawave_uuid)
- **`internal/database/invites.go`** — таблица invites (система инвайтов с датой активации)
- **`internal/platega/client.go`** — HTTP-клиент Platega
- **`internal/callback/server.go`** — встроенный HTTP-сервер для callback и health-check
- **`internal/database/users.go`** — таблица users (`telegram_id`, `username`, `first_name`, `remnawave_uuid`, `subscription_price`, `moderator_id`)
- **`internal/database/invites.go`** — таблица invites (`code`, `created_by`, `used_by`, `expire_days`, `subscription_price`, `kicked_at`)
- **`internal/database/payments.go`** — таблица payments и логика подтверждения/ретраев платежей
- **`internal/database/earnings.go`** — таблица `moderator_earnings` и расчёт долей модераторов
- **`internal/database/bans.go`** — таблица `banned_users` и проверки перманентных банов
- **`internal/database/notifications.go`** — таблица `notifications_sent` (защита от повторных уведомлений)
- **`internal/bot/handlers.go`** — обработчики сообщений, команд и синхронизация данных пользователей
- **`internal/bot/admin.go`** — админ-панель (инвайты, просмотр кодов, бан, уведомления)
- **`internal/bot/scheduler.go`** — ежедневный scheduler подписок (12:00 MSK): уведомления и автокик
- **`internal/bot/admin.go`** — админ-панель (инвайты, просмотр кодов, бан, уведомления, статистика, режим обслуживания)
- **`internal/bot/payment_handler.go`** — пользовательский flow оплаты и ручная проверка платежей
- **`internal/bot/payment.go`** — callback-активация, retry и расчёт earnings
- **`internal/bot/scheduler.go`** — scheduler подписок и платежей: каждые 30 минут + первый проход при старте
- **`internal/bot/dashboard.go`** — Session Manager и движок live-дашборда мониторинга
- **`internal/bot/dashboard_render.go`** — визуализация дашборда (прогресс-бары, флаги, метрики)
- **`internal/monitoring/`** — пакет мониторинга (MetricsClient, SyncNodes, LoadIndex, Alerter)
Expand All @@ -46,6 +54,18 @@ DB_PATH=/app/data/bot.db
SD_CONFIGS_PATH=/app/sd_configs
VICTORIA_METRICS_URL=http://victoriametrics:8428

# Платежи Platega (опционально; если не заданы — бот работает как раньше)
PLATEGA_MERCHANT_ID=...
PLATEGA_SECRET=...
PLATEGA_CALLBACK_URL=https://vpn.example.com/platega/callback
CALLBACK_PORT=8080
MIN_SUBSCRIPTION_PRICE=400
TRIAL_TRAFFIC_LIMIT_GB=1
PLATEGA_FEE_SBP=11
PLATEGA_FEE_CARD=12
PLATEGA_FEE_CRYPTO=5
PLATEGA_FEE_WITHDRAWAL=2

# Render-сервис субтитров (опционально, кнопка скрыта если не задан)
RENDER_URL=http://render:8080
RENDER_API_KEY=ключ_render_сервиса
Expand Down Expand Up @@ -89,16 +109,19 @@ make logs # Показать логи
## Важные заметки

1. **Рассылка** отправляется только активным пользователям (status=ACTIVE в Remnawave)
2. **Типы инвайтов:** админский — бессрочный (`expire_days=NULL`), модераторский — месячный (`expire_days=30`)
3. **Продление подписки:** модератор продлевает только своих подписчиков на +30 дней, с защитой от раннего продления
4. **Плановый scheduler:** ежедневно в 12:00 MSK отправляет уведомления об истечении и выполняет автокик через 3 дня после истечения
5. **Бан и автокик различаются:** бан пишет в `banned_users` (перманентно), автокик бан не ставит (пользователь может вернуться по новому инвайту)
6. **Сброс трафика** — счётчик `usedTrafficBytes` автоматически сбрасывается Remnawave 1-го числа при стратегии `MONTH`
7. **Сквады** опциональны — если пользователи не видят серверы, создайте internal squads в панели и добавьте UUID в `REMNAWAVE_DEFAULT_SQUAD_UUIDS`
8. **Трафик** — без лимита (`trafficLimitBytes=0`)
9. **Актуализация данных** — при каждом /start бот обновляет username и first_name в БД и синхронизирует username с Remnawave
10. **Удаление кодов** — можно удалять только неиспользованные коды (защита истории активаций)
11. **Субтитры** — опционально, требует запущенный render-сервис. Голосовое → видео с субтитрами, кружок → кружок с субтитрами
2. **Типы инвайтов:** админский — бессрочный (`expire_days=NULL`), модераторский — триал на 72 часа с ценой подписки из инвайта
3. **Платежи Platega опциональны:** без `PLATEGA_MERCHANT_ID` и `PLATEGA_SECRET` бот работает как раньше, callback-сервер не стартует, кнопки оплаты не показываются
4. **Legacy-пользователи:** при `subscription_price = NULL` кнопка оплаты скрыта; scheduler пропускает старые записи без инвайта и цены
5. **Платёжный flow:** callback обрабатывается быстро, долгие retry не держат HTTP-запрос открытым; при сбое активации платёж переходит в `confirmed_not_activated`, а scheduler повторяет активацию без перезаписи исходного `confirmed_at`
6. **Плановый scheduler:** стартует сразу при запуске и далее работает каждые 30 минут; обрабатывает pending/confirmed_not_activated, уведомления, disable и grace kick
7. **Maintenance mode:** скрывает оплату и блокирует disable/автокики, но остальная функциональность бота продолжает работать
8. **Бан и автокик различаются:** бан пишет в `banned_users` (перманентно), автокик бан не ставит (пользователь может вернуться по новому инвайту)
9. **Сброс трафика** — счётчик `usedTrafficBytes` автоматически сбрасывается Remnawave 1-го числа при стратегии `MONTH`
10. **Сквады** опциональны — если пользователи не видят серверы, создайте internal squads в панели и добавьте UUID в `REMNAWAVE_DEFAULT_SQUAD_UUIDS`
11. **Трафик** — без лимита для оплаченных и админских пользователей (`trafficLimitBytes=0`); для триала лимит задаётся через `TRIAL_TRAFFIC_LIMIT_GB`
12. **Актуализация данных** — при каждом /start бот обновляет username и first_name в БД и синхронизирует username с Remnawave
13. **Удаление кодов** — можно удалять только неиспользованные коды (защита истории активаций)
14. **Субтитры** — опционально, требует запущенный render-сервис. Голосовое → видео с субтитрами, кружок → кружок с субтитрами

## Мониторинг нод

Expand Down
Loading
Loading