The checkout form and payment-method lookup were hardcoded to the live
payment router, so any local LMS (next dev included) created real
orders: a stray test click on 20261111 produced order 1794380127.
- resolvePayBase(): NEXT_PUBLIC_PAY_BASE_URL if set, otherwise the live
router for production builds and /dev/pay-stub for everything else.
- /dev/pay-stub/pay/{methods,order}: dev-only stand-ins (404 in
production) that make no outbound calls and store nothing.
- Document in CLAUDE.md that a local `next build && next start` still
hits the live router unless NEXT_PUBLIC_PAY_BASE_URL is set.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
65 lines
3.1 KiB
Bash
65 lines
3.1 KiB
Bash
DATABASE_URL="postgresql://lms_user:password@localhost:5432/lms_db"
|
|
|
|
BETTER_AUTH_SECRET="generate-with: openssl rand -base64 32"
|
|
BETTER_AUTH_URL="http://localhost:3000"
|
|
|
|
RESEND_API_KEY=""
|
|
EMAIL_FROM="noreply@school.second-brain.ru"
|
|
|
|
S3_ENDPOINT="https://nbg1.your-objectstorage.com"
|
|
S3_BUCKET="second-brain-lms"
|
|
S3_ACCESS_KEY=""
|
|
S3_SECRET_KEY=""
|
|
S3_REGION="eu-central"
|
|
|
|
# Cloudflare Turnstile (anti-bot защита на регистрации)
|
|
NEXT_PUBLIC_TURNSTILE_SITE_KEY=""
|
|
TURNSTILE_SECRET_KEY=""
|
|
|
|
# Яндекс.Метрика — ID счётчика school.second-brain.ru (цели signup_free/gate_view).
|
|
# Build-time (NEXT_PUBLIC_*) — передавать через --build-arg при сборке. Сам счётчик
|
|
# (ym init snippet) ставится в admin → Settings → headCode, отдельно от этого ID.
|
|
NEXT_PUBLIC_METRIKA_COUNTER_ID=""
|
|
|
|
# Адрес payment-router для чекаута витрины (/pay/order, /pay/methods). Build-time.
|
|
# Пусто: dev → локальная заглушка /dev/pay-stub, production-сборка → боевой
|
|
# https://obsidian.second-brain.ru. Для локальной `next build && next start`
|
|
# задать явно (например http://localhost:9), иначе форма уйдёт на прод.
|
|
NEXT_PUBLIC_PAY_BASE_URL=""
|
|
|
|
# Kinescope API
|
|
KINESCOPE_API_KEY=""
|
|
|
|
# Internal access-provisioning (payment-router → /api/internal/grant)
|
|
INTERNAL_GRANT_SECRET=""
|
|
|
|
# Freemium: slug бесплатного курса, в который авто-записываем новых юзеров при регистрации
|
|
FREE_COURSE_SLUG=obsidian-start
|
|
|
|
# Freemium quiz funnel (Typebot → /api/internal/quiz-lead)
|
|
QUIZ_LEAD_SECRET=""
|
|
# Listmonk API base — публичный домен (Listmonk живёт на Hetzner, наружу через newsletter.)
|
|
LISTMONK_URL="https://newsletter.second-brain.ru"
|
|
LISTMONK_USER="apiuser"
|
|
LISTMONK_TOKEN=""
|
|
LISTMONK_QUIZ_LIST_ID=""
|
|
# Квиз v2: письмо-результат через LMS (tx-шаблон с ветками по quiz_type); пусто — LMS писем не шлёт
|
|
LISTMONK_QUIZ_TX_TEMPLATE_ID=""
|
|
QUIZ_RESULT_FROM="Second Brain <delivery@mailsend.second-brain.ru>"
|
|
# Защита от ботов: потолок лидов квиза в час (по умолчанию 60)
|
|
QUIZ_LEAD_MAX_PER_HOUR=""
|
|
|
|
# Freemium gate: ID wow-урока (2.6 «ежедневные заметки») — после его завершения
|
|
# показываем лестницу-оффер (трипвайр + полный курс)
|
|
WOW_MOMENT_LESSON_ID="obs-start-l2-006"
|
|
|
|
# Obsidian Toolbox (/tools): "true" — показывать точки входа и роуты (staging);
|
|
# не задано/иное — скрыто, /tools редиректит на /dashboard (prod, пока дорабатываем)
|
|
TOOLBOX_VISIBLE=""
|
|
|
|
# Чистый PDF (browserless на staging/prod; локально — SSH-туннель на staging)
|
|
BROWSER_WS_URL="ws://localhost:3333"
|
|
# Секрет browserless (TOKEN в его env) — на прод/staging генерировать: openssl rand -hex 24
|
|
BROWSERLESS_TOKEN=""
|
|
PDF_MONTHLY_LIMIT="100"
|