// Централизованная конфигурация приложения // Важно: dotenv.config() должен быть вызван ДО этого файла module.exports = { // Сервер port: process.env.PORT || 3000, nodeEnv: process.env.NODE_ENV || 'development', // MongoDB mongoUri: process.env.MONGODB_URI || 'mongodb://localhost:27017/nakama', // Redis (опционально) redisUrl: process.env.REDIS_URL || null, // JWT jwtSecret: process.env.JWT_SECRET || 'nakama_secret_key_change_in_production', jwt: { accessSecret: process.env.JWT_ACCESS_SECRET || process.env.JWT_SECRET || 'nakama_access_secret_change_me', refreshSecret: process.env.JWT_REFRESH_SECRET || process.env.JWT_SECRET || 'nakama_refresh_secret_change_me', accessExpiresIn: parseInt(process.env.JWT_ACCESS_EXPIRES_IN || '300', 10), // 5 минут refreshExpiresIn: parseInt(process.env.JWT_REFRESH_EXPIRES_IN || '604800', 10), // 7 дней accessCookieName: process.env.JWT_ACCESS_COOKIE_NAME || 'nakama_access_token', refreshCookieName: process.env.JWT_REFRESH_COOKIE_NAME || 'nakama_refresh_token' }, // Telegram telegramBotToken: process.env.TELEGRAM_BOT_TOKEN, moderationBotToken: process.env.MODERATION_BOT_TOKEN || process.env.SERVER_MONITOR_BOT_TOKEN || '7604181694:AAGmnpWtR2rknbZreWNoU3PtVWMFJdlwVmc', moderationOwnerUsernames: (process.env.MODERATION_OWNER_USERNAMES || 'glpshchn00') .split(',') .map((name) => name.trim().toLowerCase()) .filter(Boolean), moderationChannelUsername: process.env.MODERATION_CHANNEL_USERNAME || '@reichenbfurry', // Gelbooru API gelbooruApiKey: process.env.GELBOORU_API_KEY || '638e2433d451fc02e848811acdafdce08317073c01ed78e38139115c19fe04afa367f736726514ef1337565d4c05b3cbe2c81125c424301e90d29d1f7f4cceff', gelbooruUserId: process.env.GELBOORU_USER_ID || '1844464', // e621 API e621Username: process.env.E621_USERNAME || 'glpshchn00', e621ApiKey: process.env.E621_API_KEY || 'MWYMw57r2Gu6Yxvw1YvepNvZ', // Frontend URL frontendUrl: process.env.FRONTEND_URL || 'http://localhost:5173', // CORS corsOrigin: process.env.CORS_ORIGIN || '*', // Загрузка файлов maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '10485760'), // 10MB uploadsDir: process.env.UPLOADS_DIR || 'uploads', // Rate limiting rateLimits: { general: { windowMs: 15 * 60 * 1000, max: parseInt(process.env.RATE_LIMIT_GENERAL || '100') }, posts: { windowMs: 60 * 60 * 1000, max: parseInt(process.env.RATE_LIMIT_POSTS || '10') }, interactions: { windowMs: 60 * 1000, max: parseInt(process.env.RATE_LIMIT_INTERACTIONS || '20') } }, // Cache TTL (seconds) cacheTTL: { posts: parseInt(process.env.CACHE_TTL_POSTS || '300'), // 5 мин users: parseInt(process.env.CACHE_TTL_USERS || '600'), // 10 мин search: parseInt(process.env.CACHE_TTL_SEARCH || '180') // 3 мин }, // MinIO Configuration minio: { enabled: process.env.MINIO_ENABLED === 'true', endpoint: process.env.MINIO_ENDPOINT || '103.80.87.247', port: parseInt(process.env.MINIO_PORT || '9000', 10), useSSL: process.env.MINIO_USE_SSL === 'true', accessKey: process.env.MINIO_ACCESS_KEY || 'minioadmin', secretKey: process.env.MINIO_SECRET_KEY || 'minioadmin', bucket: process.env.MINIO_BUCKET || 'nakama-media', region: process.env.MINIO_REGION || 'us-east-1', publicUrl: process.env.MINIO_PUBLIC_URL || '', // Кастомный URL (CDN) publicBucket: process.env.MINIO_PUBLIC_BUCKET === 'true' }, // Проверки isDevelopment: () => process.env.NODE_ENV === 'development', isProduction: () => process.env.NODE_ENV === 'production', isTest: () => process.env.NODE_ENV === 'test' };