1.4. Конфигурация системы
В данном разделе описываются конфигурационные опции системы, какие значения они принимают и как влияют на работу системы. Опции размещаются в 2-х файлах в корневом разделе системы.
Основной файл config.py
.
Он находится под управлением системы контроля версий,
описывает общие настройки проекта, которые не зависят от типа развертывания
(production / stage / test / dev).
Этот файл не должен содержать в себе паролей и секретных ключей системы,
так как в случае попадания в чужие руки,
злоумышленник вместе с кодом может узнать и пароли от нее.
Опции конфигурации, значения которых желательно держать в секрете,
в этом файле описываются в виде «*****».
Дополнительный файл config_local.py
Находится вне системы управления версиями и перекрывает все настройки
файла config.py
. В нем мы размещаем настройки паролей, секретных ключей
и настройки, специфичные для типа развертывания (например, если тестовый
и рабочий сервер находятся на одном сервере и соединяются к разным базам данных
и имеют разные кэши, чтобы не мешать друг другу).
Приложение использует внешние библиотеки. О их опциях конфигурации можно узнать
import os
# Абсолютный путь к корневой директории проекта
BASE_DIR = os.path.abspath('.')
# Режим отладки и тестирования
DEBUG = False
TESTING = False
SECRET_KEY = '******************************************************'
PRESERVE_CONTEXT_ON_EXCEPTION = False # Дополнительная информация о контексте при ошибках
# Настройки подключения к базе данных
SQLALCHEMY_DATABASE_URI = 'postgresql://sphere_user:*********@localhost/expertise'
SQLALCHEMY_BINDS = {
'reports': SQLALCHEMY_DATABASE_URI,
}
SQLALCHEMY_POOL_RECYCLE = 3600
SQLALCHEMY_TRACK_MODIFICATIONS = False
# Настройка безопасности для операторов
USER_SECURITY = {
'password_expire_days': 60, # Срок обязательной смены пароля
'password_expire_notify_days': 5, # За сколько дней предупреждать о смене
'password_validate': { # Проверки пароля на сложность
'patterns': [
re.compile('[A-Z]+'),
re.compile('[a-z]+'),
re.compile('\d+'),
re.compile('.{7,}'),
],
'validators': {'no_login'},
'message': 'Должны быть заглавная и строчная английская буква, цифра, длина от 7 символов'
},
'save_login_location': False, # При входе в систему, сохранять местоположение оператора (широта и долгота)
}
PERMANENT_SESSION_LIFETIME = timedelta(hours=1) # Сброс авторизации при 1 часе бездействия
# Операции, выполняющиеся в фоне по расписанию
QUEUE_PREFIX = 'expertise'
QUEUE_SHEDULE = {
'request_autoevents': {
'function_path': 'sphere_conf.bps.projects.request.tasks.autoevents',
'schedule': '*/10 * * * *',
},
'service_autoevents': {
'function_path': 'sphere_conf.bps.projects.service.tasks.autoevents',
'schedule': '*/10 * * * *',
},
'service_autoevents': {
'function_path': 'sphere_conf.bps.projects.service.tasks.request_missing_documents_repeat',
'schedule': '0 7 * * *',
},
'email_download_in': {
'function_path': 'sphere.email.tasks.load_emails',
'schedule': '*/10 * * * *',
'kwargs': {'load_profile': 'in@ravtexpert.ru'},
},
'email_download_service': {
'function_path': 'sphere.email.tasks.load_emails',
'schedule': '*/10 * * * *',
'kwargs': {'load_profile': 'service@ravtexpert.ru'},
},
'email_download_payments': {
'function_path': 'sphere.email.tasks.load_emails',
'schedule': '*/10 * * * *',
'kwargs': {'load_profile': 'payments@ravtexpert.ru'},
},
'sphere_conf_bank_requis_update': {
'function_path': 'sphere_conf.tasks.bank_requis_update',
'schedule': '0 6 * * *',
},
'sphere_conf_download_mango_records': {
'function_path': 'sphere_conf.tasks.download_mango_records',
schedule': '*/20 * * * *',
},
}
# Настройки профилей исходящих писем
EMAIL_PROFILES = {
None: {
'username': '************',
'password': '************',
'host': 'smtp.mail.ru',
'port': 465,
},
'payments': {
'username': '************',
'password': '************',
'host': 'smtp.mail.ru',
'port': 465,
},
}
# Настройки скачивания писем
EMAIL_DOWNLOAD = {
'in@ravtexpert.ru': {
'host': 'imap.mail.ru',
'email': '************',
'login': '************',
'password': '************',
'folders': ['robot'],
'move_processed_to': {'robot': 'robot_success'},
},
'service@ravtexpert.ru': {
'host': 'imap.mail.ru',
'email': '************',
'login': '************',
'password': '************',
'folders': ['inbox'],
},
'payments@ravtexpert.ru': {
'host': 'imap.mail.ru',
'email': '************',
'login': '************',
'password': '************',
'folders': ['inbox'],
},
}
IS_MAIL_WITH_ATTACH_SEND_ASYNC = True # Сообщения с вложениями отправляются в отложенном режиме
SMS_LOGIN = '********'
SMS_PASSWORD = '********'
SMS_SENDER = '********'
SMS_PROVIDER = 'prostor' # или 'smsc'
SMS_SUPPRESS_SENDING = True # Не отправлять сообщения - для режима отладки
# Локализация и часовой пояс по умолчанию
LANGUAGES = {
'ru': 'Русский',
}
BABEL_DEFAULT_LOCALE = 'ru'
BABEL_DEFAULT_TIMEZONE = 'Europe/Moscow'
# Форматирование для вывода на экран
DATE_FORMAT = 'dd.MM.yyyy'
DATETIME_FORMAT = 'dd.MM.yyyy H:mm'
# Кэш
CACHE_TYPE = 'werkzeug.contrib.cache.RedisCache'
CACHE_KWARGS = {
'key_prefix': 'expertise',
}
# Загрузка файлов
MAX_CONTENT_LENGTH = 10 * 1024 * 1024
MEDIA_DIR = os.path.join(BASE_DIR, 'media')
THUMBNAIL_DUMMY = os.path.join(BASE_DIR, 'sphere/lib/static/thumbnail_dummy.jpeg')
FILES_REFRESH_AFTER_UPLOAD = True # После загрузки файла обновлять страницу
# Панель отладки (видна только при включении режима отладки DEBUG = True)
DEBUG_TB_INTERCEPT_REDIRECTS = False
DEBUG_TB_PANELS = [
'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel',
'flask_debugtoolbar.panels.config_vars.ConfigVarsDebugPanel',
'flask_debugtoolbar.panels.template.TemplateDebugPanel',
'flask_debugtoolbar.panels.logger.LoggingPanel',
'flask_debugtoolbar.panels.route_list.RouteListDebugPanel',
'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel',
'flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel',
]
# Пути поиска приложений для загрузки. Вначале ищем в директории конфигурации
# для подмены шаблонов уровня ядра
TEMPLATE_FOLDERS = [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'sphere_conf/reports'),
]
SITE_URL = 'https://ravt.sbps.ru'
# Список загружаемых приложений
APPS = (
('sphere.lib', '/lib'),
('sphere.auth', '/auth'),
('sphere.logs', '/logs'),
('sphere.email', '/email'),
('sphere.sms', '/sms'),
('sphere.reports', '/reports'),
('sphere.bps', '/bps'),
('sphere.bps.plugins.files', '/bps_files'),
('sphere.bps.plugins.tasks', '/bps_tasks'),
('sphere_conf', None),
('sphere_conf.bps.projects.request', '/request'),
('sphere_conf.bps.projects.service', '/service'),
('sphere_conf.bps.projects.contractor', '/contractor'),
('sphere_conf.bps.projects.contract', '/contract'),
('sphere_conf.bps.projects.area', '/area'),
('sphere_conf.bps.projects.avr', '/avr'),
('sphere_conf.bps.projects.task', '/task'),
('mail_gui', '/mail_gui'),
)
BRAND = 'Сфера Эксперт'
SOGAZ_INTEGRATION_EMAIL = 'expertizaravt@sogaz.ru'
# Настройки логгирования событий и внешнего аггрегатора событий
# для отправки логов в удаленное хранилище (если используется обработчик SphereHTTPHandler).
# Стандартные обработчики логов также поддерживаются https://docs.python.org/2/library/logging.handlers.html
LOGGING_SERVER = {
'project_name': 'expertise',
'url': 'https://logs.sbps.ru/',
'api_key': '*****'
}
LOGGING = [
{
'logger': 'sphere',
'level': 'INFO',
'handler': 'sphere.logs.handlers.SphereHTTPHandler',
}
]
LOG_SUPPRESS_ENDPOINT = ['lib.user_notification_new'] # Исключения из логгирования действий операторов
# Настройки сервиса отображения офисных документов (Excel, Word)
ONLYOFFICE_URL = 'https://sbps.ru:444'
ONLYOFFICE_HOST_URL = SITE_URL