baodan/scripts/auto_init.py

88 lines
2.9 KiB
Python
Raw Normal View History

"""自动初始化管理员账号
在容器启动时运行如果管理员账号不存在则自动创建
"""
import os
import sys
def auto_init():
"""自动初始化管理员账号。"""
try:
# 设置环境
sys.path.insert(0, "/app/api")
os.chdir("/app/api")
from app_factory import create_app
from extensions.ext_database import db
from sqlalchemy import text
from services.account_service import AccountService, TenantService
# 创建应用上下文
socketio_app, flask_app = create_app()
with flask_app.app_context():
# 检查是否已有账号
result = db.session.execute(text("SELECT COUNT(*) FROM accounts"))
count = result.scalar()
if count > 0:
print("[auto_init] 管理员账号已存在,跳过初始化")
# 确保 dify_setups 表有记录(标记初始化完成)
_ensure_setup_complete()
return
# 获取配置
email = os.environ.get("ADMIN_EMAIL", "taiyi@baodan.com")
name = os.environ.get("ADMIN_NAME", "taiyi")
password = os.environ.get("ADMIN_PASSWORD", "taiyi1224")
workspace_name = os.environ.get("ADMIN_WORKSPACE", "Taiyi's Workspace")
print(f"[auto_init] 正在创建管理员账号: {email}")
# 创建账号is_setup=True 跳过注册限制检查)
account = AccountService.create_account(
email=email,
name=name,
interface_language="zh-Hans",
password=password,
is_setup=True,
)
# 创建工作空间is_setup=True 跳过创建限制检查)
TenantService.create_owner_tenant_if_not_exist(account, workspace_name, is_setup=True)
# 标记初始化完成
_ensure_setup_complete()
print(f"[auto_init] 管理员账号创建成功!")
print(f"[auto_init] 邮箱: {email}")
print(f"[auto_init] 密码: {password}")
except Exception as e:
print(f"[auto_init] 初始化失败: {e}")
import traceback
traceback.print_exc()
def _ensure_setup_complete():
"""确保 dify_setups 表有记录,标记初始化已完成。"""
from extensions.ext_database import db
from sqlalchemy import text
from datetime import datetime
result = db.session.execute(text("SELECT COUNT(*) FROM dify_setups"))
count = result.scalar()
if count == 0:
db.session.execute(
text("INSERT INTO dify_setups (version, setup_at) VALUES (:version, :setup_at)"),
{"version": "1.0.0", "setup_at": datetime.utcnow()}
)
db.session.commit()
print("[auto_init] 已标记系统初始化完成")
if __name__ == "__main__":
auto_init()