nakama/FIX_MONGODB.md

333 lines
7.9 KiB
Markdown
Raw Normal View History

2025-12-01 00:51:23 +00:00
# 🔴 Решение проблемы 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 - это безопасно, надежно и бесплатно для малых проектов!