nakama/FIX_MONGODB.md

7.9 KiB
Raw Blame History

🔴 Решение проблемы 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. Создайте кластер

  1. Зайдите на https://www.mongodb.com/cloud/atlas
  2. Создайте бесплатный M0 кластер
  3. Создайте пользователя БД
  4. Добавьте 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 недоступен на этом адресе

Скорее всего:

  1. MongoDB слушает только localhost (127.0.0.1)
  2. Или MongoDB не запущен
  3. Или нужно использовать внутренний IP/hostname

Быстрый чеклист

  • MongoDB запущен? sudo systemctl status mongod
  • Порт 27017 слушается? sudo netstat -tlnp | grep 27017
  • bindIp настроен? Проверьте /etc/mongod.conf
  • Firewall пропускает? sudo ufw status
  • Правильный connection string в .env?
  • Приложение перезапущено после изменений?

🆘 Если ничего не помогло

  1. Покажите вывод:
sudo systemctl status mongod
sudo netstat -tlnp | grep 27017
cat /etc/mongod.conf | grep -A5 "net:"
  1. Проверьте переменные окружения:
# Если Docker
docker exec <container_name> env | grep MONGODB

# Если PM2
pm2 env <app_name>
  1. Используйте MongoDB Atlas (самый простой вариант)

Рекомендация: Используйте MongoDB Atlas для production - это безопасно, надежно и бесплатно для малых проектов!