7.9 KiB
7.9 KiB
🔴 Решение проблемы MongoDB Connection
Проблема
MongoServerSelectionError: connect ECONNREFUSED 103.80.87.247:27017
Сервер не может подключиться к MongoDB на 103.80.87.247:27017.
🔍 Диагностика
1. Подключитесь к серверу
ssh user@103.80.87.247
2. Проверьте, запущен ли MongoDB
# Проверка статуса
sudo systemctl status mongod
# или
sudo systemctl status mongodb
# Если не запущен - запустите
sudo systemctl start mongod
sudo systemctl enable mongod # автозапуск
3. Проверьте порт 27017
# Слушает ли MongoDB порт?
sudo netstat -tlnp | grep 27017
# или
sudo ss -tlnp | grep 27017
# Проверка соединения локально
mongo --eval "db.version()"
# или для новых версий MongoDB
mongosh --eval "db.version()"
4. Проверьте конфигурацию MongoDB
# Откройте конфиг
sudo nano /etc/mongod.conf
# Найдите секцию net:
# net:
# port: 27017
# bindIp: 127.0.0.1 # <-- ПРОБЛЕМА! Слушает только localhost
# Измените на:
# net:
# port: 27017
# bindIp: 0.0.0.0 # Слушать все интерфейсы
5. Перезапустите MongoDB
sudo systemctl restart mongod
# Проверьте снова
sudo netstat -tlnp | grep 27017
✅ Решения
Решение 1: MongoDB на том же сервере (локально)
Если ваше приложение работает на том же сервере (103.80.87.247), используйте localhost:
В Docker (docker-compose.yml)
environment:
- MONGODB_URI=mongodb://localhost:27017/nakama
Или в .env файле
MONGODB_URI=mongodb://localhost:27017/nakama
Если MongoDB в Docker контейнере
# В docker-compose.yml используйте имя сервиса:
MONGODB_URI=mongodb://mongo:27017/nakama
# Где mongo - имя сервиса MongoDB в docker-compose.yml
Решение 2: Настроить MongoDB для удаленного доступа
Если MongoDB на отдельном сервере:
1. Измените конфиг MongoDB
sudo nano /etc/mongod.conf
# /etc/mongod.conf
net:
port: 27017
bindIp: 0.0.0.0 # Слушать все интерфейсы
security:
authorization: enabled # Включить авторизацию!
2. Создайте пользователя
mongosh
use admin
db.createUser({
user: "nakama_admin",
pwd: "СИЛЬНЫЙ_ПАРОЛЬ_ЗДЕСЬ",
roles: [
{ role: "readWrite", db: "nakama" },
{ role: "dbAdmin", db: "nakama" }
]
})
3. Обновите connection string
# В .env или docker-compose.yml
MONGODB_URI=mongodb://nakama_admin:ПАРОЛЬ@103.80.87.247:27017/nakama?authSource=admin
4. Настройте Firewall
# UFW
sudo ufw allow 27017/tcp
sudo ufw reload
# iptables
sudo iptables -A INPUT -p tcp --dport 27017 -j ACCEPT
sudo iptables-save
⚠️ ВАЖНО: Открытый MongoDB без пароля - огромная дыра в безопасности!
Решение 3: Использовать MongoDB Atlas (Рекомендуется) ☁️
Самый безопасный и простой вариант:
1. Создайте кластер
- Зайдите на https://www.mongodb.com/cloud/atlas
- Создайте бесплатный M0 кластер
- Создайте пользователя БД
- Добавьте IP сервера в Network Access (или
0.0.0.0/0для всех)
2. Получите connection string
mongodb+srv://username:password@cluster.mongodb.net/nakama?retryWrites=true&w=majority
3. Обновите конфигурацию
# .env или docker-compose.yml
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/nakama?retryWrites=true&w=majority
4. Перезапустите приложение
docker-compose down
docker-compose up -d
# или
pm2 restart all
✅ Преимущества Atlas:
- Автоматические бэкапы
- Мониторинг
- Безопасность из коробки
- Бесплатный tier (512 MB)
🚀 Быстрое решение (для теста)
Если MongoDB на том же сервере, просто замените IP на localhost:
# Найдите, где запущено приложение (Docker или PM2)
docker ps
# или
pm2 list
# Остановите
docker-compose down
# или
pm2 stop all
# Отредактируйте docker-compose.yml или .env:
nano docker-compose.yml
# Замените:
MONGODB_URI=mongodb://103.80.87.247:27017/nakama
# на:
MONGODB_URI=mongodb://localhost:27017/nakama
# или для Docker:
MONGODB_URI=mongodb://mongo:27017/nakama
# Запустите снова
docker-compose up -d
# или
pm2 start all
# Проверьте логи
docker-compose logs -f backend
# или
pm2 logs
🐳 Docker-compose пример
Если используете Docker Compose:
version: '3.8'
services:
# MongoDB сервис
mongo:
image: mongo:7
restart: always
volumes:
- mongo-data:/data/db
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: secure_password_here
MONGO_INITDB_DATABASE: nakama
# Backend
backend:
build: ./backend
depends_on:
- mongo
environment:
# Используйте имя сервиса 'mongo'
- MONGODB_URI=mongodb://admin:secure_password_here@mongo:27017/nakama?authSource=admin
- PORT=3000
ports:
- "3000:3000"
volumes:
mongo-data:
🔍 Проверка после исправления
# Проверьте логи приложения
docker-compose logs -f backend
# или
pm2 logs
# Должны увидеть:
# ✅ MongoDB подключена
# ✅ Сервер запущен на порту 3000
📊 Текущая конфигурация
Судя по вашим логам:
- Сервер: 103.80.87.247
- MongoDB: пытается подключиться к 103.80.87.247:27017
- Проблема: MongoDB недоступен на этом адресе
Скорее всего:
- MongoDB слушает только localhost (127.0.0.1)
- Или MongoDB не запущен
- Или нужно использовать внутренний IP/hostname
⚡ Быстрый чеклист
- MongoDB запущен?
sudo systemctl status mongod - Порт 27017 слушается?
sudo netstat -tlnp | grep 27017 - bindIp настроен? Проверьте
/etc/mongod.conf - Firewall пропускает?
sudo ufw status - Правильный connection string в .env?
- Приложение перезапущено после изменений?
🆘 Если ничего не помогло
- Покажите вывод:
sudo systemctl status mongod
sudo netstat -tlnp | grep 27017
cat /etc/mongod.conf | grep -A5 "net:"
- Проверьте переменные окружения:
# Если Docker
docker exec <container_name> env | grep MONGODB
# Если PM2
pm2 env <app_name>
- Используйте MongoDB Atlas (самый простой вариант)
Рекомендация: Используйте MongoDB Atlas для production - это безопасно, надежно и бесплатно для малых проектов!