Files
forkmessager/apps/server/src/config.ts
Халимов Рустам 926482861f Внешний TURN
2026-03-11 16:18:56 +03:00

45 lines
2.1 KiB
TypeScript

import dotenv from 'dotenv';
import path from 'path';
import { initEncryption } from './encrypt';
dotenv.config({ path: path.join(__dirname, '../.env') });
if (!process.env.JWT_SECRET) {
if (process.env.NODE_ENV === 'production') {
throw new Error('JWT_SECRET не задан в .env — нельзя запускать в production без секрета!');
}
console.error(' ⚠ JWT_SECRET не задан в .env — используется dev-значение. Укажите безопасный секрет в продакшене!');
}
// Initialise message encryption (AES-256-GCM)
if (process.env.ENCRYPTION_KEY) {
initEncryption(process.env.ENCRYPTION_KEY);
console.log(' 🔒 Шифрование сообщений включено (AES-256-GCM)');
} else {
console.warn(' ⚠ ENCRYPTION_KEY не задан — сообщения хранятся без шифрования. Для продакшена задайте 64-символьный hex-ключ.');
}
export const config = {
port: Number(process.env.PORT) || 3001,
jwtSecret: process.env.JWT_SECRET || 'vortex-dev-fallback-not-for-production',
corsOrigins: process.env.CORS_ORIGINS
? process.env.CORS_ORIGINS.split(',').map(s => s.trim())
: ['http://localhost:5173', 'http://localhost:3000'],
uploadsDir: 'uploads',
/** Minimum password length */
minPasswordLength: 8,
/** Maximum registrations allowed from the same IP (permanent, DB-level) */
maxRegistrationsPerIp: Number(process.env.MAX_REGISTRATIONS_PER_IP) || 2,
/** TURN server URL (e.g. turn:openrelay.metered.ca:80) */
turnUrl: process.env.TURN_URL || '',
/** FOR DYNAMIC AUTH: Shared secret (coturn / metered.ca) */
turnSecret: process.env.TURN_SECRET || '',
/** FOR STATIC AUTH: Username */
turnUsername: process.env.TURN_USERNAME || '',
/** FOR STATIC AUTH: Password */
turnPassword: process.env.TURN_PASSWORD || '',
/** STUN server URLs */
stunUrls: (process.env.STUN_URLS || 'stun:stun.yandex.ru:3478,stun:stun.mail.ru:3478,stun:stun.sipnet.net:3478,stun:stun.l.google.com:19302,stun:stun.voip.aebc.com:3478')
.split(',').map(s => s.trim()).filter(Boolean),
};