From bf6b9f44243d06e87fda6e66e84e968a9c0aabc6 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Thu, 13 Nov 2025 17:14:00 +0300 Subject: [PATCH] Features: 1) Add `backup_task` to manage database and media backups; 2) Introduce periodic scheduling for `backup_task` via Celery Beat; Fixes: 1) Apply `--omit` filter for test coverage reports to exclude unnecessary files; 2) Replace `services_data` volume mounts with named Docker volumes for consistency and cleanup (e.g., `postgres-data`, `redis-data`); Extra: 1) Remove `services_data` from `.gitignore`, Docker-related cleanup in uninstall scripts; 2) Simplified related files removal scripts for Unix and Windows; 3) Minor adjustments in documentation comments. --- .dockerignore | 1 - .gitignore | 8 -------- docker-compose.yml | 6 ++++-- engine/core/tasks.py | 7 +++++++ engine/vibes_auth/tests/__init__.py | 0 evibes/settings/celery.py | 5 +++++ evibes/settings/dbbackup.py | 3 +++ scripts/Unix/test.sh | 4 ++-- scripts/Unix/uninstall.sh | 2 +- scripts/Windows/test.ps1 | 4 ++-- scripts/Windows/uninstall.ps1 | 1 - 11 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 engine/vibes_auth/tests/__init__.py diff --git a/.dockerignore b/.dockerignore index b0a23cab..c2764f51 100644 --- a/.dockerignore +++ b/.dockerignore @@ -70,7 +70,6 @@ pip-delete-this-directory.txt storefront/Dockerfile docker-compose.yml backups/ -services_data/ static/ media/ !engine/core/static diff --git a/.gitignore b/.gitignore index 6b0e7bd1..2f13695e 100644 --- a/.gitignore +++ b/.gitignore @@ -117,14 +117,6 @@ media/ # Webassets .webassets-cache/ -# ────────────────────────────────────────────────────────────────────────── -# Docker & service data -# ────────────────────────────────────────────────────────────────────────── -# Local volume mounts -services_data/ -services_data/postgres/ -services_data/redis/ - # ────────────────────────────────────────────────────────────────────────── # Node dependencies # ────────────────────────────────────────────────────────────────────────── diff --git a/docker-compose.yml b/docker-compose.yml index 94250329..4a0b5dc2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: image: postgis/postgis:17-3.5 restart: always volumes: - - ./services_data/postgres:/var/lib/postgresql/data/ + - postgres-data:/var/lib/postgresql/data/ ports: - "5432:5432" env_file: @@ -63,7 +63,7 @@ services: restart: always command: redis-server --save "" --appendonly no --slave-read-only no --requirepass "$REDIS_PASSWORD" volumes: - - ./services_data/redis:/data + - redis-data:/data env_file: - .env logging: *default-logging @@ -219,5 +219,7 @@ services: volumes: + postgres-data: + redis-data: es-data: prometheus-data: diff --git a/engine/core/tasks.py b/engine/core/tasks.py index 5fa3a9f1..1dc435a9 100644 --- a/engine/core/tasks.py +++ b/engine/core/tasks.py @@ -12,6 +12,7 @@ from celery.app import shared_task from constance import config from django.conf import settings from django.core.cache import cache +from django.core.management import call_command from engine.core.models import Product, Promotion from engine.core.utils.caching import set_default_cache @@ -21,6 +22,12 @@ from engine.core.vendors import AbstractVendor, VendorInactiveError, delete_stal logger = logging.getLogger(__name__) +@shared_task(queue="default") +def backup_task(): + call_command("dbbackup", clean=True) + call_command("mediabackup", clean=True) + + @shared_task(queue="stock_updater") def update_products_task() -> tuple[bool, str]: """ diff --git a/engine/vibes_auth/tests/__init__.py b/engine/vibes_auth/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/evibes/settings/celery.py b/evibes/settings/celery.py index 433383c0..9ff31529 100644 --- a/evibes/settings/celery.py +++ b/evibes/settings/celery.py @@ -25,6 +25,11 @@ CELERY_RESULT_BACKEND = CELERY_BROKER_URL CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers.DatabaseScheduler" CELERY_BEAT_SCHEDULE = { + "backup_task": { + "task": "engine.core.tasks.backup_task", + "schedule": timedelta(days=7), + "options": {"queue": "default"}, + }, "update_products_task": { "task": "engine.core.tasks.update_products_task", "schedule": timedelta(minutes=60), diff --git a/evibes/settings/dbbackup.py b/evibes/settings/dbbackup.py index a8225a2f..3f032818 100644 --- a/evibes/settings/dbbackup.py +++ b/evibes/settings/dbbackup.py @@ -5,3 +5,6 @@ DBBACKUP_CONNECTORS = { "RESTORE_SUFFIX": "--set ON_ERROR_STOP=off", } } + +DBBACKUP_CLEANUP_KEEP = 2 +DBBACKUP_CLEANUP_KEEP_MEDIA = 2 diff --git a/scripts/Unix/test.sh b/scripts/Unix/test.sh index e434d748..f955dc39 100644 --- a/scripts/Unix/test.sh +++ b/scripts/Unix/test.sh @@ -38,10 +38,10 @@ case "${report:-}" in docker compose exec app uv run coverage report -m ;; xml) - docker compose exec app uv run coverage xml + docker compose exec app uv run coverage xml --omit='storefront/*,monitoring/*,Dockerfiles/*,*/__init__.py,*/tests/*,*/migrations/*,manage.py,evibes/*' ;; html) - docker compose exec app uv run coverage html + docker compose exec app uv run coverage html --omit='storefront/*,monitoring/*,Dockerfiles/*,*/__init__.py,*/tests/*,*/migrations/*,manage.py,evibes/*' ;; *) echo "Invalid report type: $report (expected xml or html)" >&2 diff --git a/scripts/Unix/uninstall.sh b/scripts/Unix/uninstall.sh index e3c97daf..0c68de65 100644 --- a/scripts/Unix/uninstall.sh +++ b/scripts/Unix/uninstall.sh @@ -17,7 +17,7 @@ docker system prune -a -f --volumes echo "Unused Docker data cleaned successfully!" echo "Removing related files..." -rm -rf ./services_data ./media ./static +rm -rf ./media ./static echo "Related files removed successfully!" echo "Bye-bye, hope you return later!" diff --git a/scripts/Windows/test.ps1 b/scripts/Windows/test.ps1 index eb632d10..4836104b 100644 --- a/scripts/Windows/test.ps1 +++ b/scripts/Windows/test.ps1 @@ -24,11 +24,11 @@ if (-not $PSBoundParameters.ContainsKey('Report') -or [string]::IsNullOrWhiteSpa switch ($Report.ToLowerInvariant()) { 'xml' { - docker compose exec app uv run coverage xml + docker compose exec app uv run coverage xml --omit='storefront/*,monitoring/*,Dockerfiles/*,*/__init__.py,*/tests/*,*/migrations/*,manage.py,evibes/*' exit $LASTEXITCODE } 'html' { - docker compose exec app uv run coverage html + docker compose exec app uv run coverage html --omit='storefront/*,monitoring/*,Dockerfiles/*,*/__init__.py,*/tests/*,*/migrations/*,manage.py,evibes/*' exit $LASTEXITCODE } default { diff --git a/scripts/Windows/uninstall.ps1 b/scripts/Windows/uninstall.ps1 index 2ef36b9f..b7491eb1 100644 --- a/scripts/Windows/uninstall.ps1 +++ b/scripts/Windows/uninstall.ps1 @@ -32,7 +32,6 @@ if ($LASTEXITCODE -ne 0) { Write-Host "Unused Docker data cleaned successfully!" -ForegroundColor Green Write-Host "Removing related files..." -ForegroundColor Magenta -Remove-Item -Recurse -Force -ErrorAction SilentlyContinue ./services_data Remove-Item -Recurse -Force -ErrorAction SilentlyContinue ./media Remove-Item -Recurse -Force -ErrorAction SilentlyContinue ./static Write-Host "Related files removed successfully!" -ForegroundColor Green