配置管理
配置管理
相关源文件
本章引用的主要源码文件:
mayan/apps/common/api_views.pymayan/apps/common/apps.pymayan/apps/common/classes.pymayan/apps/common/forms.pymayan/apps/common/links.pymayan/apps/common/literals.pymayan/apps/common/serializers.pymayan/apps/common/settings.pymayan/apps/common/tests/mixins.pymayan/apps/common/tests/test_api.pymayan/apps/common/tests/test_links.pymayan/apps/common/urls.pymayan/apps/common/views.pymayan/apps/django_gpg/serializers.pymayan/apps/document_parsing/serializers.pymayan/apps/events/api_views.pymayan/apps/events/tests/test_api.pymayan/apps/metadata/tests/__init__.pymayan/apps/permissions/links.pymayan/apps/smart_settings/apps.pymayan/apps/smart_settings/classes.pymayan/apps/smart_settings/icons.pymayan/apps/smart_settings/links.pymayan/apps/smart_settings/literals.pymayan/apps/smart_settings/management/commands/settings_revert.pymayan/apps/smart_settings/permissions.pymayan/apps/smart_settings/settings.pymayan/apps/smart_settings/tests/literals.pymayan/apps/smart_settings/tests/mixins.pymayan/apps/smart_settings/tests/mocks.pymayan/apps/smart_settings/tests/test_classes.pymayan/apps/smart_settings/tests/test_utils.pymayan/apps/smart_settings/tests/test_views.pymayan/apps/smart_settings/urls.pymayan/apps/smart_settings/utils.pymayan/apps/smart_settings/views.pymayan/apps/task_manager/literals.pymayan/apps/task_manager/locale/bs/LC_MESSAGES/django.pomayan/apps/task_manager/locale/cs/LC_MESSAGES/django.pomayan/apps/task_manager/locale/el/LC_MESSAGES/django.pomayan/apps/task_manager/settings.pymayan/settings/base.pymayan/settings/testing/base.py
目的与范围
本文档介绍 Mayan EDMS 的配置管理系统,该系统提供了一个统一框架,用于通过多种来源(包括环境变量、YAML 配置文件以及默认值)管理应用程序设置。智能设置系统负责处理配置的加载、校验、迁移以及运行时管理。
有关应用程序部署和环境设置的信息,请参见安装与部署。有关各个配置选项的详细信息,请参见配置参考。
智能设置架构
Mayan EDMS 使用一套名为"智能设置"的复杂配置系统,该系统提供层级化配置解析、命名空间组织以及运行时管理能力。
核心配置组件
配置系统遵循分层架构,设置通过多个来源解析,其中环境变量具有最高优先级。
来源: mayan/apps/smart_settings/classes.py:49-417 mayan/apps/smart_settings/utils.py:13-443 mayan/settings/base.py:18-28
配置解析层级
解析过程遵循严格的优先级顺序,确保环境变量可以覆盖任何其他配置来源,从而使部署配置既灵活又安全。
来源: mayan/apps/smart_settings/utils.py:137-174 mayan/apps/smart_settings/classes.py:325-417
设置命名空间
配置设置被组织到逻辑命名空间中,这些命名空间对相关功能进行分组,并为迁移提供版本管理。
命名空间结构
| 命名空间 | 用途 | 示例设置 |
|---|---|---|
django | Django 框架核心设置 | ALLOWED_HOSTS、DATABASES、EMAIL_HOST |
celery | 任务队列配置 | CELERY_BROKER_URL、CELERY_RESULT_BACKEND |
common | 通用应用程序设置 | COMMON_PROJECT_TITLE、COMMON_HOME_VIEW |
| 自定义应用 | 应用特定配置 | OCR 设置、存储后端等 |
命名空间定义
# 来自 smart_settings 应用的示例
namespace = SettingNamespace(
label=_('Django'),
name='django',
version='0001',
migration_class=DjangoNamespaceMigration
)
setting_allowed_hosts = namespace.add_setting(
default=['127.0.0.1', 'localhost'],
global_name='ALLOWED_HOSTS',
help_text=_('允许的主机/域名列表...'),
validation_function=validate_hosts
)
来源: mayan/apps/smart_settings/settings.py:26-328 mayan/apps/task_manager/settings.py:10-43 mayan/apps/common/settings.py:15-97
设置属性
每个设置支持多个配置属性:
| 属性 | 用途 | 示例 |
|---|---|---|
global_name | 唯一标识符 | DATABASE_ENGINE |
default | 默认值 | 'django.db.backends.sqlite3' |
help_text | 文档说明 | 设置用途描述 |
validation_function | 值校验 | 自定义校验逻辑 |
post_edit_function | 编辑后钩子 | 触发系统更新 |
is_path | 文件路径设置 | 用于文件系统路径 |
来源: mayan/apps/smart_settings/classes.py:307-321
配置引导过程
引导系统在 Django 完全加载之前初始化配置,从而能够提前访问关键设置,如数据库配置和媒体路径。
引导流程
引导过程确保在任何 Django 应用初始化之前,基本配置已经可用,从而避免循环依赖问题。
来源: mayan/settings/base.py:18-28 mayan/apps/smart_settings/utils.py:111-117
引导设置类型
系统为引导场景提供了专门的设置类:
# 文件系统路径设置
FilesystemBootstrapSetting(
name='MEDIA_ROOT',
path_parts=('media',),
critical=True
)
# 配置文件相关路径
MediaBootstrapSetting(
name='CONFIGURATION_FILEPATH',
path_parts=(CONFIGURATION_FILENAME,),
critical=True
)
# 带默认值的常规设置
BaseSetting(
name='DEBUG',
has_default=True,
default_value=False
)
来源: mayan/apps/smart_settings/utils.py:177-250
配置文件管理
系统管理 YAML 配置文件,并具备自动备份和迁移能力。
配置文件结构
# config.yml 结构
SMART_SETTINGS_NAMESPACES:
django:
version: "0001"
common:
version: "0002"
# 单个设置
DEBUG: true
ALLOWED_HOSTS:
- "127.0.0.1"
- "localhost"
- "*.example.com"
DATABASES:
default:
ENGINE: "django.db.backends.postgresql"
NAME: "mayan"
HOST: "db"
PORT: 5432
配置管理操作
| 操作 | 用途 | 实现 |
|---|---|---|
save_configuration() | 将当前设置保存到文件 | classes.py:257-276 |
save_last_known_good() | 备份工作配置 | classes.py:278-284 |
revert_configuration() | 从备份恢复 | classes.py:287-305 |
dump_data() | 将设置导出为 YAML | classes.py:210-231 |
来源: mayan/apps/smart_settings/classes.py:257-305 mayan/apps/smart_settings/management/commands/settings_revert.py:6-18
运行时配置管理
智能设置系统在运行时提供基于 Web 和基于 API 的配置管理。
设置 Web 界面
Web 界面提供按命名空间组织的设置管理,并具备适当的权限控制和校验功能。
来源: mayan/apps/smart_settings/views.py:18-101 mayan/apps/smart_settings/links.py:17-38
设置显示与编辑
设置会附带元数据显示,并支持编辑功能:
| 显示元素 | 用途 | 来源 |
|---|---|---|
| 设置名称 | 人类可读标识符 | global_name |
| 当前值 | YAML 序列化的当前值 | serialized_value 属性 |
| 覆盖状态 | 环境变量覆盖指示器 | is_overridden() 方法 |
| 帮助文本 | 设置文档 | help_text 字段 |
来源: mayan/apps/smart_settings/apps.py:28-44 mayan/apps/smart_settings/classes.py:382-417
配置校验与迁移
系统支持配置校验以及版本间的自动迁移:
def setting_validation_function(setting, raw_value):
"""设置值的自定义校验"""
if not isinstance(raw_value, list):
raise ValidationError("必须是列表")
return raw_value
class NamespaceMigration(SettingNamespaceMigration):
"""命名空间版本间的迁移"""
def setting_name_0001(self, value):
# 从版本 0001 迁移到 0002
return transform_value(value)
来源: mayan/apps/smart_settings/classes.py:113-166 mayan/apps/smart_settings/tests/mocks.py:8-35
环境变量集成
所有设置都可以使用带有 MAYAN_ 前缀的环境变量进行覆盖,从而支持容器友好的配置方式。
环境变量命名
| 设置名称 | 环境变量 | 示例值 |
|---|---|---|
DEBUG | MAYAN_DEBUG | true |
ALLOWED_HOSTS | MAYAN_ALLOWED_HOSTS | ["*.example.com"] |
DATABASE_ENGINE | MAYAN_DATABASE_ENGINE | django.db.backends.postgresql |
环境变量会被解析为 YAML 格式,从而支持列表和字典等复杂数据结构。
来源:
mayan/apps/smart_settings/classes.py:328-339mayan/apps/smart_settings/utils.py:161-174