333 lines
7.9 KiB
Markdown
333 lines
7.9 KiB
Markdown
|
|
# 🔴 Решение проблемы 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 <container_name> env | grep MONGODB
|
|||
|
|
|
|||
|
|
# Если PM2
|
|||
|
|
pm2 env <app_name>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **Используйте MongoDB Atlas** (самый простой вариант)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Рекомендация:** Используйте **MongoDB Atlas** для production - это безопасно, надежно и бесплатно для малых проектов!
|
|||
|
|
|
|||
|
|
|