Update files

This commit is contained in:
glpshchn 2025-12-09 04:03:25 +03:00
parent a93c95158f
commit 299f872020
7 changed files with 111 additions and 3 deletions

View File

@ -15,6 +15,7 @@ JWT_REFRESH_EXPIRES_IN=604800
# Telegram Bot Configuration
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
MODERATION_BOT_TOKEN=your_moderation_bot_token
MODERATION_BOT_USERNAME=your_moderation_bot_username # Опционально: будет получен через Bot API если не указан
MODERATION_OWNER_USERNAMES=glpshchn00
MODERATION_CHANNEL_USERNAME=@reichenbfurry

View File

@ -26,6 +26,7 @@ module.exports = {
// Telegram
telegramBotToken: process.env.TELEGRAM_BOT_TOKEN,
moderationBotToken: process.env.MODERATION_BOT_TOKEN || process.env.SERVER_MONITOR_BOT_TOKEN || '7604181694:AAGmnpWtR2rknbZreWNoU3PtVWMFJdlwVmc',
moderationBotUsername: process.env.MODERATION_BOT_USERNAME || null, // Будет получен через Bot API если не указан
moderationOwnerUsernames: (process.env.MODERATION_OWNER_USERNAMES || 'glpshchn00')
.split(',')
.map((name) => name.trim().toLowerCase())

View File

@ -2,6 +2,7 @@ const express = require('express');
const router = express.Router();
const crypto = require('crypto');
const bcrypt = require('bcryptjs');
const axios = require('axios');
const User = require('../models/User');
const EmailVerificationCode = require('../models/EmailVerificationCode');
const { sendVerificationCode } = require('../utils/email');
@ -9,6 +10,10 @@ const { signAuthTokens, setAuthCookies, clearAuthCookies, verifyAccessToken } =
const { logSecurityEvent } = require('../middleware/logger');
const { authenticateModeration } = require('../middleware/auth');
const { isEmail } = require('validator');
const config = require('../config');
// Кэш для username бота модерации
let cachedModerationBotUsername = null;
// Rate limiting для авторизации
const rateLimit = require('express-rate-limit');
@ -371,6 +376,52 @@ router.post('/logout', (req, res) => {
res.json({ success: true });
});
// Получить конфигурацию для фронтенда (включая bot username)
router.get('/config', async (req, res) => {
try {
// Если username указан в env - используем его
if (config.moderationBotUsername) {
return res.json({
botUsername: config.moderationBotUsername
});
}
// Если есть кэш - используем его
if (cachedModerationBotUsername) {
return res.json({
botUsername: cachedModerationBotUsername
});
}
// Получить username через Bot API используя MODERATION_BOT_TOKEN
if (config.moderationBotToken) {
try {
const botInfo = await axios.get(`https://api.telegram.org/bot${config.moderationBotToken}/getMe`);
const username = botInfo.data.result?.username;
if (username) {
cachedModerationBotUsername = username;
return res.json({
botUsername: username
});
}
} catch (error) {
console.error('Ошибка получения username бота модерации через Bot API:', error.message);
}
}
// Fallback
res.json({
botUsername: 'moderation_bot'
});
} catch (error) {
console.error('Ошибка получения конфигурации:', error);
res.json({
botUsername: cachedModerationBotUsername || 'moderation_bot'
});
}
});
// Проверка текущей сессии
router.get('/me', async (req, res) => {
try {

View File

@ -102,6 +102,7 @@ services:
- MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}
- MINIO_SECRET_KEY=${MINIO_SECRET_KEY}
- MINIO_BUCKET=${MINIO_BUCKET:-nakama-media}
- MINIO_REGION=${MINIO_REGION:-us-east-1}
networks:
- nakama-network
healthcheck:

View File

@ -12,6 +12,9 @@ dotenv.config({ path: rootEnvPath });
const config = require('../../backend/config');
const { initWebSocket } = require('../../backend/websocket');
const { initMinioClient, checkConnection: checkMinioConnection } = require('../../backend/utils/minio');
const { printMinioConfig } = require('../../backend/utils/minioDebug');
const { log, logSuccess, logError } = require('../../backend/middleware/logger');
// Security middleware
const {
@ -97,6 +100,35 @@ mongoose.connect(config.mongoUri)
mongoose.connection.on('reconnected', () => {
console.log('✅ MongoDB переподключена');
});
// Инициализировать MinIO (опционально)
if (config.minio.enabled) {
try {
log('info', 'Инициализация MinIO для модерации...');
// Вывести конфигурацию и проверки
printMinioConfig();
initMinioClient();
const minioOk = await checkMinioConnection();
if (minioOk) {
logSuccess('MinIO успешно подключен для модерации', {
endpoint: `${config.minio.endpoint}:${config.minio.port}`,
bucket: config.minio.bucket,
ssl: config.minio.useSSL
});
} else {
log('warn', 'MinIO недоступен, используется локальное хранилище');
}
} catch (err) {
logError('MinIO initialization failed for moderation', err, {
endpoint: `${config.minio.endpoint}:${config.minio.port}`
});
log('warn', 'Используется локальное хранилище');
}
} else {
log('info', 'MinIO отключен, используется локальное хранилище');
}
})
.catch(err => {
console.error('❌ Не удалось подключиться к MongoDB:', err);

View File

@ -23,7 +23,8 @@ import {
confirmRemoveAdmin,
getPostComments,
deleteComment,
getApiUrl
getApiUrl,
getModerationConfig
} from './utils/api';
import { io } from 'socket.io-client';
import {
@ -126,6 +127,9 @@ export default function App() {
const [commentsModal, setCommentsModal] = useState(null); // { postId, comments: [] }
const [commentsLoading, setCommentsLoading] = useState(false);
// Конфигурация (bot username)
const [moderationBotUsername, setModerationBotUsername] = useState('moderation_bot');
// Форма авторизации
const [authForm, setAuthForm] = useState({
step: 'login', // 'login', 'register-step1', 'register-step2'
@ -137,6 +141,21 @@ export default function App() {
});
const [authLoading, setAuthLoading] = useState(false);
// Загрузить конфигурацию бота при монтировании
useEffect(() => {
const loadConfig = async () => {
try {
const config = await getModerationConfig();
if (config.botUsername) {
setModerationBotUsername(config.botUsername);
}
} catch (err) {
console.warn('Не удалось загрузить конфигурацию бота:', err);
}
};
loadConfig();
}, []);
useEffect(() => {
let cancelled = false;
@ -280,7 +299,7 @@ export default function App() {
const script = document.createElement('script');
script.async = true;
script.src = 'https://telegram.org/js/telegram-widget.js?22';
script.setAttribute('data-telegram-login', 'NakamaSpaceBot');
script.setAttribute('data-telegram-login', moderationBotUsername);
script.setAttribute('data-size', 'large');
script.setAttribute('data-request-access', 'write');
script.setAttribute('data-onauth', 'onTelegramAuth');
@ -312,7 +331,7 @@ export default function App() {
delete window.onTelegramAuth;
}
};
}, [error, user, loading]);
}, [error, user, loading, moderationBotUsername]);
useEffect(() => {
if (tab === 'users') {

View File

@ -132,6 +132,9 @@ export const logout = () => {
export const getCurrentUser = () =>
api.get('/moderation-auth/me').then((res) => res.data.user)
export const getModerationConfig = () =>
api.get('/moderation-auth/config').then((res) => res.data)
export const verifyAuth = () => api.post('/mod-app/auth/verify').then((res) => res.data.user)
export const fetchUsers = (params = {}) =>