1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 22:23:13 +00:00

Merge pull request #7 from wlinator/deployment-refactor

Refactor development and production compose
This commit is contained in:
wlinator 2024-07-19 16:26:19 -04:00
commit 8b277edd17
7 changed files with 96 additions and 33 deletions

1
.gitignore vendored
View file

@ -3,6 +3,7 @@ venv/
__pycache__/
.run/
.vscode/
data/
*.db
.env

View file

@ -10,6 +10,7 @@ import services.config_service
import services.help_service
from lib.constants import CONST
from services.blacklist_service import BlacklistUserService
from db.database import run_migrations
# Remove the default logger configuration
logger.remove()
@ -42,9 +43,7 @@ client = Client.LumiBot(
@client.check
async def blacklist_check(ctx):
if BlacklistUserService.is_user_blacklisted(ctx.author.id):
return False
return True
return not BlacklistUserService.is_user_blacklisted(ctx.author.id)
def load_modules():
@ -87,6 +86,9 @@ if __name__ == "__main__":
logger.info("LUMI IS BOOTING")
# Run database migrations
run_migrations()
# cache all JSON
[
config.parser.JsonCache.read_json(file[:-5])

View file

@ -1,8 +1,5 @@
import json
import yaml
from loguru import logger
class JsonCache:
_cache = {}
@ -13,21 +10,5 @@ class JsonCache:
if path not in JsonCache._cache:
with open(f"config/JSON/{path}.json") as file:
JsonCache._cache[path] = json.load(file)
logger.debug(f"{path}.json was loaded and cached.")
return JsonCache._cache[path]
class YamlCache:
_cache = {}
@staticmethod
def read_credentialsl():
"""Read and cache the creds.yaml data if not already cached."""
path = "creds"
if path not in YamlCache._cache:
with open(f"{path}.yaml") as file:
YamlCache._cache[path] = yaml.safe_load(file)
logger.debug(f"{path}.yaml was loaded and cached.")
return YamlCache._cache[path]

View file

@ -1,6 +1,8 @@
import mysql.connector
from loguru import logger
from mysql.connector import pooling
import os
import re
from lib.constants import CONST
@ -47,3 +49,58 @@ def select_query_one(query, values=None):
cursor.execute(query, values)
output = cursor.fetchone()
return output[0] if output else None
def run_migrations():
migrations_dir = "db/migrations"
migration_files = sorted(
[f for f in os.listdir(migrations_dir) if f.endswith(".sql")],
)
with _cnxpool.get_connection() as conn:
with conn.cursor() as cursor:
# Create migrations table if it doesn't exist
cursor.execute("""
CREATE TABLE IF NOT EXISTS migrations (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255) NOT NULL,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
for migration_file in migration_files:
# Check if migration has already been applied
cursor.execute(
"SELECT COUNT(*) FROM migrations WHERE filename = %s",
(migration_file,),
)
if cursor.fetchone()[0] > 0:
logger.debug(
f"Migration {migration_file} already applied, skipping.",
)
continue
# Read and execute migration file
with open(os.path.join(migrations_dir, migration_file)) as f:
migration_sql = f.read()
try:
# Split the migration file into individual statements
statements = re.split(r";\s*$", migration_sql, flags=re.MULTILINE)
for statement in statements:
if statement.strip():
cursor.execute(statement)
# Record successful migration
cursor.execute(
"INSERT INTO migrations (filename) VALUES (%s)",
(migration_file,),
)
conn.commit()
logger.debug(f"Successfully applied migration: {migration_file}")
except mysql.connector.Error as e:
conn.rollback()
logger.error(f"Error applying migration {migration_file}: {e}")
raise
logger.debug("All migrations completed.")

View file

@ -3,6 +3,9 @@ services:
build: .
container_name: lumi-core
restart: always
env_file:
- path: ./.env
required: true
depends_on:
db:
condition: service_healthy
@ -17,8 +20,7 @@ services:
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
volumes:
- ./db/migrations:/docker-entrypoint-initdb.d/
- database:/var/lib/mysql/
- ./data:/var/lib/mysql/
healthcheck:
test: [ "CMD", "mariadb", "-h", "localhost", "-u", "${MARIADB_USER}", "-p${MARIADB_PASSWORD}", "-e", "SELECT 1" ]
interval: 5s
@ -31,6 +33,3 @@ services:
restart: always
ports:
- 8080:8080
volumes:
database:

28
docker-compose.prod.yml Normal file
View file

@ -0,0 +1,28 @@
services:
core:
image: ghcr.io/wlinator/luminara:main
container_name: lumi-core
restart: always
env_file:
- path: ./.env
required: true
depends_on:
db:
condition: service_healthy
db:
image: mariadb
container_name: lumi-db
restart: always
environment:
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
volumes:
- ./data:/var/lib/mysql/
healthcheck:
test: [ "CMD", "mariadb", "-h", "localhost", "-u", "${MARIADB_USER}", "-p${MARIADB_PASSWORD}", "-e", "SELECT 1" ]
interval: 5s
timeout: 10s
retries: 5

View file

@ -1,13 +1,8 @@
import os
from typing import Optional, Set
from dotenv import load_dotenv
from config.parser import JsonCache
# Load environment variables from .env file
load_dotenv()
art = JsonCache.read_json("art")
resources = JsonCache.read_json("resources")