nakama/FIX_MONGODB.md

334 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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