mod: switch secrets config to .env
This commit is contained in:
37
.env.sample
37
.env.sample
@@ -1,5 +1,6 @@
|
|||||||
# Django Configuration Example
|
# Django Configuration Example
|
||||||
# Копируйте этот файл в .env.local и заполните реальные значения
|
# Все настройки читаются из переменных окружения (DEV/PROD без распознавания хоста)
|
||||||
|
# Для локальной разработки можно скопировать файл в .env.local и экспортировать его.
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# DJANGO
|
# DJANGO
|
||||||
@@ -15,19 +16,29 @@ DEBUG=False
|
|||||||
# Допустимые хосты (разделены запятой без пробелов)
|
# Допустимые хосты (разделены запятой без пробелов)
|
||||||
ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com
|
ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com
|
||||||
|
|
||||||
|
# Админы для email-оповещений Django (формат: Имя:email,Имя2:email2)
|
||||||
|
ADMINS=Admin:admin@example.com
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# DATABASE
|
# DATABASE
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
# Database backend (по умолчанию mysql)
|
# Database backend (по умолчанию SQLite)
|
||||||
DATABASE_ENGINE=django.db.backends.mysql
|
DATABASE_ENGINE=django.db.backends.sqlite3
|
||||||
|
|
||||||
# Database connection
|
# Имя/путь базы данных:
|
||||||
DATABASE_HOST=localhost
|
# - для SQLite: только имя файла (полный путь соберется в settings.py через PROJECT_ROOT/database)
|
||||||
DATABASE_PORT=3306
|
# - для MySQL/MariaDB: имя базы
|
||||||
DATABASE_NAME=django_oknardia
|
DATABASE_NAME=oknadria.sqlite3
|
||||||
DATABASE_USER=web
|
|
||||||
DATABASE_PASSWORD=your-db-password-here
|
# Для MySQL/MariaDB (используются, если DATABASE_ENGINE=django.db.backends.mysql)
|
||||||
|
# DATABASE_HOST=localhost
|
||||||
|
# DATABASE_PORT=3306
|
||||||
|
# DATABASE_USER=name-for-db-user
|
||||||
|
# DATABASE_PASSWORD=your-db-password-here
|
||||||
|
|
||||||
|
# Пути вычисляются автоматически внутри settings.py от PROJECT_ROOT
|
||||||
|
TOUCH_RELOAD=/app/logs/touch-reload.txt
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# EMAIL
|
# EMAIL
|
||||||
@@ -40,6 +51,7 @@ EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
|
|||||||
EMAIL_HOST=smtp.example.com
|
EMAIL_HOST=smtp.example.com
|
||||||
EMAIL_PORT=587
|
EMAIL_PORT=587
|
||||||
EMAIL_USE_TLS=True
|
EMAIL_USE_TLS=True
|
||||||
|
EMAIL_USE_SSL=False
|
||||||
EMAIL_HOST_USER=your-email@example.com
|
EMAIL_HOST_USER=your-email@example.com
|
||||||
EMAIL_HOST_PASSWORD=your-email-password
|
EMAIL_HOST_PASSWORD=your-email-password
|
||||||
|
|
||||||
@@ -100,7 +112,7 @@ LOG_LEVEL=INFO
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
# 1. Скопируйте этот файл:
|
# 1. Скопируйте этот файл:
|
||||||
# cp .env.example .env.local
|
# cp .env.sample .env.local
|
||||||
#
|
#
|
||||||
# 2. Отредактируйте значения в .env.local:
|
# 2. Отредактируйте значения в .env.local:
|
||||||
# nano .env.local
|
# nano .env.local
|
||||||
@@ -108,9 +120,8 @@ LOG_LEVEL=INFO
|
|||||||
# 3. Убедитесь, что .env.local в .gitignore:
|
# 3. Убедитесь, что .env.local в .gitignore:
|
||||||
# grep ".env" .gitignore
|
# grep ".env" .gitignore
|
||||||
#
|
#
|
||||||
# 4. Используйте python-dotenv для загрузки переменных в settings.py:
|
# 4. Экспортируйте переменные перед запуском Django:
|
||||||
# from dotenv import load_dotenv
|
# set -a; source .env.local; set +a
|
||||||
# load_dotenv()
|
|
||||||
#
|
#
|
||||||
# ВАЖНО:
|
# ВАЖНО:
|
||||||
# - НИКОГДА не коммитьте .env.local или файлы с реальными значениями в git!
|
# - НИКОГДА не коммитьте .env.local или файлы с реальными значениями в git!
|
||||||
|
|||||||
@@ -1,185 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
ШАБЛОН для my_secret.py
|
|
||||||
|
|
||||||
ИНСТРУКЦИЯ: скопируйте этот файл в my_secret.py и заполните реальные значения.
|
|
||||||
|
|
||||||
Пример:
|
|
||||||
cp oknardia/oknardia/my_secret__sample.py oknardia/oknardia/my_secret.py
|
|
||||||
# затем отредактируйте значения в my_secret.py
|
|
||||||
|
|
||||||
ВАЖНО: my_secret.py НИКОГДА не должен быть в git!
|
|
||||||
Используйте .gitignore для исключения файла.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# РАЗРАБОТКА (DEV) - Хосты и сетевые настройки
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# Хосты на которых может работать приложение (разработка)
|
|
||||||
MY_ALLOWED_HOSTS = [
|
|
||||||
'127.0.0.1',
|
|
||||||
'localhost',
|
|
||||||
'your-dev-hostname.local', # ИЗМЕНИТЕ на ваше имя хоста
|
|
||||||
]
|
|
||||||
|
|
||||||
# Допустимые хосты для разработки
|
|
||||||
MY_HOST_HOME1 = 'your-dev-hostname-windows' # ИЗМЕНИТЕ
|
|
||||||
MY_HOST_HOME2 = 'your-dev-hostname-mac' # ИЗМЕНИТЕ
|
|
||||||
MY_HOST_DEV = [MY_HOST_HOME1, MY_HOST_HOME2]
|
|
||||||
|
|
||||||
# Хосты для продакшена (заполнять с осторожностью)
|
|
||||||
MY_HOST_PROD = [] # На продакшене используйте переменные окружения!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# БЕЗОПАСНОСТЬ - Django SECRET_KEY
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
|
||||||
# Сгенерируйте новый ключ с помощью:
|
|
||||||
# python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
|
||||||
MY_SECRET_KEY = 'ЗАПОЛНИТЕ_СЛУЧАЙНОЙ_СТРОКОЙ_БОЛЬШОЙ_ДЛИНЫ'
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# АДМИНИСТРАТОРЫ - для оповещений об ошибках
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_ADMINS = (
|
|
||||||
('Your Name', 'your-email@example.com'),
|
|
||||||
('Admin Name', 'admin@example.com'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# ПУТИ К ФАЙЛАМ - разработка
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# путь к каталогу media (статика, для web-сервера nginx или apache)
|
|
||||||
MY_MEDIA_ROOT_DEV1 = 'M:\\path\\to\\your\\media\\' # Windows (если применимо)
|
|
||||||
MY_MEDIA_ROOT_DEV2 = '/path/to/your/media/' # Mac/Linux - ИЗМЕНИТЕ!
|
|
||||||
|
|
||||||
# путь к каталогу static (статика, для web-сервера nginx или apache)
|
|
||||||
MY_STATIC_ROOT_DEV1 = 'M:\\path\\to\\your\\static' # Windows (если применимо)
|
|
||||||
MY_STATIC_ROOT_DEV2 = '/path/to/your/static' # Mac/Linux - ИЗМЕНИТЕ!
|
|
||||||
|
|
||||||
# путь для кэш-блоков шаблонов
|
|
||||||
MY_STATIC_BASE_PATH_DEV1 = MY_STATIC_ROOT_DEV1
|
|
||||||
MY_STATIC_BASE_PATH_DEV2 = MY_STATIC_ROOT_DEV2
|
|
||||||
|
|
||||||
# путь для sitemap файлов
|
|
||||||
MY_SITEMAP_ROOT_DEV1 = 'M:\\path\\to\\your\\public\\' # Windows (если применимо)
|
|
||||||
MY_SITEMAP_ROOT_DEV2 = '/path/to/your/public/' # Mac/Linux - ИЗМЕНИТЕ!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# ПУТИ К ФАЙЛАМ - продакшен
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_MEDIA_ROOT_PROD = '/home/web/oknardia-ru/public/media/' # ЗАПОЛНИТЕ!
|
|
||||||
MY_STATIC_ROOT_PROD = '/home/web/oknardia-ru/public/static' # ЗАПОЛНИТЕ!
|
|
||||||
MY_STATIC_BASE_PATH_PROD = MY_STATIC_ROOT_PROD
|
|
||||||
MY_SITEMAP_ROOT_PROD = '/home/web/oknardia-ru/public/' # ЗАПОЛНИТЕ!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# EMAIL - Почтовый сервер (разработка)
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# Email адреса для разработки
|
|
||||||
MY_EMAIL_DEV = 'dev-email@example.com'
|
|
||||||
MY_EMAIL_FROM_DEV = 'dev-email@example.com'
|
|
||||||
MY_EMAIL_HOST_USER_DEV = 'your-email@smtp.example.com' # ЗАПОЛНИТЕ!
|
|
||||||
MY_EMAIL_HOST_PASSWORD_DEV = 'YOUR_EMAIL_PASSWORD' # ЗАПОЛНИТЕ!
|
|
||||||
MY_EMAIL_HOST_DEV = 'smtp.example.com' # ЗАПОЛНИТЕ! (например: smtp.mail.ru)
|
|
||||||
MY_EMAIL_PORT_DEV = 587 # ЗАПОЛНИТЕ! (обычно 587 или 2525)
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# EMAIL - Почтовый сервер (продакшен)
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_EMAIL_PROD = MY_EMAIL_DEV
|
|
||||||
MY_EMAIL_FROM_PROD = MY_EMAIL_FROM_DEV
|
|
||||||
MY_EMAIL_HOST_USER_PROD = MY_EMAIL_HOST_USER_DEV # На продакшене используйте env переменные!
|
|
||||||
MY_EMAIL_HOST_PASSWORD_PROD = MY_EMAIL_HOST_PASSWORD_DEV # На продакшене используйте env переменные!
|
|
||||||
MY_EMAIL_HOST_PROD = MY_EMAIL_HOST_DEV
|
|
||||||
MY_EMAIL_PORT_PROD = MY_EMAIL_PORT_DEV
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# БД MySQL/MariaDB - разработка
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_DATABASE_HOST_DEV1 = 'localhost' # Офисный сервер разработки - ИЗМЕНИТЕ!
|
|
||||||
MY_DATABASE_HOST_DEV2 = 'localhost' # Домашний сервер разработки - ИЗМЕНИТЕ!
|
|
||||||
|
|
||||||
MY_DATABASE_NAME_DEV = 'django_oknardia_dev' # ИЗМЕНИТЕ если нужно
|
|
||||||
MY_DATABASE_PORT_DEV = '3306' # Стандартный порт MySQL
|
|
||||||
|
|
||||||
MY_DATABASE_USER_DEV = 'web' # ИЗМЕНИТЕ если нужно
|
|
||||||
MY_DATABASE_PASSWORD_DEV = 'YOUR_DB_PASSWORD' # ЗАПОЛНИТЕ!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# БД MySQL/MariaDB - продакшен
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_DATABASE_HOST_PROD = 'localhost' # ЗАПОЛНИТЕ! (на продакшене)
|
|
||||||
MY_DATABASE_NAME_PROD = 'django_oknardia_prod' # ЗАПОЛНИТЕ!
|
|
||||||
|
|
||||||
MY_DATABASE_PORT_PROD = '3306'
|
|
||||||
MY_DATABASE_USER_PROD = 'web'
|
|
||||||
|
|
||||||
# ВНИМАНИЕ: На продакшене используйте переменные окружения или менеджер секретов!
|
|
||||||
MY_DATABASE_PASSWORD_PROD = '' # ОСТАВЬТЕ ПУСТО! Используйте переменные окружения!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# API ключи - Google Captcha
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# Получите ключи на https://www.google.com/recaptcha/admin
|
|
||||||
# ВАЖНО: Никогда не коммитьте реальные ключи в git!
|
|
||||||
# PRIVATE ключ - это СЕКРЕТ, держите его в безопасности!
|
|
||||||
MY_CAPTCHA_PUBLIC_KEY = 'YOUR_CAPTCHA_PUBLIC_KEY_HERE' # ЗАПОЛНИТЕ!
|
|
||||||
MY_CAPTCHA_PRIVATE_KEY = 'YOUR_CAPTCHA_PRIVATE_KEY_HERE' # ЗАПОЛНИТЕ! (СЕКРЕТ!)
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# API ключи - Yandex Maps
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# Получите ключ на https://developer.tech.yandex.ru/
|
|
||||||
MY_YANDEX_MAPS_API_KEY = 'YOUR_YANDEX_MAPS_API_KEY'
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# uWSGI - Touch-reload файл (для перезагрузки при изменении кода)
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
MY_TOUCH_RELOAD_DEV1 = 'M:\\path\\to\\touch-reload.txt' # Windows (если применимо)
|
|
||||||
MY_TOUCH_RELOAD_DEV2 = '/path/to/logs/touch-reload.txt' # Mac/Linux - ИЗМЕНИТЕ!
|
|
||||||
MY_TOUCH_RELOAD_PROD = '/home/web/oknardia-ru/logs/touch-reload.txt' # ЗАПОЛНИТЕ!
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# ИНСТРУКЦИЯ ПО ЗАПОЛНЕНИЮ
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
"""
|
|
||||||
1. СКОПИРУЙТЕ этот файл:
|
|
||||||
cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py
|
|
||||||
|
|
||||||
2. ОТРЕДАКТИРУЙТЕ значения, помеченные ИЗМЕНИТЕ! или ЗАПОЛНИТЕ!
|
|
||||||
|
|
||||||
3. УБЕДИТЕСЬ, что мой_secret.py в .gitignore:
|
|
||||||
grep my_secret .gitignore
|
|
||||||
|
|
||||||
4. НИКОГДА не коммитьте my_secret.py в git!
|
|
||||||
|
|
||||||
5. На ПРОДАКШЕНЕ используйте переменные окружения:
|
|
||||||
export DJANGO_SECRET_KEY="..."
|
|
||||||
export DATABASE_PASSWORD="..."
|
|
||||||
и т.д.
|
|
||||||
|
|
||||||
СОВЕТЫ:
|
|
||||||
- Сгенерируйте новый SECRET_KEY с помощью Python:
|
|
||||||
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
|
||||||
|
|
||||||
- Используйте менеджер паролей (LastPass, 1Password, Vault) для хранения учетных данных
|
|
||||||
|
|
||||||
- Регулярно меняйте пароли БД и API ключи
|
|
||||||
|
|
||||||
- На продакшене используйте отдельные более сильные пароли
|
|
||||||
"""
|
|
||||||
|
|
||||||
@@ -11,42 +11,50 @@ For the full list of settings and their values, see
|
|||||||
https://docs.djangoproject.com/en/4.1/ref/settings/
|
https://docs.djangoproject.com/en/4.1/ref/settings/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from oknardia.my_secret import *
|
import environ
|
||||||
import socket
|
|
||||||
|
|
||||||
|
def _env_admins(raw_items: list[str]) -> tuple[tuple[str, str], ...]:
|
||||||
|
# Формат: "Имя1:email1,Имя2:email2"
|
||||||
|
admins: list[tuple[str, str]] = []
|
||||||
|
for item in raw_items:
|
||||||
|
if ":" not in item:
|
||||||
|
continue
|
||||||
|
admin_name, admin_email = item.split(":", maxsplit=1)
|
||||||
|
admin_name = admin_name.strip()
|
||||||
|
admin_email = admin_email.strip()
|
||||||
|
if admin_name and admin_email:
|
||||||
|
admins.append((admin_name, admin_email))
|
||||||
|
return tuple(admins)
|
||||||
|
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
# Переключатель БД для DEV: по умолчанию используем SQLite.
|
|
||||||
# Чтобы вернуть MariaDB на DEV, установите OKNARDIA_USE_SQLITE_DEV=0
|
|
||||||
USE_SQLITE_DEV = os.getenv("OKNARDIA_USE_SQLITE_DEV", "1").strip().lower() in {
|
|
||||||
"1", "true", "yes", "on"
|
|
||||||
}
|
|
||||||
PROJECT_ROOT = BASE_DIR.parent
|
PROJECT_ROOT = BASE_DIR.parent
|
||||||
SQLITE_DB_PATH = PROJECT_ROOT / 'database' / 'oknadria.sqlite3'
|
PUBLIC_ROOT = PROJECT_ROOT / 'public'
|
||||||
|
STATIC_SOURCE_ROOT = PUBLIC_ROOT / 'static'
|
||||||
|
|
||||||
|
env = environ.Env()
|
||||||
|
environ.Env.read_env(str(PROJECT_ROOT / '.env'))
|
||||||
|
|
||||||
|
|
||||||
# Quick-start development settings - unsuitable for production
|
# Quick-start development settings - unsuitable for production
|
||||||
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
SECRET_KEY = 'django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch'
|
SECRET_KEY = env(
|
||||||
|
'DJANGO_SECRET_KEY',
|
||||||
|
default='django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch',
|
||||||
|
)
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
# ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене!
|
# ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене!
|
||||||
if socket.gethostname() in MY_HOST_DEV:
|
DEBUG = TEMPLATE_DEBUG = env.bool('DEBUG', default=False)
|
||||||
DEBUG = TEMPLATE_DEBUG = True
|
|
||||||
else:
|
|
||||||
# Все остальные хосты (подразумевается продакшн)
|
|
||||||
# DEBUG = TEMPLATE_DEBUG = True
|
|
||||||
DEBUG = TEMPLATE_DEBUG = False
|
|
||||||
|
|
||||||
ALLOWED_HOSTS = MY_ALLOWED_HOSTS
|
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['127.0.0.1', 'localhost'])
|
||||||
|
|
||||||
# Настройки сообщений об ошибках когда все упало и т.п.
|
# Настройки сообщений об ошибках когда все упало и т.п.
|
||||||
ADMINS = MY_ADMINS
|
ADMINS = _env_admins(env.list('ADMINS', default=[]))
|
||||||
|
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
@@ -124,83 +132,68 @@ DATETIME_FORMAT = 'Y-m-d H:i:s'
|
|||||||
# Статические файлы (CSS, JavaScript, Images)
|
# Статические файлы (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = '/static/'
|
||||||
MEDIA_URL = 'media/'
|
MEDIA_URL = '/media/'
|
||||||
|
|
||||||
|
|
||||||
if socket.gethostname() in MY_HOST_DEV: # DEBUG: заменяем настройки прода, на настройки девопа
|
MEDIA_ROOT = str(PUBLIC_ROOT / 'media')
|
||||||
MEDIA_ROOT = MY_MEDIA_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_MEDIA_ROOT_DEV2
|
# STATIC_ROOT отделен от исходной статики, чтобы избежать staticfiles.E002.
|
||||||
SITEMAP_ROOT = MY_SITEMAP_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_SITEMAP_ROOT_DEV2
|
STATIC_ROOT = str(PUBLIC_ROOT / 'static_collected')
|
||||||
# STATIC_ROOT = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2
|
SITEMAP_ROOT = str(PUBLIC_ROOT)
|
||||||
dev_static_from_secret = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2
|
|
||||||
# Если путь из секрета устарел, используем путь текущего репозитория.
|
# Каталоги, откуда Django читает исходную статику в DEBUG-режиме.
|
||||||
dev_static_fallback = PROJECT_ROOT / 'public' / 'static'
|
STATICFILES_DIRS = [
|
||||||
dev_static_path = dev_static_from_secret if os.path.isdir(dev_static_from_secret) else str(dev_static_fallback)
|
str(STATIC_SOURCE_ROOT)
|
||||||
STATICFILES_DIRS = [dev_static_path]
|
] if STATIC_SOURCE_ROOT.is_dir() else []
|
||||||
# путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов)
|
|
||||||
dev_static_base_from_secret = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2
|
# Путь к каталогу static для генерации кэш-файлов и служебных JS.
|
||||||
STATIC_BASE_PATH = dev_static_base_from_secret if os.path.isdir(dev_static_base_from_secret) else str(dev_static_fallback)
|
STATIC_BASE_PATH = str(STATIC_SOURCE_ROOT)
|
||||||
if USE_SQLITE_DEV:
|
|
||||||
|
database_engine = env('DATABASE_ENGINE', default='django.db.backends.sqlite3')
|
||||||
|
if database_engine == 'django.db.backends.sqlite3':
|
||||||
|
# Для SQLite принимаем только имя файла из env и кладем БД в PROJECT_ROOT/database.
|
||||||
|
sqlite_db_filename = Path(env('DATABASE_NAME', default='oknadria.sqlite3')).name
|
||||||
|
sqlite_db_path = PROJECT_ROOT / 'database' / sqlite_db_filename
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
'NAME': SQLITE_DB_PATH,
|
'NAME': str(sqlite_db_path),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else:
|
|
||||||
DATABASES = {
|
|
||||||
'default': {
|
|
||||||
'ENGINE': "django.db.backends.mysql",
|
|
||||||
'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2,
|
|
||||||
'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3.
|
|
||||||
'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3.
|
|
||||||
'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3.
|
|
||||||
'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3.
|
|
||||||
# 'OPTIONS': { 'autocommit': True, }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TOUCH_RELOAD = MY_TOUCH_RELOAD_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_TOUCH_RELOAD_DEV2
|
|
||||||
else:
|
else:
|
||||||
MEDIA_ROOT = MY_MEDIA_ROOT_PROD
|
|
||||||
# STATICFILES_DIRS = [MY_STATIC_ROOT_PROD1, ]
|
|
||||||
STATIC_ROOT = MY_STATIC_ROOT_PROD
|
|
||||||
SITEMAP_ROOT = MY_SITEMAP_ROOT_PROD
|
|
||||||
# путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов)
|
|
||||||
STATIC_BASE_PATH = MY_STATIC_BASE_PATH_PROD
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': "django.db.backends.mysql",
|
'ENGINE': database_engine,
|
||||||
'HOST': MY_DATABASE_HOST_PROD, # Set to "" for localhost. Not used with sqlite3.
|
'HOST': env('DATABASE_HOST', default='localhost'),
|
||||||
'PORT': MY_DATABASE_PORT_PROD, # Set to "" for default. Not used with sqlite3.
|
'PORT': env('DATABASE_PORT', default='3306'),
|
||||||
'NAME': MY_DATABASE_NAME_PROD, # Not used with sqlite3.
|
'NAME': env('DATABASE_NAME', default=''),
|
||||||
'USER': MY_DATABASE_USER_PROD, # Not used with sqlite3.
|
'USER': env('DATABASE_USER', default=''),
|
||||||
'PASSWORD': MY_DATABASE_PASSWORD_PROD, # Not used with sqlite3.
|
'PASSWORD': env('DATABASE_PASSWORD', default=''),
|
||||||
# 'OPTIONS': { 'autocommit': True, }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TOUCH_RELOAD = MY_TOUCH_RELOAD_PROD
|
|
||||||
|
|
||||||
# Для локальной/тестовой разработки можно принудительно включить SQLite даже
|
TOUCH_RELOAD = env('TOUCH_RELOAD', default='')
|
||||||
# если hostname не попал в MY_HOST_DEV. На прод-хостах (MY_HOST_PROD) override
|
|
||||||
# не применяется.
|
|
||||||
if USE_SQLITE_DEV and socket.gethostname() not in MY_HOST_PROD:
|
|
||||||
DATABASES = {
|
|
||||||
'default': {
|
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
|
||||||
'NAME': SQLITE_DB_PATH,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
# настройки для почтового сервера (они одинаковые для DEV и PROD)
|
# настройки для почтового сервера (они одинаковые для DEV и PROD)
|
||||||
EMAIL_HOST = MY_EMAIL_HOST_DEV
|
EMAIL_BACKEND = env(
|
||||||
EMAIL_PORT = MY_EMAIL_PORT_DEV
|
'EMAIL_BACKEND',
|
||||||
EMAIL_HOST_USER = MY_EMAIL_HOST_USER_DEV
|
default='django.core.mail.backends.smtp.EmailBackend',
|
||||||
EMAIL_HOST_PASSWORD = MY_EMAIL_HOST_PASSWORD_DEV
|
)
|
||||||
SERVER_EMAIL = DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
|
EMAIL_HOST = env('EMAIL_HOST', default='localhost')
|
||||||
EMAIL_USE_TLS = True
|
EMAIL_PORT = env.int('EMAIL_PORT', default=25)
|
||||||
|
EMAIL_HOST_USER = env('EMAIL_HOST_USER', default='')
|
||||||
|
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD', default='')
|
||||||
|
EMAIL_USE_TLS = env.bool('EMAIL_USE_TLS', default=True)
|
||||||
|
EMAIL_USE_SSL = env.bool('EMAIL_USE_SSL', default=False)
|
||||||
|
DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default=EMAIL_HOST_USER)
|
||||||
|
SERVER_EMAIL = env('SERVER_EMAIL', default=DEFAULT_FROM_EMAIL)
|
||||||
EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещений об ошибках и необработанных исключениях
|
EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещений об ошибках и необработанных исключениях
|
||||||
|
|
||||||
|
SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False)
|
||||||
|
SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', default=False)
|
||||||
|
CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', default=False)
|
||||||
|
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||||
@@ -208,8 +201,8 @@ EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещ
|
|||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
# ключи для Google Captha
|
# ключи для Google Captha
|
||||||
CAPTCHA_PUBLIC_KEY = MY_CAPTCHA_PUBLIC_KEY
|
CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='')
|
||||||
CAPTCHA_PRIVATE_KEY = MY_CAPTCHA_PRIVATE_KEY
|
CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='')
|
||||||
|
|
||||||
# количество коммерческих предложений во фреме отчета
|
# количество коммерческих предложений во фреме отчета
|
||||||
OFFER_PER_FRAME = 5
|
OFFER_PER_FRAME = 5
|
||||||
@@ -303,4 +296,4 @@ CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1
|
|||||||
|
|
||||||
MAX_LEN_RING_LOG_BUFFER = 250 # МАКСИМАЛЬНЫЙ РАЗМЕР КОЛЬЦЕВОГО БУФЕРА
|
MAX_LEN_RING_LOG_BUFFER = 250 # МАКСИМАЛЬНЫЙ РАЗМЕР КОЛЬЦЕВОГО БУФЕРА
|
||||||
|
|
||||||
YANDEX_MAPS_API_KEY = MY_YANDEX_MAPS_API_KEY
|
YANDEX_MAPS_API_KEY = env('YANDEX_MAPS_API_KEY', default='')
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
Django==4.1.5
|
Django==4.1.5
|
||||||
|
django-environ==0.11.2
|
||||||
asgiref==3.6.0
|
asgiref==3.6.0
|
||||||
sqlparse==0.4.3
|
sqlparse==0.4.3
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
Django==4.1.5
|
Django==4.1.5
|
||||||
|
django-environ==0.11.2
|
||||||
asgiref==3.6.0
|
asgiref==3.6.0
|
||||||
sqlparse==0.4.3
|
sqlparse==0.4.3
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user