334 lines
7.9 KiB
Markdown
334 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 - это безопасно, надежно и бесплатно для малых проектов!
|
||
|
||
|
||
|