Singleton mongo client, added mongosh easy enter command, better logging, added idle time to mongo connection

This commit is contained in:
miloszowi 2021-10-13 18:40:24 +02:00
parent ea2fddff40
commit 9c8f5795f8
7 changed files with 45 additions and 24 deletions

View File

@ -22,7 +22,6 @@ services:
- ./docker/config/app.env
volumes:
- ./src:/src
- ./logs:/var/log/bot
ports:
- $APP_EXPOSED_PORT:$APP_INTERNAL_PORT
depends_on:

8
docker/mongosh Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
if [ -f docker/config/app.env ]
then
source docker/config/app.env
fi
docker-compose exec database mongosh --port $MONGODB_PORT --host $MONGODB_HOSTNAME --username $MONGODB_USERNAME --password $MONGODB_PASSWORD --authenticationDatabase admin $MONGODB_DATABASE

5
docker/start Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env bash
docker-compose stop
docker-compose up -d
docker logs -f $(docker-compose ps -q app) &> app.log &

View File

@ -1,4 +1,5 @@
import os
from urllib.parse import quote_plus
from dotenv import load_dotenv
@ -8,10 +9,10 @@ BOT_TOKEN = os.environ['BOT_TOKEN']
WEBHOOK_URL = os.environ['WEBHOOK_URL']
PORT = os.environ['PORT']
MONGODB_DATABASE = os.environ['MONGODB_DATABASE']
MONGODB_USERNAME = os.environ['MONGODB_USERNAME']
MONGODB_PASSWORD = os.environ['MONGODB_PASSWORD']
MONGODB_HOSTNAME = os.environ['MONGODB_HOSTNAME']
MONGODB_PORT = os.environ['MONGODB_PORT']
MONGO_DATABASE = os.environ['MONGODB_DATABASE']
MONGO_CONNECTION_STRING = "mongodb://%s:%s@%s:%s/%s?authSource=admin" % (
os.environ['MONGODB_USERNAME'], quote_plus(os.environ['MONGODB_PASSWORD']),
os.environ['MONGODB_HOSTNAME'], os.environ['MONGODB_PORT'], MONGO_DATABASE
)
BANNED_USERS = os.environ['BANNED_USERS'].split(',') or []

View File

@ -1,25 +1,25 @@
from urllib.parse import quote_plus
from __future__ import annotations
from pymongo import MongoClient
from pymongo.database import Database
from config.envs import (MONGODB_DATABASE, MONGODB_HOSTNAME,
MONGODB_PASSWORD, MONGODB_PORT,
MONGODB_USERNAME)
from config.envs import MONGO_CONNECTION_STRING, MONGO_DATABASE
from decorators.singleton import Singleton
class Client:
class Client(metaclass=Singleton):
mongo_client: MongoClient
database: Database
def __init__(self) -> None:
uri = "mongodb://%s:%s@%s:%s/%s?authSource=admin" % (
MONGODB_USERNAME, quote_plus(MONGODB_PASSWORD),
MONGODB_HOSTNAME, MONGODB_PORT, MONGODB_DATABASE
)
# allow only 10 minutes on idle, close connection after
max_idle_time: int = 10 * (60 * 1000)
self.mongo_client = MongoClient(uri)
self.database = self.mongo_client[MONGODB_DATABASE]
def __init__(self) -> None:
self.mongo_client = MongoClient(
MONGO_CONNECTION_STRING,
connect=False,
maxIdleTimeMS=self.max_idle_time
)
self.database = self.mongo_client[MONGO_DATABASE]
def insert_one(self, collection: str, data: dict) -> None:
self.database.get_collection(collection).insert_one(data)

View File

@ -0,0 +1,8 @@
class Singleton(type):
_instances: dict = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]

View File

@ -14,9 +14,6 @@ class Logger:
main_logger: str = 'main-logger'
main_logger_file: str = '/var/log/bot/app.log'
# noinspection SpellCheckingInspection
formatter: logging.Formatter = logging.Formatter('%(asctime)s[%(levelname)s]: %(message)s')
def __init__(self):
self.configure(self.action_logger, self.action_logger_file, logging.INFO)
self.configure(self.main_logger, self.main_logger_file, logging.ERROR)
@ -27,10 +24,13 @@ class Logger:
os.makedirs(directory)
logger = logging.getLogger(logger_name)
logger.propagate = False
file_handler = logging.FileHandler(log_file, mode='w')
file_handler.setFormatter(self.formatter)
formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s', datefmt='%H:%M:%S %Y/%m/%d')
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(self.formatter)
stream_handler.setFormatter(formatter)
logger.setLevel(level)
logger.addHandler(file_handler)