MongoDB as a Service

Этот проект предоставляет универсальное решение для подключения к MongoDB сервису, как локально для разработки, так и удаленно в продакшене.

Структура проекта

mongo_service/
├── docker-compose.yml          # Docker Compose конфигурация MongoDB
├── mongo-init/                 # Скрипты инициализации MongoDB
│   └── init-mongo.js          # Скрипт создания пользователей и баз
├── mongo_service/              # Основной модуль
│   ├── __init__.py
│   ├── config.py               # Конфигурация подключения
│   ├── mongo_connection.py     # Основной модуль подключения
│   └── fastapi_integration.py  # Интеграция с FastAPI
├── tests/                      # Тесты
│   ├── __init__.py
│   ├── test_config.py
│   └── test_mongo_connection.py
├── secured_mongo_connection.py # Безопасная версия модуля подключения
├── performance_optimizer.py    # Модуль оптимизации производительности
├── secured_example_fastapi_app.py # Пример FastAPI с улучшенной безопасностью
├── vim_integration.py          # Интеграция с vi/vim редакторами
├── ANALYSIS.md                # Анализ проекта и рекомендации
├── requirements.txt
├── requirements-dev.txt
└── README.md

Запуск MongoDB локально (для разработки)

  1. Убедитесь, что Docker и Docker Compose установлены
  2. Запустите MongoDB сервис:
docker-compose up -d

MongoDB будет доступна на localhost:27017 для локальной разработки.

Использование в проекте

Простое подключение:

from mongo_service.mongo_connection import MongoConnection, MongoService

# Создаем подключение
connection = MongoConnection(
    host='localhost',
    port=27017,
    username='project1_user',
    password='project1_pass',
    database='project1_db'
)

# Подключаемся к MongoDB
if await connection.connect():
    # Создаем сервис для работы с коллекциями
    service = MongoService(connection)
    
    # Выполняем операции
    doc_id = await service.insert_one("my_collection", {
        "name": "example",
        "value": 123
    })
    
    if doc_id:
        print(f"Документ вставлен с ID: {doc_id}")
    
    # Закрываем подключение
    await connection.disconnect()

Использование через переменные окружения:

from mongo_service.mongo_connection import create_mongo_connection_from_env
from mongo_service.mongo_connection import MongoService

# Создаем подключение из переменных окружения
connection = await create_mongo_connection_from_env()
if await connection.connect():
    service = MongoService(connection)

    # Работа с коллекциями...

    await connection.disconnect()

ВАЖНО: Пользователи MongoDB создаются в соответствующих базах данных, а не в admin базе. Для аутентификации используйте authSource, совпадающий с базой данных пользователя:

Использование с конфигурацией:

from mongo_service.config import ProjectConfig
from mongo_service.mongo_connection import MongoConnection, MongoService

# Для проекта с именем 'my_project'
project_config = ProjectConfig('my_project')

# Получаем конфигурацию
config = project_config.get_config()

# Создаем подключение
connection = MongoConnection(
    host=config.host,
    port=config.port,
    username=config.username,
    password=config.password,
    database=config.database
)

# Подключаемся и работаем...

Переменные окружения

Общие:

Для конкретного проекта (например, my_project):

Для удаленного доступа:

Интеграция с FastAPI

from fastapi import FastAPI, Depends
from mongo_service.fastapi_integration import get_mongo_lifespan, get_mongo_service
from mongo_service.mongo_connection import MongoService

app = FastAPI(lifespan=get_mongo_lifespan(app))

@app.get("/items")
async def get_items(mongo_service: MongoService = Depends(get_mongo_service)):
    items = await mongo_service.find_many("items", {})
    return {"items": items}

ВАЖНО: Убедитесь, что переменные окружения установлены правильно, особенно MONGO_AUTH_SOURCE, который должен совпадать с базой данных пользователя:

Запуск тестов

# Активировать виртуальное окружение
source venv/bin/activate

# Запустить все тесты
python -m pytest tests/

# Запустить тесты с детальным выводом
python -m pytest tests/ -v

Интеграция с vi/vim (vi-mongo)

Для работы с MongoDB из vi/vim редакторов, проект предоставляет специальный модуль интеграции:

Подключение из vi/vim

  1. В командном режиме vi/vim можно выполнить Python скрипт:
    :!python vim_integration.py connect
    
  2. Для выполнения команд MongoDB:
    :!python vim_integration.py find_one my_collection '{"name": "test"}'
    :!python vim_integration.py find_many my_collection '{"status": "active"}'
    :!python vim_integration.py insert_one my_collection '{"name": "new_item", "value": 123}'
    
  3. С использованием конкретного проекта:
    :!python vim_integration.py connect project1
    

Прямые команды MongoDB (альтернативный подход)

Также можно использовать прямые команды MongoDB из vi/vim:

:!mongo --host localhost --port 27017 -u project1_user -p project1_pass --authenticationDatabase project1_db

Или если установлен mongosh:

:!mongosh "mongodb://project1_user:project1_pass@localhost:27017/project1_db?authSource=project1_db"

ВАЖНО: Для правильной аутентификации используйте authSource, совпадающий с базой данных пользователя:

Каждый проект со своей базой данных

MongoDB инициализируется с несколькими базами данных для разных проектов:

Каждая база данных имеет своего пользователя с соответствующими правами доступа.

Улучшения безопасности

Проект включает в себя несколько улучшений безопасности:

  1. Убрано отображение URI подключения в консоль
  2. Добавлена валидация входных данных и ObjectID
  3. Реализована очистка входных данных от потенциально опасного содержимого
  4. Добавлена проверка формата MongoDB URI
  5. Улучшена обработка ошибок и логирование

Для использования безопасной версии подключения:

from secured_mongo_connection import MongoConnection, MongoService

# Использование аналогично основному модулю, но с улучшенной безопасностью
connection = await create_mongo_connection_from_env()  # из secured_mongo_connection

Улучшения производительности

Проект включает модуль оптимизации производительности:

  1. Пул соединений для эффективного использования ресурсов
  2. Кэширование часто запрашиваемых данных
  3. Пакетная обработка операций
  4. Оптимизированные методы для массовых операций

Пример использования:

from performance_optimizer import CachedMongoService, ConnectionPool, PerformanceOptimizer

# Использование сервиса с кэшированием
cached_service = CachedMongoService(connection, cache_ttl=300)

# Использование пула соединений
pool_config = ConnectionPoolConfig(min_connections=2, max_connections=10)
pool = ConnectionPool(connection_config, pool_config)

Удаленный доступ

Для удаленного доступа используйте:

  1. Установите переменную MONGO_URI или MONGO_REMOTE_URI с полным URI подключения
  2. Подключение будет использовать удаленный MongoDB сервис вместо локового