dev #9
79
docker-compose.dev.yml
Normal file
79
docker-compose.dev.yml
Normal file
@@ -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
|
||||||
@@ -3,21 +3,22 @@ services:
|
|||||||
image: 10.10.0.10:3000/avm/mostovik-web:${IMAGE_TAG:-dev}
|
image: 10.10.0.10:3000/avm/mostovik-web:${IMAGE_TAG:-dev}
|
||||||
container_name: mostovik_web
|
container_name: mostovik_web
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
network_mode: host
|
ports:
|
||||||
environment:
|
- "8000:8000"
|
||||||
- DJANGO_SETTINGS_MODULE=config.settings.dev
|
# environment:
|
||||||
- DEBUG=False
|
# - DJANGO_SETTINGS_MODULE=config.settings.dev
|
||||||
- SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
# - DEBUG=False
|
||||||
- ALLOWED_HOSTS=*
|
# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
||||||
- POSTGRES_HOST=127.0.0.1
|
# - ALLOWED_HOSTS=*
|
||||||
- POSTGRES_PORT=5432
|
# - POSTGRES_HOST=127.0.0.1
|
||||||
- POSTGRES_DB=mostovik
|
# - POSTGRES_PORT=5432
|
||||||
- POSTGRES_USER=postgres
|
# - POSTGRES_DB=mostovik
|
||||||
- POSTGRES_PASSWORD=postgres
|
# - POSTGRES_USER=postgres
|
||||||
- POSTGRES_SSLMODE=disable
|
# - POSTGRES_PASSWORD=postgres
|
||||||
- REDIS_URL=redis://127.0.0.1:6379/0
|
# - POSTGRES_SSLMODE=disable
|
||||||
- CELERY_BROKER_URL=redis://127.0.0.1:6379/0
|
# - REDIS_URL=redis://127.0.0.1:6379/0
|
||||||
- CELERY_RESULT_BACKEND=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:
|
volumes:
|
||||||
- ./logs:/app/logs
|
- ./logs:/app/logs
|
||||||
- ./media:/app/media
|
- ./media:/app/media
|
||||||
@@ -32,19 +33,19 @@ services:
|
|||||||
container_name: mostovik_celery_worker
|
container_name: mostovik_celery_worker
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
network_mode: host
|
network_mode: host
|
||||||
environment:
|
# environment:
|
||||||
- DJANGO_SETTINGS_MODULE=config.settings.dev
|
# - DJANGO_SETTINGS_MODULE=config.settings.dev
|
||||||
- DEBUG=True
|
# - DEBUG=True
|
||||||
- SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
||||||
- POSTGRES_HOST=127.0.0.1
|
# - POSTGRES_HOST=127.0.0.1
|
||||||
- POSTGRES_PORT=5432
|
# - POSTGRES_PORT=5432
|
||||||
- POSTGRES_DB=mostovik
|
# - POSTGRES_DB=mostovik
|
||||||
- POSTGRES_USER=postgres
|
# - POSTGRES_USER=postgres
|
||||||
- POSTGRES_PASSWORD=postgres
|
# - POSTGRES_PASSWORD=postgres
|
||||||
- POSTGRES_SSLMODE=disable
|
# - POSTGRES_SSLMODE=disable
|
||||||
- REDIS_URL=redis://127.0.0.1:6379/0
|
# - REDIS_URL=redis://127.0.0.1:6379/0
|
||||||
- CELERY_BROKER_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
|
# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||||
volumes:
|
volumes:
|
||||||
- ./logs:/app/logs
|
- ./logs:/app/logs
|
||||||
command: celery -A config worker
|
command: celery -A config worker
|
||||||
@@ -54,19 +55,19 @@ services:
|
|||||||
container_name: mostovik_celery_beat
|
container_name: mostovik_celery_beat
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
network_mode: host
|
network_mode: host
|
||||||
environment:
|
# environment:
|
||||||
- DJANGO_SETTINGS_MODULE=config.settings.dev
|
# - DJANGO_SETTINGS_MODULE=config.settings.dev
|
||||||
- DEBUG=False
|
# - DEBUG=False
|
||||||
- SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
# - SECRET_KEY=${SECRET_KEY:-django-insecure-dev-key-change-in-production}
|
||||||
- POSTGRES_HOST=127.0.0.1
|
# - POSTGRES_HOST=127.0.0.1
|
||||||
- POSTGRES_PORT=5432
|
# - POSTGRES_PORT=5432
|
||||||
- POSTGRES_DB=mostovik
|
# - POSTGRES_DB=mostovik
|
||||||
- POSTGRES_USER=postgres
|
# - POSTGRES_USER=postgres
|
||||||
- POSTGRES_PASSWORD=postgres
|
# - POSTGRES_PASSWORD=postgres
|
||||||
- POSTGRES_SSLMODE=disable
|
# - POSTGRES_SSLMODE=disable
|
||||||
- REDIS_URL=redis://127.0.0.1:6379/0
|
# - REDIS_URL=redis://127.0.0.1:6379/0
|
||||||
- CELERY_BROKER_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
|
# - CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||||
volumes:
|
volumes:
|
||||||
- ./logs:/app/logs
|
- ./logs:/app/logs
|
||||||
command: celery -A config beat
|
command: celery -A config beat
|
||||||
|
|||||||
34
docker-compose.service.yml
Normal file
34
docker-compose.service.yml
Normal file
@@ -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
|
||||||
|
|
||||||
@@ -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
|
|
||||||
@@ -48,6 +48,7 @@ RUN mkdir -p logs src/logs
|
|||||||
|
|
||||||
# PYTHONPATH для доступа к модулям
|
# PYTHONPATH для доступа к модулям
|
||||||
ENV PYTHONPATH=/app/src
|
ENV PYTHONPATH=/app/src
|
||||||
|
ENV DJANGO_SETTINGS_MODULE=config.settings.dev
|
||||||
|
|
||||||
# Создание пользователя для запуска приложения
|
# Создание пользователя для запуска приложения
|
||||||
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
|
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ RUN mkdir -p logs staticfiles media src/logs src/static src/staticfiles src/medi
|
|||||||
|
|
||||||
# PYTHONPATH для доступа к модулям
|
# PYTHONPATH для доступа к модулям
|
||||||
ENV PYTHONPATH=/app/src
|
ENV PYTHONPATH=/app/src
|
||||||
|
ENV DJANGO_SETTINGS_MODULE=config.settings.dev
|
||||||
|
|
||||||
# Создание пользователя для запуска приложения
|
# Создание пользователя для запуска приложения
|
||||||
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
|
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ dependencies = [
|
|||||||
"djangorestframework-simplejwt>=5.3.1",
|
"djangorestframework-simplejwt>=5.3.1",
|
||||||
"drf-yasg>=1.21.10",
|
"drf-yasg>=1.21.10",
|
||||||
"pillow>=12.1.0",
|
"pillow>=12.1.0",
|
||||||
"python-decouple>=3.8",
|
|
||||||
"coreapi>=2.3.3",
|
"coreapi>=2.3.3",
|
||||||
"django-rest-swagger>=2.2.0",
|
"django-rest-swagger>=2.2.0",
|
||||||
"model-bakery>=1.17.0",
|
"model-bakery>=1.17.0",
|
||||||
|
|||||||
@@ -1,42 +1,15 @@
|
|||||||
"""
|
"""
|
||||||
Base settings for Django project.
|
Base settings for Django project.
|
||||||
|
|
||||||
Generated by 'django-admin startproject' using Django 3.2.25.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from .env import build_config, env_list
|
|
||||||
|
|
||||||
# BASE_DIR = .../project_root
|
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
||||||
|
|
||||||
APP_VERSION = "1.0.0"
|
APP_VERSION = "1.0.0"
|
||||||
|
|
||||||
config = build_config(BASE_DIR)
|
# SECRET_KEY, DEBUG, ALLOWED_HOSTS определяются в dev.py / production.py
|
||||||
|
|
||||||
|
|
||||||
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(",")
|
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
@@ -190,46 +163,15 @@ TEMPLATES = [
|
|||||||
|
|
||||||
WSGI_APPLICATION = "config.wsgi.application"
|
WSGI_APPLICATION = "config.wsgi.application"
|
||||||
|
|
||||||
# Database
|
# Database и Cache определяются в dev.py / production.py
|
||||||
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",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# PARSERS SETTINGS
|
# PARSERS SETTINGS
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# Zakupki.gov.ru API Token (получить через Госуслуги)
|
ZAKUPKI_TOKEN = "019c03d7-e1f6-7091-b296-8c88b4c585dd"
|
||||||
ZAKUPKI_TOKEN = get_env("ZAKUPKI_TOKEN", "")
|
FNS_LOCK_TTL_SECONDS = 3600
|
||||||
|
PARSER_PROXIES = []
|
||||||
# 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 = []
|
|
||||||
|
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
@@ -305,8 +247,7 @@ REST_FRAMEWORK = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
# JWT settings
|
# JWT settings (SIGNING_KEY определяется в dev.py / production.py)
|
||||||
|
|
||||||
SIMPLE_JWT = {
|
SIMPLE_JWT = {
|
||||||
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=60),
|
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=60),
|
||||||
"REFRESH_TOKEN_LIFETIME": timedelta(days=7),
|
"REFRESH_TOKEN_LIFETIME": timedelta(days=7),
|
||||||
@@ -314,7 +255,6 @@ SIMPLE_JWT = {
|
|||||||
"BLACKLIST_AFTER_ROTATION": True,
|
"BLACKLIST_AFTER_ROTATION": True,
|
||||||
"UPDATE_LAST_LOGIN": True,
|
"UPDATE_LAST_LOGIN": True,
|
||||||
"ALGORITHM": "HS256",
|
"ALGORITHM": "HS256",
|
||||||
"SIGNING_KEY": SECRET_KEY,
|
|
||||||
"VERIFYING_KEY": None,
|
"VERIFYING_KEY": None,
|
||||||
"AUDIENCE": None,
|
"AUDIENCE": None,
|
||||||
"ISSUER": None,
|
"ISSUER": None,
|
||||||
@@ -335,11 +275,7 @@ SIMPLE_JWT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# CORS settings
|
# CORS settings
|
||||||
CORS_ALLOWED_ORIGINS = get_env(
|
CORS_ALLOWED_ORIGINS = ["http://localhost:3000", "http://127.0.0.1:3000"]
|
||||||
"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_ALLOW_CREDENTIALS = True
|
CORS_ALLOW_CREDENTIALS = True
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -417,5 +353,4 @@ FNS_FAILED_DIRECTORY = BASE_DIR / "input" / "fns" / "failed"
|
|||||||
# Checko API Settings (checko.ru)
|
# Checko API Settings (checko.ru)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# API key for Checko.ru service
|
CHECKO_API_KEY = "pRiEnJuD1tclsLCb"
|
||||||
CHECKO_API_KEY = get_env("CHECKO_API_KEY", "")
|
|
||||||
|
|||||||
@@ -1,51 +1,47 @@
|
|||||||
import os
|
"""
|
||||||
|
Development settings - закрытый контур, без переменных окружения.
|
||||||
|
Docker на macOS - используется host.docker.internal.
|
||||||
|
"""
|
||||||
|
|
||||||
from .base import *
|
from .base import *
|
||||||
|
|
||||||
# Development settings - unsuitable for production
|
SECRET_KEY = "django-insecure-development-key-mostovik-2024"
|
||||||
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
|
DEBUG = True
|
||||||
|
ALLOWED_HOSTS = ["*"]
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# JWT
|
||||||
SECRET_KEY = os.getenv(
|
SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY
|
||||||
"SECRET_KEY", "django-insecure-development-key-change-in-production"
|
|
||||||
)
|
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# Database
|
||||||
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
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": {
|
"default": {
|
||||||
"ENGINE": "django.db.backends.postgresql",
|
"ENGINE": "django.db.backends.postgresql",
|
||||||
"NAME": os.getenv("POSTGRES_DB", "mostovik"),
|
"NAME": "mostovik",
|
||||||
"USER": os.getenv("POSTGRES_USER", "postgres"),
|
"USER": "postgres",
|
||||||
"PASSWORD": os.getenv("POSTGRES_PASSWORD", "postgres"),
|
"PASSWORD": "postgres",
|
||||||
"HOST": os.getenv("POSTGRES_HOST", "127.0.0.1"),
|
"HOST": "host.docker.internal",
|
||||||
"PORT": os.getenv("POSTGRES_PORT", "5432"),
|
"PORT": "5432",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Celery Configuration for Development
|
# Celery
|
||||||
CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL", "redis://127.0.0.1:6379/0")
|
CELERY_BROKER_URL = "redis://host.docker.internal:6379/0"
|
||||||
CELERY_RESULT_BACKEND = os.getenv("CELERY_RESULT_BACKEND", "redis://127.0.0.1:6379/0")
|
CELERY_RESULT_BACKEND = "redis://host.docker.internal:6379/0"
|
||||||
CELERY_ACCEPT_CONTENT = ["json"]
|
CELERY_ACCEPT_CONTENT = ["json"]
|
||||||
CELERY_TASK_SERIALIZER = "json"
|
CELERY_TASK_SERIALIZER = "json"
|
||||||
CELERY_RESULT_SERIALIZER = "json"
|
CELERY_RESULT_SERIALIZER = "json"
|
||||||
CELERY_TIMEZONE = "Europe/Moscow"
|
CELERY_TIMEZONE = "Europe/Moscow"
|
||||||
|
|
||||||
# Email backend for development
|
# Cache
|
||||||
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")
|
|
||||||
CACHES = {
|
CACHES = {
|
||||||
"default": {
|
"default": {
|
||||||
"BACKEND": "django_redis.cache.RedisCache",
|
"BACKEND": "django_redis.cache.RedisCache",
|
||||||
"LOCATION": REDIS_URL,
|
"LOCATION": "redis://host.docker.internal:6379/1",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Email
|
||||||
|
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
||||||
|
|||||||
@@ -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()]
|
|
||||||
@@ -1,59 +1,54 @@
|
|||||||
import os
|
"""
|
||||||
|
Production settings - закрытый контур, все настройки захардкожены.
|
||||||
|
Docker Compose сеть - используются имена сервисов (db, redis).
|
||||||
|
"""
|
||||||
|
|
||||||
from .base import *
|
from .base import *
|
||||||
|
|
||||||
# Production settings
|
# TODO: сменить на безопасный ключ перед деплоем
|
||||||
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
|
SECRET_KEY = "production-secret-key-mostovik-change-me-2024"
|
||||||
|
|
||||||
# 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!
|
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
|
ALLOWED_HOSTS = ["*"] # TODO: указать конкретные хосты
|
||||||
|
|
||||||
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")
|
# JWT
|
||||||
|
SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY
|
||||||
|
|
||||||
# HTTPS settings
|
# HTTPS settings (раскомментировать если используется HTTPS)
|
||||||
SECURE_SSL_REDIRECT = True
|
# SECURE_SSL_REDIRECT = True
|
||||||
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
|
# SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
|
||||||
SECURE_HSTS_SECONDS = 31536000
|
# SECURE_HSTS_SECONDS = 31536000
|
||||||
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
|
# SECURE_HSTS_INCLUDE_SUBDOMAINS = True
|
||||||
SECURE_HSTS_PRELOAD = True
|
# SECURE_HSTS_PRELOAD = True
|
||||||
|
# SESSION_COOKIE_SECURE = True
|
||||||
|
# CSRF_COOKIE_SECURE = True
|
||||||
|
|
||||||
# Session security
|
# Database
|
||||||
SESSION_COOKIE_SECURE = True
|
|
||||||
CSRF_COOKIE_SECURE = True
|
|
||||||
|
|
||||||
# Database for production
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": {
|
"default": {
|
||||||
"ENGINE": "django.db.backends.postgresql",
|
"ENGINE": "django.db.backends.postgresql",
|
||||||
"NAME": os.getenv("POSTGRES_DB"),
|
"NAME": "mostovik",
|
||||||
"USER": os.getenv("POSTGRES_USER"),
|
"USER": "postgres",
|
||||||
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
|
"PASSWORD": "postgres", # TODO: сменить пароль
|
||||||
"HOST": os.getenv("POSTGRES_HOST"),
|
"HOST": "db",
|
||||||
"PORT": os.getenv("POSTGRES_PORT", "5432"),
|
"PORT": "5432",
|
||||||
"OPTIONS": {
|
|
||||||
"sslmode": os.getenv("POSTGRES_SSLMODE", "require"),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Celery Configuration for Production
|
# Celery
|
||||||
CELERY_BROKER_URL = os.getenv("REDIS_URL", "redis://redis:6379/0")
|
CELERY_BROKER_URL = "redis://redis:6379/0"
|
||||||
CELERY_RESULT_BACKEND = os.getenv("REDIS_URL", "redis://redis:6379/0")
|
CELERY_RESULT_BACKEND = "redis://redis:6379/0"
|
||||||
CELERY_ACCEPT_CONTENT = ["json"]
|
CELERY_ACCEPT_CONTENT = ["json"]
|
||||||
CELERY_TASK_SERIALIZER = "json"
|
CELERY_TASK_SERIALIZER = "json"
|
||||||
CELERY_RESULT_SERIALIZER = "json"
|
CELERY_RESULT_SERIALIZER = "json"
|
||||||
CELERY_TIMEZONE = "UTC"
|
CELERY_TIMEZONE = "Europe/Moscow"
|
||||||
CELERY_TASK_ALWAYS_EAGER = False
|
CELERY_TASK_ALWAYS_EAGER = False
|
||||||
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
|
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
|
||||||
|
|
||||||
# Cache configuration for production
|
# Cache
|
||||||
CACHES = {
|
CACHES = {
|
||||||
"default": {
|
"default": {
|
||||||
"BACKEND": "django_redis.cache.RedisCache",
|
"BACKEND": "django_redis.cache.RedisCache",
|
||||||
"LOCATION": os.getenv("REDIS_CACHE_URL", "redis://redis:6379/1"),
|
"LOCATION": "redis://redis:6379/1",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||||||
"CONNECTION_POOL_KWARGS": {
|
"CONNECTION_POOL_KWARGS": {
|
||||||
@@ -64,7 +59,7 @@ CACHES = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Logging for production (stdout for Docker)
|
# Logging (stdout для Docker)
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"disable_existing_loggers": False,
|
"disable_existing_loggers": False,
|
||||||
@@ -91,15 +86,5 @@ LOGGING = {
|
|||||||
"level": "INFO",
|
"level": "INFO",
|
||||||
"propagate": False,
|
"propagate": False,
|
||||||
},
|
},
|
||||||
"apps.data_processor": {
|
|
||||||
"handlers": ["console"],
|
|
||||||
"level": "INFO",
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
"apps.scraping": {
|
|
||||||
"handlers": ["console"],
|
|
||||||
"level": "INFO",
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
|
"""
|
||||||
|
Test settings - для запуска тестов.
|
||||||
|
"""
|
||||||
|
|
||||||
from .base import *
|
from .base import *
|
||||||
|
|
||||||
# Test settings
|
SECRET_KEY = "django-insecure-test-key-only-for-testing"
|
||||||
SECRET_KEY = "django-insecure-test-key-only-for-testing" # noqa: S105
|
|
||||||
|
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
|
# JWT
|
||||||
|
SIMPLE_JWT["SIGNING_KEY"] = SECRET_KEY
|
||||||
|
|
||||||
ALLOWED_HOSTS = ["localhost", "127.0.0.1", "0.0.0.0", "testserver"] # noqa: S104
|
ALLOWED_HOSTS = ["localhost", "127.0.0.1", "0.0.0.0", "testserver"] # noqa: S104
|
||||||
|
|
||||||
# Use in-memory SQLite database for faster tests
|
# Use in-memory SQLite database for faster tests
|
||||||
|
|||||||
Reference in New Issue
Block a user