96 lines
4.2 KiB
Python
96 lines
4.2 KiB
Python
import os
|
|
from pathlib import Path
|
|
|
|
import environ
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
|
|
env = environ.Env()
|
|
env_file = BASE_DIR / '.env'
|
|
|
|
|
|
if os.path.exists(env_file):
|
|
environ.Env.read_env(env_file)
|
|
|
|
SECRET_KEY = env.str('SECRET_KEY')
|
|
DEBUG = env.bool('DEBUG', False)
|
|
|
|
CORS_ORIGIN_WHITELIST = env.str('CORS_ORIGIN_WHITELIST', 'http://localhost:8000').split(',')
|
|
CSRF_TRUSTED_ORIGINS = env.str('CSRF_TRUSTED_ORIGINS', 'http://localhost:8000').split(',')
|
|
# La cookie CSRF solo hace falta leerla desde JS en sitios que la mandan a
|
|
# mano en una cabecera (fetch/XHR); aquí no la lee ningún script (los POST
|
|
# de HTMX/fetch usan el token embebido en el HTML vía csrf_token, ver
|
|
# account_settings.html/csrf.js), así que no hay motivo para exponerla al
|
|
# DOM y sí para quitarle esa superficie a un XSS.
|
|
CSRF_COOKIE_HTTPONLY = True
|
|
|
|
DATABASE_URL = env.db_url('DATABASE_URL', 'sqlite:///db.sqlite3')
|
|
|
|
REDIS_HOST = env.str('REDIS_HOST', 'redis')
|
|
REDIS_PORT = env.str('REDIS_PORT', 6379)
|
|
|
|
PAGE_SIZE = env.int('PAGE_SIZE', 20)
|
|
ALLOWED_HOSTS = env.str('ALLOWED_HOSTS').split(',')
|
|
|
|
CELERY_BROKER_URL = env.str('CELERY_BROKER_URL', 'redis://172.17.0.1:6379/0')
|
|
|
|
S3_ENABLED = env.bool('S3_ENABLED', False)
|
|
|
|
AWS_S3_HOST = env.str('S3_HOST', '')
|
|
AWS_ACCESS_KEY_ID = env.str('S3_ACCESS_KEY_ID', '')
|
|
AWS_SECRET_ACCESS_KEY = env.str('S3_SECRET_ACCESS_KEY', '')
|
|
AWS_STORAGE_BUCKET_NAME = env.str('S3_STORAGE_BUCKET_NAME', '')
|
|
AWS_S3_ENDPOINT_URL = env.str('S3_ENDPOINT_URL', '')
|
|
# Compatibilidad con Garage (ver docker-compose.yml/garage.toml, S3
|
|
# self-hosted para desarrollo local): a diferencia de AWS S3, exige indicar
|
|
# la región a mano y no soporta el estilo de direccionamiento "virtual"
|
|
# (bucket como subdominio) por defecto.
|
|
AWS_S3_REGION_NAME = env.str('S3_REGION_NAME', '')
|
|
AWS_S3_USE_SSL = env.bool('S3_USE_SSL', True)
|
|
AWS_S3_ADDRESSING_STYLE = env.str('S3_ADDRESSING_STYLE', 'auto')
|
|
|
|
ITEMS_PER_PAGE = env.int('ITEMS_PER_PAGE', 20)
|
|
|
|
EMAIL_BACKEND = env.str('EMAIL_BACKEND', 'django.core.mail.backends.console.EmailBackend')
|
|
EMAIL_HOST = env.str('EMAIL_HOST', '')
|
|
EMAIL_HOST_USER = env.str('EMAIL_HOST_USER', '')
|
|
EMAIL_HOST_PASSWORD = env.str('EMAIL_HOST_PASSWORD', '')
|
|
EMAIL_PORT = env.int('EMAIL_PORT', 587)
|
|
DEFAULT_FROM_EMAIL = env.str('DEFAULT_FROM_EMAIL', 'webmaster@localhost')
|
|
|
|
# A dónde se remite al usuario en el aviso de cambio de email (ver
|
|
# EmailUpdateForm) por si el cambio no lo ha hecho él.
|
|
SUPPORT_EMAIL = env.str('SUPPORT_EMAIL', 'soporte@localhost')
|
|
|
|
# Nombre mostrado en el navbar, el <title> y los emails de aviso de la
|
|
# cuenta (ver EmailUpdateForm/StyledPasswordChangeForm/AccountDeleteForm).
|
|
SITE_NAME = env.str('SITE_NAME', 'Crochet')
|
|
|
|
LOG_LEVEL = env.str('LOG_LEVEL', 'INFO')
|
|
|
|
# Limitación de peticiones (ver crochet/views.py: login, registro,
|
|
# recuperación de contraseña y verificación en dos pasos) con
|
|
# django-ratelimit. Usa el cache framework de Django (settings.CACHES,
|
|
# "default" por defecto: LocMemCache si no se configura otra cosa) para
|
|
# contar peticiones; LocMemCache es propio de cada proceso, así que con
|
|
# más de un worker/instancia en producción el límite real es "por
|
|
# proceso", no global — configura ahí un backend compartido (Redis,
|
|
# Memcached) si eso te importa.
|
|
RATELIMIT_ENABLE = env.bool('RATELIMIT_ENABLE', True)
|
|
|
|
# Cabeceras/cookies de seguridad para servir por HTTPS en producción. Todo
|
|
# esto viene desactivado por defecto porque en desarrollo local se sirve
|
|
# por HTTP plano (activarlo ahí dejaría la app inaccesible o el navegador
|
|
# descartando las cookies de sesión/CSRF). Actívalo en el .env de
|
|
# producción una vez la app esté detrás de HTTPS de verdad.
|
|
SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', False)
|
|
SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', False)
|
|
CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', False)
|
|
# En segundos; 0 desactiva HSTS. Empieza bajo (p. ej. 3600) para probar en
|
|
# producción antes de subirlo a un valor largo (p. ej. 31536000 = 1 año):
|
|
# un valor largo con la configuración equivocada deja el dominio
|
|
# inaccesible por HTTPS durante ese tiempo para quien ya lo haya recibido.
|
|
SECURE_HSTS_SECONDS = env.int('SECURE_HSTS_SECONDS', 0)
|
|
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool('SECURE_HSTS_INCLUDE_SUBDOMAINS', False)
|
|
SECURE_HSTS_PRELOAD = env.bool('SECURE_HSTS_PRELOAD', False)
|