robosats/robosats/settings.py
2023-11-14 13:54:51 +00:00

286 lines
8.2 KiB
Python

"""
Django settings for robosats project.
Generated by 'django-admin startproject' using Django 4.0.
WATCH OUT RoboSats backend was later downgraded to Django 3.2 (compatibility with existing plugins!)
For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""
import json
import os
import textwrap
from pathlib import Path
from decouple import config
from .celery.conf import * # noqa
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = "/static/"
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config("SECRET_KEY")
DEBUG = False
STATIC_URL = "static/"
STATIC_ROOT = "/usr/src/static/"
# RoboSats version
with open("version.json") as f:
VERSION = json.load(f)
# SECURITY WARNING: don't run with debug turned on in production!
if config("DEVELOPMENT", default=False):
DEBUG = True
STATIC_ROOT = "frontend/static/"
AVATAR_ROOT = STATIC_ROOT + "assets/avatars/"
ALLOWED_HOSTS = [
config("HOST_NAME"),
config("HOST_NAME2"),
config("I2P_ALIAS"),
config("I2P_LONG"),
config("LOCAL_ALIAS"),
"127.0.0.1",
"localhost",
]
CORS_ALLOW_ALL_ORIGINS = True
# Allows Session Cookie to be read by Javascript on Client side.
SESSION_COOKIE_HTTPONLY = False
# Logging settings
if os.environ.get("LOG_TO_CONSOLE"):
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"console": {
"class": "logging.StreamHandler",
},
},
"root": {
"handlers": ["console"],
"level": "WARNING",
},
"loggers": {
"api.utils": {
"handlers": ["console"],
"level": "WARNING",
},
},
}
# Application definition
INSTALLED_APPS = [
"daphne",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"channels",
"django.contrib.staticfiles",
"corsheaders",
"rest_framework",
"rest_framework.authtoken",
"django_celery_beat",
"django_celery_results",
"import_export",
"api",
"chat",
"control",
"frontend",
"drf_spectacular",
"drf_spectacular_sidecar", # required for Django collectstatic discovery
]
REST_FRAMEWORK = {
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",
],
}
SPECTACULAR_SETTINGS = {
"TITLE": "RoboSats REST API",
"DESCRIPTION": textwrap.dedent(
"""
REST API Documentation for [RoboSats](https://learn.robosats.com) - A Simple and Private LN P2P Exchange
<p style='background-color:#fff0f0;padding:16px;border-radius:6px;border:2px solid #ffd3d3'>
<span style='color:#f31f1f;font-weight:bold'>Note:</span>
The RoboSats REST API is on v0, which in other words, is beta.
We recommend that if you don't have time to actively maintain
your project, do not build it with v0 of the API. A refactored, simpler
and more stable version - v1 will be released soon™.
</p>
"""
),
"VERSION": f"{VERSION['major']}.{VERSION['minor']}.{VERSION['patch']}",
"SERVE_INCLUDE_SCHEMA": False,
"SWAGGER_UI_DIST": "SIDECAR", # shorthand to use the sidecar instead
"SWAGGER_UI_FAVICON_HREF": "SIDECAR",
"REDOC_UI_SETTINGS": {
"expandResponses": "200,201",
},
"EXTENSIONS_INFO": {
"x-logo": {
"url": "https://raw.githubusercontent.com/Reckless-Satoshi/robosats/main/frontend/static/assets/images/robosats-0.1.1-banner.png",
"backgroundColor": "#FFFFFF",
"altText": "RoboSats logo",
}
},
"REDOC_DIST": "SIDECAR",
}
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"robosats.middleware.DisableCSRFMiddleware",
"robosats.middleware.SplitAuthorizationHeaderMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"robosats.middleware.RobotTokenSHA256AuthenticationMiddleWare",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"django.middleware.common.CommonMiddleware",
]
ROOT_URLCONF = "robosats.urls"
IMPORT_EXPORT_USE_TRANSACTIONS = True
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 = "robosats.wsgi.application"
# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": config("POSTGRES_DB"),
"USER": config("POSTGRES_USER"),
"PASSWORD": config("POSTGRES_PASSWORD"),
"HOST": config("POSTGRES_HOST"),
"PORT": config("POSTGRES_PORT"),
}
}
# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/
LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
STATIC_URL = "static/"
ASGI_APPLICATION = "robosats.routing.application"
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [config("REDIS_URL")],
},
},
}
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": config("REDIS_URL"),
"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"},
}
}
# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
#####################################################################
# RoboSats API settings. These should remain the same across
# all coordinators. Altering will require a DB migration.
# Do not change unless you know what you are doing.
# If there is a value here you would like to tweak or play with,
# there is possibly a better way to do it! E.g. the .env file
# Trade limits in satoshis to be applied as DB validator/constrain
MIN_TRADE = 20_000
MAX_TRADE = 5_000_000
# Time a order is public in the book HOURS
DEFAULT_PUBLIC_ORDER_DURATION = 24
# Max value API will accept for public duration (cannot be higher than 24h, hardcoded as DB validator)
MAX_PUBLIC_ORDER_DURATION = 24
# Max value API will accept for public duration (cannot be higher than 24h, hardcoded as DB validator)
MIN_PUBLIC_ORDER_DURATION = 0.166
# Bond size as percentage (%)
DEFAULT_BOND_SIZE = float(3)
MIN_BOND_SIZE = float(2)
MAX_BOND_SIZE = float(15)
# Default time to provide a valid invoice and the trade escrow MINUTES
INVOICE_AND_ESCROW_DURATION = 180
# Time to confirm chat and confirm fiat (time to Fiat Sent confirmation) HOURS
FIAT_EXCHANGE_DURATION = 24