from .setting import Setting, SettingsType
from .color import ThemeResponse
from pkg.conf.appmeta import BackendVersion
from pkg.password.pwd import Password
from loguru import logger as log
async def migration() -> None:
"""
数据库迁移函数,初始化默认设置和用户组。
:return: None
"""
log.info('开始进行数据库初始化...')
await init_default_settings()
await init_default_policy()
await init_default_group()
await init_default_user()
log.info('数据库初始化结束')
default_settings: list[Setting] = [
Setting(name="siteURL", value="http://localhost", type=SettingsType.BASIC),
Setting(name="siteName", value="DiskNext", type=SettingsType.BASIC),
Setting(name="register_enabled", value="1", type=SettingsType.REGISTER),
Setting(name="default_group", value="2", type=SettingsType.REGISTER),
Setting(name="siteKeywords", value="网盘,网盘", type=SettingsType.BASIC),
Setting(name="siteDes", value="DiskNext", type=SettingsType.BASIC),
Setting(name="siteTitle", value="云星启智", type=SettingsType.BASIC),
Setting(name="fromName", value="DiskNext", type=SettingsType.MAIL),
Setting(name="mail_keepalive", value="30", type=SettingsType.MAIL),
Setting(name="fromAdress", value="no-reply@yxqi.cn", type=SettingsType.MAIL),
Setting(name="smtpHost", value="smtp.yxqi.cn", type=SettingsType.MAIL),
Setting(name="smtpPort", value="25", type=SettingsType.MAIL),
Setting(name="replyTo", value="feedback@yxqi.cn", type=SettingsType.MAIL),
Setting(name="smtpUser", value="no-reply@yxqi.cn", type=SettingsType.MAIL),
Setting(name="smtpPass", value="", type=SettingsType.MAIL),
Setting(name="maxEditSize", value="4194304", type=SettingsType.FILE_EDIT),
Setting(name="archive_timeout", value="60", type=SettingsType.TIMEOUT),
Setting(name="download_timeout", value="60", type=SettingsType.TIMEOUT),
Setting(name="preview_timeout", value="60", type=SettingsType.TIMEOUT),
Setting(name="doc_preview_timeout", value="60", type=SettingsType.TIMEOUT),
Setting(name="upload_credential_timeout", value="1800", type=SettingsType.TIMEOUT),
Setting(name="upload_session_timeout", value="86400", type=SettingsType.TIMEOUT),
Setting(name="slave_api_timeout", value="60", type=SettingsType.TIMEOUT),
Setting(name="onedrive_monitor_timeout", value="600", type=SettingsType.TIMEOUT),
Setting(name="share_download_session_timeout", value="2073600", type=SettingsType.TIMEOUT),
Setting(name="onedrive_callback_check", value="20", type=SettingsType.TIMEOUT),
Setting(name="aria2_call_timeout", value="5", type=SettingsType.TIMEOUT),
Setting(name="onedrive_chunk_retries", value="1", type=SettingsType.RETRY),
Setting(name="onedrive_source_timeout", value="1800", type=SettingsType.TIMEOUT),
Setting(name="reset_after_upload_failed", value="0", type=SettingsType.UPLOAD),
Setting(name="login_captcha", value="0", type=SettingsType.LOGIN),
Setting(name="reg_captcha", value="0", type=SettingsType.LOGIN),
Setting(name="email_active", value="0", type=SettingsType.REGISTER),
Setting(name="mail_activation_template", value="""
激活您的账户 | | 激活{siteTitle}账户 | | 亲爱的{userName}: | | 感谢您注册{siteTitle},请点击下方按钮完成账户激活。 | | 激活账户 | | 感谢您选择{siteTitle}。 |
|
| |
""", type=SettingsType.MAIL_TEMPLATE),
Setting(name="forget_captcha", value="0", type=SettingsType.LOGIN),
Setting(name="mail_reset_pwd_template", value="""重设密码 | | 重设{siteTitle}密码 | | 亲爱的{userName}: | | 请点击下方按钮完成密码重设。如果非你本人操作,请忽略此邮件。 | | 重设密码 | | 感谢您选择{siteTitle}。 |
|
| |
""", type=SettingsType.MAIL_TEMPLATE),
Setting(name=f"db_version_{BackendVersion}", value="installed", type=SettingsType.VERSION),
Setting(name="hot_share_num", value="10", type=SettingsType.SHARE),
Setting(name="gravatar_server", value="https://www.gravatar.com/", type=SettingsType.AVATAR),
Setting(name="defaultTheme", value="#3f51b5", type=SettingsType.BASIC),
Setting(name="themes", value=ThemeResponse().model_dump_json(), type=SettingsType.BASIC),
Setting(name="aria2_token", value="", type=SettingsType.ARIA2),
Setting(name="aria2_rpcurl", value="", type=SettingsType.ARIA2),
Setting(name="aria2_temp_path", value="", type=SettingsType.ARIA2),
Setting(name="aria2_options", value="{}", type=SettingsType.ARIA2),
Setting(name="aria2_interval", value="60", type=SettingsType.ARIA2),
Setting(name="max_worker_num", value="10", type=SettingsType.TASK),
Setting(name="max_parallel_transfer", value="4", type=SettingsType.TASK),
Setting(name="secret_key", value=Password.generate(256), type=SettingsType.AUTH),
Setting(name="temp_path", value="temp", type=SettingsType.PATH),
Setting(name="avatar_path", value="avatar", type=SettingsType.PATH),
Setting(name="avatar_size", value="2097152", type=SettingsType.AVATAR),
Setting(name="avatar_size_l", value="200", type=SettingsType.AVATAR),
Setting(name="avatar_size_m", value="130", type=SettingsType.AVATAR),
Setting(name="avatar_size_s", value="50", type=SettingsType.AVATAR),
Setting(name="home_view_method", value="icon", type=SettingsType.VIEW),
Setting(name="share_view_method", value="list", type=SettingsType.VIEW),
Setting(name="cron_garbage_collect", value="@hourly", type=SettingsType.CRON),
Setting(name="authn_enabled", value="0", type=SettingsType.AUTHN),
Setting(name="captcha_height", value="60", type=SettingsType.CAPTCHA),
Setting(name="captcha_width", value="240", type=SettingsType.CAPTCHA),
Setting(name="captcha_mode", value="3", type=SettingsType.CAPTCHA),
Setting(name="captcha_ComplexOfNoiseText", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_ComplexOfNoiseDot", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsShowHollowLine", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsShowNoiseDot", value="1", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsShowNoiseText", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsShowSlimeLine", value="1", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsShowSineLine", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_CaptchaLen", value="6", type=SettingsType.CAPTCHA),
Setting(name="captcha_IsUseReCaptcha", value="0", type=SettingsType.CAPTCHA),
Setting(name="captcha_ReCaptchaKey", value="defaultKey", type=SettingsType.CAPTCHA),
Setting(name="captcha_ReCaptchaSecret", value="defaultSecret", type=SettingsType.CAPTCHA),
Setting(name="thumb_width", value="400", type=SettingsType.THUMB),
Setting(name="thumb_height", value="300", type=SettingsType.THUMB),
Setting(name="pwa_small_icon", value="/static/img/favicon.ico", type=SettingsType.PWA),
Setting(name="pwa_medium_icon", value="/static/img/logo192.png", type=SettingsType.PWA),
Setting(name="pwa_large_icon", value="/static/img/logo512.png", type=SettingsType.PWA),
Setting(name="pwa_display", value="standalone", type=SettingsType.PWA),
Setting(name="pwa_theme_color", value="#000000", type=SettingsType.PWA),
Setting(name="pwa_background_color", value="#ffffff", type=SettingsType.PWA),
]
async def init_default_settings() -> None:
from .setting import Setting
from .database import get_session
from sqlalchemy import and_
log.info('初始化设置...')
async for session in get_session():
# 检查是否已经存在版本设置
ver = await Setting.get(
session,
and_(Setting.type == SettingsType.VERSION, Setting.name == f"db_version_{BackendVersion}")
)
if ver and ver.value == "installed":
return
# 批量添加默认设置
await Setting.add(session, default_settings)
async def init_default_group() -> None:
from .group import Group, GroupOptions
from .database import get_session
log.info('初始化用户组...')
async for session in get_session():
# 未找到初始管理组时,则创建
if not await Group.get(session, Group.id == 1):
admin_group = await Group(
name="管理员",
policies="1",
max_storage=1 * 1024 * 1024 * 1024, # 1GB
share_enabled=True,
web_dav_enabled=True,
admin=True,
).save(session)
assert admin_group.id is not None
await GroupOptions(
group_id=admin_group.id,
archive_download=True,
archive_task=True,
share_download=True,
share_free=True,
aria2=True,
select_node=True,
advance_delete=True,
).save(session)
# 未找到初始注册会员时,则创建
if not await Group.get(session, Group.id == 2):
member_group = await Group(
name="注册会员",
max_storage=1 * 1024 * 1024 * 1024, # 1GB
share_enabled=True,
web_dav_enabled=True,
).save(session)
assert member_group.id is not None
await GroupOptions(
group_id=member_group.id,
share_download=True,
).save(session)
# 未找到初始游客组时,则创建
if not await Group.get(session, Group.id == 3):
guest_group = await Group(
name="游客",
policies="[]",
share_enabled=False,
web_dav_enabled=False,
).save(session)
assert guest_group.id is not None
await GroupOptions(
group_id=guest_group.id,
share_download=True,
).save(session)
async def init_default_user() -> None:
from .user import User
from .group import Group
from .object import Object, ObjectType
from .database import get_session
log.info('初始化管理员用户...')
async for session in get_session():
# 检查管理员用户是否存在
admin_user = await User.get(session, User.id == 1)
if not admin_user:
# 获取管理员组
admin_group = await Group.get(session, Group.id == 1)
if not admin_group:
raise RuntimeError("管理员用户组不存在,无法创建管理员用户")
# 生成管理员密码
admin_password = Password.generate(8)
hashed_admin_password = Password.hash(admin_password)
admin_user = await User(
username="admin",
nick="admin",
status=True,
group_id=admin_group.id,
password=hashed_admin_password,
).save(session)
# 为管理员创建根目录(使用默认存储策略)
await Object(
name="my",
type=ObjectType.FOLDER,
owner_id=admin_user.id,
parent_id=None,
policy_id=1, # 默认本地存储策略
).save(session)
log.info(f'初始管理员账号: admin')
log.info(f'初始管理员密码: {admin_password}')
async def init_default_policy() -> None:
from .policy import Policy, PolicyType
from .database import get_session
log.info('初始化默认存储策略...')
async for session in get_session():
# 检查默认存储策略是否存在
default_policy = await Policy.get(session, Policy.id == 1)
if not default_policy:
local_policy = Policy(
name="本地存储",
type=PolicyType.LOCAL,
server="./data",
is_private=True,
max_size=0,
auto_rename=True,
dir_name_rule="{date}/{randomkey16}",
file_name_rule="{randomkey16}_{originname}",
)
await local_policy.save(session)
log.info('已创建默认本地存储策略,存储目录:./data')