🔧 Исправление: DB конфигурация через ENV для локальной разработки

**Проблема:**
- Реферальные API падали в dev режиме из-за хардкода DB подключения
- Невозможно было запустить на локальном сервере без доступа к production БД

**Решение:**
- Вынесены DB credentials в ENV переменные:
  - DB_HOST, DB_USER, DB_PASSWORD, DB_NAME
- Добавлена проверка isDbConfigured в API endpoints
- Mock ответы для dev режима (когда DB не настроена)

**Изменения:**
- .env.example: добавлены DB переменные
- .env.local: пустые DB переменные (dev mode)
- /api/referral/track: graceful fallback без DB
- /api/referral/stats: mock данные без DB

**Результат:**
-  Dev сервер работает без production DB
-  Production будет использовать DB из ENV
-  Логи предупреждают о dev режиме
-  Реферальная система опциональна для разработки
This commit is contained in:
Umbrix Dev
2026-02-06 21:17:18 +03:00
parent b43eb3c724
commit 3a70364eef
3 changed files with 48 additions and 10 deletions

View File

@@ -21,3 +21,10 @@ NEXT_PUBLIC_TRIAL_DAYS=7
# Pricing (in cents for precision)
NEXT_PUBLIC_MIN_PRICE=9900
NEXT_PUBLIC_CURRENCY=₽
# Database Configuration (for referral system)
# Leave empty to disable referral DB tracking (dev mode)
DB_HOST=193.168.175.128
DB_USER=marzban_user
DB_PASSWORD=2CuopqFd0Y5V5n/qBM+eygOQb6aC8B8pACcdHjeVJsE=
DB_NAME=marzban_prod

View File

@@ -4,14 +4,17 @@
import { NextRequest, NextResponse } from 'next/server';
import mysql from 'mysql2/promise';
// Database connection config
// Database connection config from ENV
const dbConfig = {
host: '193.168.175.128',
user: 'marzban_user',
password: '2CuopqFd0Y5V5n/qBM+eygOQb6aC8B8pACcdHjeVJsE=',
database: 'marzban_prod',
host: process.env.DB_HOST || '',
user: process.env.DB_USER || '',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || '',
};
// Check if DB is configured
const isDbConfigured = dbConfig.host && dbConfig.user && dbConfig.database;
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
@@ -24,6 +27,21 @@ export async function GET(request: NextRequest) {
);
}
// Return mock data if DB not configured (dev mode)
if (!isDbConfigured) {
console.log('⚠️ Referral stats skipped: DB not configured');
return NextResponse.json({
success: true,
hasReferrals: false,
dev_mode: true,
stats: {
referral_count: 0,
bonus_days_earned: 0,
total_referrals_used: 0,
},
});
}
// Connect to database
const connection = await mysql.createConnection(dbConfig);

View File

@@ -4,14 +4,17 @@
import { NextRequest, NextResponse } from 'next/server';
import mysql from 'mysql2/promise';
// Database connection config
// Database connection config from ENV
const dbConfig = {
host: '193.168.175.128',
user: 'marzban_user',
password: '2CuopqFd0Y5V5n/qBM+eygOQb6aC8B8pACcdHjeVJsE=',
database: 'marzban_prod',
host: process.env.DB_HOST || '',
user: process.env.DB_USER || '',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || '',
};
// Check if DB is configured
const isDbConfigured = dbConfig.host && dbConfig.user && dbConfig.database;
export async function POST(request: NextRequest) {
try {
const body = await request.json();
@@ -24,6 +27,16 @@ export async function POST(request: NextRequest) {
);
}
// Return mock success if DB not configured (dev mode)
if (!isDbConfigured) {
console.log('⚠️ Referral tracking skipped: DB not configured');
return NextResponse.json({
success: true,
message: 'Referral tracking disabled (dev mode)',
dev_mode: true,
});
}
// Connect to database
const connection = await mysql.createConnection(dbConfig);