289 lines
8.8 KiB
Python
289 lines
8.8 KiB
Python
from pathlib import Path
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
|
|
SECRET_KEY = "change-me-in-production"
|
|
DEBUG = False
|
|
ALLOWED_HOSTS = []
|
|
|
|
INSTALLED_APPS = [
|
|
"django.contrib.admin",
|
|
"django.contrib.auth",
|
|
"django.contrib.contenttypes",
|
|
"django.contrib.sessions",
|
|
"django.contrib.messages",
|
|
"django.contrib.staticfiles",
|
|
"rest_framework",
|
|
"django_filters",
|
|
"corsheaders",
|
|
"django_celery_results",
|
|
"django_celery_beat",
|
|
"infrasynth.audit",
|
|
"infrasynth.security",
|
|
"infrasynth.files",
|
|
"infrasynth.notifications",
|
|
"infrasynth.webhooks",
|
|
"infrasynth.workflows",
|
|
"infrasynth.scheduler",
|
|
"infrasynth.features",
|
|
"infrasynth.billing",
|
|
]
|
|
|
|
MIDDLEWARE = [
|
|
"django.middleware.security.SecurityMiddleware",
|
|
"corsheaders.middleware.CorsMiddleware",
|
|
"django.contrib.sessions.middleware.SessionMiddleware",
|
|
"django.middleware.common.CommonMiddleware",
|
|
"django.middleware.csrf.CsrfViewMiddleware",
|
|
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
|
"infrasynth.security.auth.middleware.JWTAuthenticationMiddleware",
|
|
"infrasynth.security.two_factor.middleware.TwoFactorMiddleware",
|
|
"django.contrib.messages.middleware.MessageMiddleware",
|
|
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
|
"infrasynth.audit.middleware.AuditAPIMiddleware",
|
|
]
|
|
|
|
ROOT_URLCONF = "config.urls"
|
|
|
|
TEMPLATES = [
|
|
{
|
|
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
|
"DIRS": [],
|
|
"APP_DIRS": True,
|
|
"OPTIONS": {
|
|
"context_processors": [
|
|
"django.template.context_processors.debug",
|
|
"django.template.context_processors.request",
|
|
"django.contrib.auth.context_processors.auth",
|
|
"django.contrib.messages.context_processors.messages",
|
|
],
|
|
},
|
|
},
|
|
]
|
|
|
|
WSGI_APPLICATION = "config.wsgi.application"
|
|
|
|
LANGUAGE_CODE = "es"
|
|
TIME_ZONE = "America/Bogota"
|
|
USE_TZ = True
|
|
STATIC_URL = "static/"
|
|
MEDIA_URL = "media/"
|
|
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
|
|
|
MIGRATION_MODULES = {
|
|
"infrasynth_audit": "infrasynth.audit.migrations",
|
|
"infrasynth_security": "infrasynth.security.migrations",
|
|
"infrasynth_files": "infrasynth.files.migrations",
|
|
"infrasynth_notifications": "infrasynth.notifications.migrations",
|
|
"infrasynth_webhooks": "infrasynth.webhooks.migrations",
|
|
"infrasynth_workflows": "infrasynth.workflows.migrations",
|
|
"infrasynth_scheduler": "infrasynth.scheduler.migrations",
|
|
"infrasynth_features": "infrasynth.features.migrations",
|
|
"infrasynth_billing": "infrasynth.billing.migrations",
|
|
}
|
|
|
|
DATABASES = {
|
|
"default": {
|
|
"ENGINE": "django.db.backends.postgresql",
|
|
"NAME": "infrasynth",
|
|
"USER": "infrasynth",
|
|
"PASSWORD": "infrasynth",
|
|
"HOST": "localhost",
|
|
"PORT": "5432",
|
|
},
|
|
}
|
|
|
|
REST_FRAMEWORK = {
|
|
"DEFAULT_AUTHENTICATION_CLASSES": [
|
|
"infrasynth.security.auth.cookies.CookieJWTAuthentication",
|
|
"infrasynth.security.auth.api_keys.APIKeyAuthentication",
|
|
],
|
|
"DEFAULT_PERMISSION_CLASSES": [
|
|
"rest_framework.permissions.IsAuthenticated",
|
|
],
|
|
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
|
|
"PAGE_SIZE": 25,
|
|
"DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"],
|
|
}
|
|
|
|
CELERY_BROKER_URL = "redis://localhost:6379/0"
|
|
CELERY_RESULT_BACKEND = "redis://localhost:6379/1"
|
|
CELERY_RESULT_EXTENDED = True
|
|
CELERY_TASK_SOFT_TIME_LIMIT = 300
|
|
CELERY_TASK_TIME_LIMIT = 600
|
|
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
|
|
CELERY_ACCEPT_CONTENT = ["json"]
|
|
CELERY_TASK_SERIALIZER = "json"
|
|
CELERY_RESULT_SERIALIZER = "json"
|
|
|
|
CACHES = {
|
|
"default": {
|
|
"BACKEND": "django.core.cache.backends.redis.RedisCache",
|
|
"LOCATION": "redis://localhost:6379/1",
|
|
},
|
|
}
|
|
|
|
INFRASYNTH_AUDIT = {
|
|
"EXCLUDED_MODELS": [
|
|
"sessions.Session",
|
|
"admin.LogEntry",
|
|
"contenttypes.ContentType",
|
|
"migrations.Migration",
|
|
"infrasynth_audit.ModelChangeLog",
|
|
"infrasynth_audit.APIInteractionLog",
|
|
"infrasynth_audit.SecurityEvent",
|
|
"infrasynth_features.FeatureFlag",
|
|
"infrasynth_features.FeatureFlagOverride",
|
|
],
|
|
"EXCLUDED_FIELDS": ["password", "token", "secret", "credit_card"],
|
|
"SENSITIVE_KEYS": ["password", "token", "secret", "authorization", "api_key"],
|
|
"MAX_BODY_SIZE_BYTES": 5000,
|
|
"STORE_IN_DB": True,
|
|
"RETENTION_DAYS": 365,
|
|
"ENABLE_API_LOGGING": True,
|
|
"ENABLE_MODEL_CHANGE_TRACKING": True,
|
|
"ENABLE_SECURITY_EVENTS": True,
|
|
}
|
|
|
|
INFRASYNTH_SECURITY = {
|
|
"ACCESS_TOKEN_LIFETIME_MINUTES": 30,
|
|
"REFRESH_TOKEN_LIFETIME_DAYS": 7,
|
|
"ROTATE_REFRESH_TOKENS": True,
|
|
"BLACKLIST_AFTER_ROTATION": True,
|
|
"ACCESS_COOKIE_NAME": "access_token",
|
|
"REFRESH_COOKIE_NAME": "refresh_token",
|
|
"COOKIE_SECURE": True,
|
|
"COOKIE_HTTPONLY": True,
|
|
"COOKIE_SAMESITE": "Lax",
|
|
"PRE_AUTH_COOKIE_NAME": "pre_auth_token",
|
|
"CRYPTO_KEY": None,
|
|
"AUTH_BACKEND_CLASS": "infrasynth.security.auth.backends.EmailOrUsernameBackend",
|
|
"LOGIN_RATE_LIMIT": "10/m",
|
|
"IP_BLACKLIST_THRESHOLD": 100,
|
|
"IP_BLACKLIST_WINDOW_MINUTES": 15,
|
|
"TWO_FACTOR_ISSUER_NAME": "InfraSynth",
|
|
"TWO_FACTOR_RECOVERY_CODES_COUNT": 8,
|
|
"TWO_FACTOR_TOTP_VALIDITY_WINDOW": 1,
|
|
"PRE_AUTH_TOKEN_LIFETIME_MINUTES": 5,
|
|
"ALTCHA_DIFFICULTY": 10000,
|
|
"ALTCHA_CHALLENGE_EXPIRY_SECONDS": 300,
|
|
"API_KEY_PREFIX_LENGTH": 8,
|
|
"API_KEY_HASH_ALGORITHM": "pbkdf2_sha256",
|
|
"API_KEY_DEFAULT_EXPIRY_DAYS": 365,
|
|
"PASSWORD_MIN_LENGTH": 8,
|
|
"PASSWORD_REQUIRE_UPPERCASE": True,
|
|
"PASSWORD_REQUIRE_DIGIT": True,
|
|
"PASSWORD_REQUIRE_SPECIAL_CHAR": True,
|
|
}
|
|
|
|
AUTHENTICATION_BACKENDS = [
|
|
INFRASYNTH_SECURITY["AUTH_BACKEND_CLASS"],
|
|
]
|
|
|
|
INFRASYNTH_FILES = {
|
|
"DEFAULT_STORAGE_BACKEND": "local",
|
|
"STORAGE_BACKENDS": {
|
|
"S3": {
|
|
"ACCESS_KEY": None,
|
|
"SECRET_KEY": None,
|
|
"BUCKET_NAME": None,
|
|
"REGION": "us-east-1",
|
|
"ENDPOINT_URL": None,
|
|
},
|
|
"cloudinary": {
|
|
"CLOUD_NAME": None,
|
|
"API_KEY": None,
|
|
"API_SECRET": None,
|
|
},
|
|
"gcs": {
|
|
"PROJECT_ID": None,
|
|
"BUCKET_NAME": None,
|
|
"CREDENTIALS_PATH": None,
|
|
},
|
|
"local": {},
|
|
},
|
|
"SIGNED_URL_EXPIRY_SECONDS": 3600,
|
|
"MAX_UPLOAD_SIZE_MB": 100,
|
|
"ENABLE_PROCESSING_PIPELINES": True,
|
|
"PROCESSING_BACKEND": "celery",
|
|
"ENABLE_X_SENDFILE": False,
|
|
}
|
|
|
|
INFRASYNTH_NOTIFICATIONS = {
|
|
"DEFAULT_FROM_EMAIL": "noreply@example.com",
|
|
"DEFAULT_FROM_SMS": "+1234567890",
|
|
"CHANNELS": {
|
|
"email": {
|
|
"primary": "infrasynth.notifications.channels.email_smtp.SMTPChannel",
|
|
"fallback": "infrasynth.notifications.channels.email_sendgrid.SendGridChannel",
|
|
},
|
|
"sms": {
|
|
"primary": "infrasynth.notifications.channels.sms_twilio.TwilioSMSChannel",
|
|
},
|
|
},
|
|
"DISPATCH_BACKEND": "celery",
|
|
"MAX_RETRIES": 3,
|
|
"RETRY_DELAY_SECONDS": [60, 300, 900],
|
|
"TEMPLATE_ENGINE": "django",
|
|
"RATE_LIMIT_PER_CHANNEL": {
|
|
"email": "50/m",
|
|
"sms": "10/m",
|
|
},
|
|
"STORE_DISPATCH_LOGS": True,
|
|
"DISPATCH_LOG_RETENTION_DAYS": 90,
|
|
}
|
|
|
|
INFRASYNTH_WEBHOOKS = {
|
|
"DEFAULT_TIMEOUT_SECONDS": 10,
|
|
"MAX_RETRIES": 5,
|
|
"RETRY_BACKOFF": "exponential",
|
|
"RETRY_INITIAL_DELAY_SECONDS": 60,
|
|
"SIGNATURE_ALGORITHM": "sha256",
|
|
"SIGNATURE_HEADER": "X-Webhook-Signature",
|
|
"DELIVERY_BACKEND": "celery",
|
|
"INBOUND_SIGNATURE_TOLERANCE_SECONDS": 300,
|
|
"MAX_PAYLOAD_SIZE_BYTES": 1048576,
|
|
}
|
|
|
|
INFRASYNTH_WORKFLOWS = {
|
|
"MAX_INSTANCES_PER_WORKFLOW": 10000,
|
|
"DEFAULT_APPROVAL_STRATEGY": "ALL",
|
|
"AUTO_CLONE_ASSIGNEES_ON_REENTRY": True,
|
|
"ALLOW_SELF_ASSIGNMENT": False,
|
|
"ROUTE_MAX_DEPTH": 50,
|
|
}
|
|
|
|
INFRASYNTH_SCHEDULER = {
|
|
"BACKEND": "celery",
|
|
"CELERY_BROKER_URL": "redis://localhost:6379/0",
|
|
"CELERY_RESULT_BACKEND": "redis://localhost:6379/1",
|
|
"CELERY_TASK_SOFT_TIME_LIMIT": 300,
|
|
"CELERY_TASK_TIME_LIMIT": 600,
|
|
"CELERY_WORKER_PREFETCH_MULTIPLIER": 1,
|
|
"DEFAULT_QUEUE": "default",
|
|
"MAX_EXECUTION_HISTORY_PER_TASK": 1000,
|
|
"AUTO_DISCOVER_TASKS": True,
|
|
}
|
|
|
|
INFRASYNTH_FEATURES = {
|
|
"CACHE_BACKEND": "default",
|
|
"CACHE_TTL_SECONDS": 60,
|
|
"CACHE_KEY_PREFIX": "features",
|
|
"ROLLOUT_HASH_ALGORITHM": "md5",
|
|
"AUTO_REGISTER_FROM_SETTINGS": True,
|
|
"EXPOSE_PERMISSIONS_IN_ACTIVE_ENDPOINT": True,
|
|
"EXPOSE_ROLES_IN_ACTIVE_ENDPOINT": True,
|
|
}
|
|
|
|
INFRASYNTH_BILLING = {
|
|
"INVOICE_NUMBER_PREFIX": "INV-",
|
|
"INVOICE_PDF_TEMPLATE": "billing/invoice_pdf.html",
|
|
"GRACE_PERIOD_DAYS": 5,
|
|
"MAX_RETRY_FAILED_PAYMENTS": 3,
|
|
"DEFAULT_CURRENCY": "USD",
|
|
"TAX_PERCENTAGE": 0,
|
|
"TAX_NAME": "",
|
|
"INVOICE_GENERATION_DAYS_BEFORE_RENEWAL": 3,
|
|
"WEBHOOK_TOLERANCE_SECONDS": 300,
|
|
"SYNC_SUBSCRIPTIONS_EVERY_HOURS": 24,
|
|
}
|