diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..0c5378b --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,79 @@ +services: + web: + build: + dockerfile: ./docker/Dockerfile.web + context: . + container_name: mostovik_web + restart: unless-stopped + ports: + - "8000:8000" +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=False +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - ALLOWED_HOSTS=* +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 + volumes: + - ./logs:/app/logs + - ./media:/app/media + - ./staticfiles:/app/staticfiles + command: > + sh -c "python src/manage.py migrate && + python src/manage.py collectstatic --noinput && + gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 --timeout 120" + + celery_worker: + build: + dockerfile: ./docker/Dockerfile.celery + context: . + container_name: mostovik_celery_worker + restart: unless-stopped + network_mode: host +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=True +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 + volumes: + - ./logs:/app/logs + command: celery -A config worker + + celery_beat: + build: + dockerfile: ./docker/Dockerfile.celery + context: . + container_name: mostovik_celery_beat + restart: unless-stopped + network_mode: host +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=False +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 + volumes: + - ./logs:/app/logs + command: celery -A config beat diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 9edf363..2c1645d 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -3,21 +3,22 @@ services: image: 10.10.0.10:3000/avm/mostovik-web:${IMAGE_TAG:-dev} container_name: mostovik_web restart: unless-stopped - network_mode: host - environment: - - DJANGO_SETTINGS_MODULE=config.settings.dev - - DEBUG=False - - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} - - ALLOWED_HOSTS=* - - POSTGRES_HOST=127.0.0.1 - - POSTGRES_PORT=5432 - - POSTGRES_DB=mostovik - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_SSLMODE=disable - - REDIS_URL=redis://127.0.0.1:6379/0 - - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 - - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 + ports: + - "8000:8000" +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=False +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - ALLOWED_HOSTS=* +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 volumes: - ./logs:/app/logs - ./media:/app/media @@ -32,19 +33,19 @@ services: container_name: mostovik_celery_worker restart: unless-stopped network_mode: host - environment: - - DJANGO_SETTINGS_MODULE=config.settings.dev - - DEBUG=True - - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} - - POSTGRES_HOST=127.0.0.1 - - POSTGRES_PORT=5432 - - POSTGRES_DB=mostovik - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_SSLMODE=disable - - REDIS_URL=redis://127.0.0.1:6379/0 - - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 - - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=True +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 volumes: - ./logs:/app/logs command: celery -A config worker @@ -54,19 +55,19 @@ services: container_name: mostovik_celery_beat restart: unless-stopped network_mode: host - environment: - - DJANGO_SETTINGS_MODULE=config.settings.dev - - DEBUG=False - - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} - - POSTGRES_HOST=127.0.0.1 - - POSTGRES_PORT=5432 - - POSTGRES_DB=mostovik - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_SSLMODE=disable - - REDIS_URL=redis://127.0.0.1:6379/0 - - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 - - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 +# environment: +# - DJANGO_SETTINGS_MODULE=config.settings.dev +# - DEBUG=False +# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production} +# - POSTGRES_HOST=127.0.0.1 +# - POSTGRES_PORT=5432 +# - POSTGRES_DB=mostovik +# - POSTGRES_USER=postgres +# - POSTGRES_PASSWORD=postgres +# - POSTGRES_SSLMODE=disable +# - REDIS_URL=redis://127.0.0.1:6379/0 +# - CELERY_BROKER_URL=redis://127.0.0.1:6379/0 +# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0 volumes: - ./logs:/app/logs command: celery -A config beat diff --git a/docker-compose.service.yml b/docker-compose.service.yml new file mode 100644 index 0000000..ab92f4c --- /dev/null +++ b/docker-compose.service.yml @@ -0,0 +1,34 @@ +services: + db: + image: postgres:15.10 + container_name: db + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-mostovik} + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + volumes: + - ./data/db:/var/lib/postgresql/data + - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 30s + timeout: 10s + retries: 3 + + redis: + image: redis:7-alpine + container_name: redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - ./data/redis:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 3 + diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index a76721b..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,133 +0,0 @@ -services: - db: - image: postgres:15.10 - container_name: mostovik_db - restart: unless-stopped - environment: - POSTGRES_DB: ${POSTGRES_DB:-mostovik_dev} - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - volumes: - - ./data/db:/var/lib/postgresql/data - - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql - ports: - - "5432:5432" - networks: - - mostovik_network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 30s - timeout: 10s - retries: 3 - - redis: - image: redis:7-alpine - container_name: mostovik_redis - restart: unless-stopped - ports: - - "6379:6379" - volumes: - - ./data/redis:/data - networks: - - mostovik_network - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 30s - timeout: 10s - retries: 3 - - web: - build: - context: . - dockerfile: docker/Dockerfile.web - container_name: mostovik_web - restart: unless-stopped - depends_on: - db: - condition: service_healthy - redis: - condition: service_healthy - environment: - - DEBUG=${DEBUG:-True} - - SECRET_KEY=${SECRET_KEY:-django-insecure-development-key} - - POSTGRES_HOST=db - - POSTGRES_PORT=5432 - - POSTGRES_DB=${POSTGRES_DB:-mostovik_dev} - - POSTGRES_USER=${POSTGRES_USER:-postgres} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} - - REDIS_URL=redis://redis:6379/0 - - CELERY_BROKER_URL=redis://redis:6379/0 - - CELERY_RESULT_BACKEND=redis://redis:6379/0 - volumes: - - ./src:/app/src - - ./logs:/app/logs - - ./media:/app/media - - ./staticfiles:/app/staticfiles - ports: - - "8000:8000" - networks: - - mostovik_network - command: > - sh -c "python src/manage.py migrate && - python src/manage.py collectstatic --noinput && - gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3" - - celery_worker: - build: - context: . - dockerfile: docker/Dockerfile.celery - container_name: mostovik_celery_worker - restart: unless-stopped - depends_on: - db: - condition: service_healthy - redis: - condition: service_healthy - environment: - - DEBUG=${DEBUG:-True} - - POSTGRES_HOST=db - - POSTGRES_PORT=5432 - - POSTGRES_DB=${POSTGRES_DB:-mostovik_dev} - - POSTGRES_USER=${POSTGRES_USER:-postgres} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} - - REDIS_URL=redis://redis:6379/0 - - CELERY_BROKER_URL=redis://redis:6379/0 - - CELERY_RESULT_BACKEND=redis://redis:6379/0 - volumes: - - ./src:/app/src - - ./logs:/app/logs - networks: - - mostovik_network - command: celery -A config worker --loglevel=info - - celery_beat: - build: - context: . - dockerfile: docker/Dockerfile.celery - container_name: mostovik_celery_beat - restart: unless-stopped - depends_on: - db: - condition: service_healthy - redis: - condition: service_healthy - environment: - - DEBUG=${DEBUG:-True} - - POSTGRES_HOST=db - - POSTGRES_PORT=5432 - - POSTGRES_DB=${POSTGRES_DB:-mostovik_dev} - - POSTGRES_USER=${POSTGRES_USER:-postgres} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} - - REDIS_URL=redis://redis:6379/0 - - CELERY_BROKER_URL=redis://redis:6379/0 - - CELERY_RESULT_BACKEND=redis://redis:6379/0 - volumes: - - ./src:/app/src - - ./logs:/app/logs - networks: - - mostovik_network - command: celery -A config beat --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler - -networks: - mostovik_network: - driver: bridge diff --git a/docker/Dockerfile.celery b/docker/Dockerfile.celery index b4c56cb..ae0b429 100644 --- a/docker/Dockerfile.celery +++ b/docker/Dockerfile.celery @@ -48,6 +48,7 @@ RUN mkdir -p logs src/logs # PYTHONPATH для доступа к модулям ENV PYTHONPATH=/app/src +ENV DJANGO_SETTINGS_MODULE=config.settings.dev # Создание пользователя для запуска приложения RUN groupadd -r appgroup && useradd -r -g appgroup appuser diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index d196530..29fd0a9 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -31,6 +31,7 @@ RUN mkdir -p logs staticfiles media src/logs src/static src/staticfiles src/medi # PYTHONPATH для доступа к модулям ENV PYTHONPATH=/app/src +ENV DJANGO_SETTINGS_MODULE=config.settings.dev # Создание пользователя для запуска приложения RUN groupadd -r appgroup && useradd -r -g appgroup appuser diff --git a/pyproject.toml b/pyproject.toml index 275ee50..4b5b703 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,6 @@ dependencies = [ "djangorestframework-simplejwt>=5.3.1", "drf-yasg>=1.21.10", "pillow>=12.1.0", - "python-decouple>=3.8", "coreapi>=2.3.3", "django-rest-swagger>=2.2.0", "model-bakery>=1.17.0", diff --git a/src/config/settings/base.py b/src/config/settings/base.py index ffa8828..eade4ff 100644 --- a/src/config/settings/base.py +++ b/src/config/settings/base.py @@ -1,42 +1,15 @@ """ Base settings for Django project. - -Generated by 'django-admin startproject' using Django 3.2.25. """ from datetime import timedelta from pathlib import Path -from .env import build_config, env_list - -# BASE_DIR = .../project_root BASE_DIR = Path(__file__).resolve().parent.parent.parent APP_VERSION = "1.0.0" -config = build_config(BASE_DIR) - - -def get_env(key: str, default=None): - return config(key, default=default) - - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = get_env( - "SECRET_KEY", "django-insecure-development-key-change-in-production" -) - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = get_env("DEBUG", True) -if isinstance(DEBUG, str): - DEBUG = DEBUG.lower() in ("true", "1", "yes") - -ALLOWED_HOSTS = env_list( - get_env("ALLOWED_HOSTS", "localhost,127.0.0.1"), default=["localhost", "127.0.0.1"] -) - -if isinstance(ALLOWED_HOSTS, str): - ALLOWED_HOSTS = ALLOWED_HOSTS.split(",") +# SECRET_KEY, DEBUG, ALLOWED_HOSTS определяются в dev.py / production.py # Application definition INSTALLED_APPS = [ @@ -190,46 +163,15 @@ TEMPLATES = [ WSGI_APPLICATION = "config.wsgi.application" -# Database -DATABASES = { - "default": { - "ENGINE": "django.db.backends.postgresql", - "NAME": get_env("POSTGRES_DB", "project_db"), - "USER": get_env("POSTGRES_USER", "project_user"), - "PASSWORD": get_env("POSTGRES_PASSWORD", "project_password"), - "HOST": get_env("POSTGRES_HOST", "db"), - "PORT": int(get_env("POSTGRES_PORT", "5432")), - }, -} - -# Cache configuration -CACHES = { - "default": { - "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": get_env("REDIS_URL", "redis://localhost:6379/0"), - "OPTIONS": { - "CLIENT_CLASS": "django_redis.client.DefaultClient", - }, - }, -} - +# Database и Cache определяются в dev.py / production.py # ============================================================================= # PARSERS SETTINGS # ============================================================================= -# Zakupki.gov.ru API Token (получить через Госуслуги) -ZAKUPKI_TOKEN = get_env("ZAKUPKI_TOKEN", "") - -# FNS file lock TTL (seconds) -FNS_LOCK_TTL_SECONDS = int(get_env("FNS_LOCK_TTL_SECONDS", "3600")) - -# Proxy list for parsers (comma-separated) -PARSER_PROXIES = get_env("PARSER_PROXIES", "") -if isinstance(PARSER_PROXIES, str) and PARSER_PROXIES: - PARSER_PROXIES = [p.strip() for p in PARSER_PROXIES.split(",") if p.strip()] -else: - PARSER_PROXIES = [] +ZAKUPKI_TOKEN = "019c03d7-e1f6-7091-b296-8c88b4c585dd" +FNS_LOCK_TTL_SECONDS = 3600 +PARSER_PROXIES = [] # Password validation @@ -305,8 +247,7 @@ REST_FRAMEWORK = { }, } -# JWT settings - +# JWT settings (SIGNING_KEY определяется в dev.py / production.py) SIMPLE_JWT = { "ACCESS_TOKEN_LIFETIME": timedelta(minutes=60), "REFRESH_TOKEN_LIFETIME": timedelta(days=7), @@ -314,7 +255,6 @@ SIMPLE_JWT = { "BLACKLIST_AFTER_ROTATION": True, "UPDATE_LAST_LOGIN": True, "ALGORITHM": "HS256", - "SIGNING_KEY": SECRET_KEY, "VERIFYING_KEY": None, "AUDIENCE": None, "ISSUER": None, @@ -335,11 +275,7 @@ SIMPLE_JWT = { } # CORS settings -CORS_ALLOWED_ORIGINS = get_env( - "CORS_ALLOWED_ORIGINS", "http://localhost:3000,http://127.0.0.1:3000" -) -if isinstance(CORS_ALLOWED_ORIGINS, str): - CORS_ALLOWED_ORIGINS = CORS_ALLOWED_ORIGINS.split(",") +CORS_ALLOWED_ORIGINS = ["http://localhost:3000", "http://127.0.0.1:3000"] CORS_ALLOW_CREDENTIALS = True # ============================================================================= @@ -417,5 +353,4 @@ FNS_FAILED_DIRECTORY = BASE_DIR / "input" / "fns" / "failed" # Checko API Settings (checko.ru) # ============================================================================= -# API key for Checko.ru service -CHECKO_API_KEY = get_env("CHECKO_API_KEY", "") +CHECKO_API_KEY = "pRiEnJuD1tclsLCb" diff --git a/src/config/settings/dev.py b/src/config/settings/dev.py index 4bb74dc..7190ffb 100644 --- a/src/config/settings/dev.py +++ b/src/config/settings/dev.py @@ -1,51 +1,47 @@ -import os +""" +Development settings - закрытый контур, без переменных окружения. +Docker на macOS - используется host.docker.internal. +""" from .base import * -# Development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ +SECRET_KEY = "django-insecure-development-key-mostovik-2024" +DEBUG = True +ALLOWED_HOSTS = ["*"] -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv( - "SECRET_KEY", "django-insecure-development-key-change-in-production" -) +# JWT +SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv("DEBUG", "True").lower() in ("true", "1", "yes") - -ALLOWED_HOSTS = ["localhost", "127.0.0.1", "0.0.0.0", "testserver", "*"] # noqa: S104 - -# Database for development +# Database DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", - "NAME": os.getenv("POSTGRES_DB", "mostovik"), - "USER": os.getenv("POSTGRES_USER", "postgres"), - "PASSWORD": os.getenv("POSTGRES_PASSWORD", "postgres"), - "HOST": os.getenv("POSTGRES_HOST", "127.0.0.1"), - "PORT": os.getenv("POSTGRES_PORT", "5432"), + "NAME": "mostovik", + "USER": "postgres", + "PASSWORD": "postgres", + "HOST": "host.docker.internal", + "PORT": "5432", } } -# Celery Configuration for Development -CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL", "redis://127.0.0.1:6379/0") -CELERY_RESULT_BACKEND = os.getenv("CELERY_RESULT_BACKEND", "redis://127.0.0.1:6379/0") +# Celery +CELERY_BROKER_URL = "redis://host.docker.internal:6379/0" +CELERY_RESULT_BACKEND = "redis://host.docker.internal:6379/0" CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" CELERY_TIMEZONE = "Europe/Moscow" -# Email backend for development -EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" - -# Cache configuration for development -REDIS_URL = os.getenv("REDIS_URL", "redis://127.0.0.1:6379/1") +# Cache CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": REDIS_URL, + "LOCATION": "redis://host.docker.internal:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", }, } } + +# Email +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" diff --git a/src/config/settings/env.py b/src/config/settings/env.py deleted file mode 100644 index 1ce7e22..0000000 --- a/src/config/settings/env.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from collections.abc import Iterable -from pathlib import Path -from typing import Any - -from decouple import AutoConfig, Config, RepositoryEnv - - -def build_config(base_dir: Path): - env_file = base_dir / ".env" - if env_file.exists(): - return Config(RepositoryEnv(str(env_file))) - return AutoConfig(search_path=base_dir) - - -def env_bool(value: Any, default: bool = False) -> bool: - if value is None: - return default - if isinstance(value, bool): - return value - if isinstance(value, (int, float)): - return bool(value) - s = str(value).strip().lower() - if s in {"1", "true", "yes", "y", "on"}: - return True - if s in {"0", "false", "no", "n", "off"}: - return False - return default - - -def env_int(value: Any, default: int = 0) -> int: - try: - return int(str(value).strip()) - except Exception: - return default - - -def env_list(value: Any, default: Iterable[str] = ()) -> list[str]: - """ - Поддерживает: - - "a,b,c" - - "a, b, c" - - пустые значения - """ - if value is None: - return list(default) - if isinstance(value, (list, tuple, set)): - return [str(x).strip() for x in value if str(x).strip()] - s = str(value).strip() - if not s: - return list(default) - return [p.strip() for p in s.split(",") if p.strip()] diff --git a/src/config/settings/production.py b/src/config/settings/production.py index 50a3f3c..02e5b06 100644 --- a/src/config/settings/production.py +++ b/src/config/settings/production.py @@ -1,59 +1,54 @@ -import os +""" +Production settings - закрытый контур, все настройки захардкожены. +Docker Compose сеть - используются имена сервисов (db, redis). +""" from .base import * -# Production settings -# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv("SECRET_KEY") - -# SECURITY WARNING: don't run with debug turned on in production! +# TODO: сменить на безопасный ключ перед деплоем +SECRET_KEY = "production-secret-key-mostovik-change-me-2024" DEBUG = False +ALLOWED_HOSTS = ["*"] # TODO: указать конкретные хосты -ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",") +# JWT +SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY -# HTTPS settings -SECURE_SSL_REDIRECT = True -SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") -SECURE_HSTS_SECONDS = 31536000 -SECURE_HSTS_INCLUDE_SUBDOMAINS = True -SECURE_HSTS_PRELOAD = True +# HTTPS settings (раскомментировать если используется HTTPS) +# SECURE_SSL_REDIRECT = True +# SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") +# SECURE_HSTS_SECONDS = 31536000 +# SECURE_HSTS_INCLUDE_SUBDOMAINS = True +# SECURE_HSTS_PRELOAD = True +# SESSION_COOKIE_SECURE = True +# CSRF_COOKIE_SECURE = True -# Session security -SESSION_COOKIE_SECURE = True -CSRF_COOKIE_SECURE = True - -# Database for production +# Database DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", - "NAME": os.getenv("POSTGRES_DB"), - "USER": os.getenv("POSTGRES_USER"), - "PASSWORD": os.getenv("POSTGRES_PASSWORD"), - "HOST": os.getenv("POSTGRES_HOST"), - "PORT": os.getenv("POSTGRES_PORT", "5432"), - "OPTIONS": { - "sslmode": os.getenv("POSTGRES_SSLMODE", "require"), - }, + "NAME": "mostovik", + "USER": "postgres", + "PASSWORD": "postgres", # TODO: сменить пароль + "HOST": "db", + "PORT": "5432", } } -# Celery Configuration for Production -CELERY_BROKER_URL = os.getenv("REDIS_URL", "redis://redis:6379/0") -CELERY_RESULT_BACKEND = os.getenv("REDIS_URL", "redis://redis:6379/0") +# Celery +CELERY_BROKER_URL = "redis://redis:6379/0" +CELERY_RESULT_BACKEND = "redis://redis:6379/0" CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" -CELERY_TIMEZONE = "UTC" +CELERY_TIMEZONE = "Europe/Moscow" CELERY_TASK_ALWAYS_EAGER = False CELERY_WORKER_PREFETCH_MULTIPLIER = 1 -# Cache configuration for production +# Cache CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": os.getenv("REDIS_CACHE_URL", "redis://redis:6379/1"), + "LOCATION": "redis://redis:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": { @@ -64,7 +59,7 @@ CACHES = { } } -# Logging for production (stdout for Docker) +# Logging (stdout для Docker) LOGGING = { "version": 1, "disable_existing_loggers": False, @@ -91,15 +86,5 @@ LOGGING = { "level": "INFO", "propagate": False, }, - "apps.data_processor": { - "handlers": ["console"], - "level": "INFO", - "propagate": False, - }, - "apps.scraping": { - "handlers": ["console"], - "level": "INFO", - "propagate": False, - }, }, } diff --git a/src/config/settings/test.py b/src/config/settings/test.py index 2e68d19..a3f0374 100644 --- a/src/config/settings/test.py +++ b/src/config/settings/test.py @@ -1,10 +1,15 @@ +""" +Test settings - для запуска тестов. +""" + from .base import * -# Test settings -SECRET_KEY = "django-insecure-test-key-only-for-testing" # noqa: S105 - +SECRET_KEY = "django-insecure-test-key-only-for-testing" DEBUG = True +# JWT +SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY + ALLOWED_HOSTS = ["localhost", "127.0.0.1", "0.0.0.0", "testserver"] # noqa: S104 # Use in-memory SQLite database for faster tests