# 🔴 Решение проблемы MongoDB Connection ## Проблема ``` MongoServerSelectionError: connect ECONNREFUSED 103.80.87.247:27017 ``` Сервер не может подключиться к MongoDB на `103.80.87.247:27017`. --- ## 🔍 Диагностика ### 1. Подключитесь к серверу ```bash ssh user@103.80.87.247 ``` ### 2. Проверьте, запущен ли MongoDB ```bash # Проверка статуса sudo systemctl status mongod # или sudo systemctl status mongodb # Если не запущен - запустите sudo systemctl start mongod sudo systemctl enable mongod # автозапуск ``` ### 3. Проверьте порт 27017 ```bash # Слушает ли MongoDB порт? sudo netstat -tlnp | grep 27017 # или sudo ss -tlnp | grep 27017 # Проверка соединения локально mongo --eval "db.version()" # или для новых версий MongoDB mongosh --eval "db.version()" ``` ### 4. Проверьте конфигурацию MongoDB ```bash # Откройте конфиг 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 ```bash sudo systemctl restart mongod # Проверьте снова sudo netstat -tlnp | grep 27017 ``` --- ## ✅ Решения ### Решение 1: MongoDB на том же сервере (локально) Если ваше приложение **работает на том же сервере** (103.80.87.247), используйте **localhost**: #### В Docker (docker-compose.yml) ```yaml environment: - MONGODB_URI=mongodb://localhost:27017/nakama ``` #### Или в .env файле ```bash MONGODB_URI=mongodb://localhost:27017/nakama ``` #### Если MongoDB в Docker контейнере ```bash # В docker-compose.yml используйте имя сервиса: MONGODB_URI=mongodb://mongo:27017/nakama # Где mongo - имя сервиса MongoDB в docker-compose.yml ``` --- ### Решение 2: Настроить MongoDB для удаленного доступа Если MongoDB на отдельном сервере: #### 1. Измените конфиг MongoDB ```bash sudo nano /etc/mongod.conf ``` ```yaml # /etc/mongod.conf net: port: 27017 bindIp: 0.0.0.0 # Слушать все интерфейсы security: authorization: enabled # Включить авторизацию! ``` #### 2. Создайте пользователя ```bash mongosh ``` ```javascript use admin db.createUser({ user: "nakama_admin", pwd: "СИЛЬНЫЙ_ПАРОЛЬ_ЗДЕСЬ", roles: [ { role: "readWrite", db: "nakama" }, { role: "dbAdmin", db: "nakama" } ] }) ``` #### 3. Обновите connection string ```bash # В .env или docker-compose.yml MONGODB_URI=mongodb://nakama_admin:ПАРОЛЬ@103.80.87.247:27017/nakama?authSource=admin ``` #### 4. Настройте Firewall ```bash # 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. Обновите конфигурацию ```bash # .env или docker-compose.yml MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/nakama?retryWrites=true&w=majority ``` #### 4. Перезапустите приложение ```bash docker-compose down docker-compose up -d # или pm2 restart all ``` ✅ **Преимущества Atlas:** - Автоматические бэкапы - Мониторинг - Безопасность из коробки - Бесплатный tier (512 MB) --- ## 🚀 Быстрое решение (для теста) Если MongoDB **на том же сервере**, просто замените IP на localhost: ```bash # Найдите, где запущено приложение (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: ```yaml 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: ``` --- ## 🔍 Проверка после исправления ```bash # Проверьте логи приложения 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. **Покажите вывод:** ```bash sudo systemctl status mongod sudo netstat -tlnp | grep 27017 cat /etc/mongod.conf | grep -A5 "net:" ``` 2. **Проверьте переменные окружения:** ```bash # Если Docker docker exec env | grep MONGODB # Если PM2 pm2 env ``` 3. **Используйте MongoDB Atlas** (самый простой вариант) --- **Рекомендация:** Используйте **MongoDB Atlas** для production - это безопасно, надежно и бесплатно для малых проектов!