#!/usr/bin/env python
|
"""
|
首次部署初始化脚本
|
|
该脚本用于首次部署系统时执行所有必要的初始化操作,包括:
|
1. 数据库迁移
|
2. 创建管理员用户
|
3. 创建默认用户组
|
4. 收集静态文件
|
|
使用方法:
|
python scripts/deploy_init.py
|
|
注意事项:
|
- 确保已配置好数据库连接信息 (conf/env.py)
|
- 确保数据库已创建
|
- 确保已安装所有依赖 (pip install -r requirements.txt)
|
"""
|
|
import os
|
import sys
|
import django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
|
django.setup()
|
|
from django.core.management import call_command
|
|
|
def check_database_connection():
|
"""
|
检查数据库连接
|
"""
|
print("=" * 60)
|
print("检查数据库连接...")
|
print("=" * 60)
|
|
try:
|
from django.db import connection
|
with connection.cursor() as cursor:
|
cursor.execute("SELECT 1")
|
print("✓ 数据库连接正常")
|
return True
|
except Exception as e:
|
print(f"✗ 数据库连接失败: {e}")
|
print("\n请检查 conf/env.py 中的数据库配置:")
|
print(" - DATABASE_NAME")
|
print(" - DATABASE_USER")
|
print(" - DATABASE_PASSWORD")
|
print(" - DATABASE_HOST")
|
print(" - DATABASE_PORT")
|
return False
|
|
|
def run_migrations():
|
"""
|
执行数据库迁移
|
"""
|
print("\n" + "=" * 60)
|
print("执行数据库迁移...")
|
print("=" * 60)
|
|
try:
|
print("\n[1/2] 生成迁移文件...")
|
call_command('makemigrations', verbosity=1)
|
print("✓ 迁移文件生成成功")
|
|
print("\n[2/2] 应用迁移...")
|
call_command('migrate', verbosity=1)
|
print("✓ 数据库迁移成功")
|
return True
|
|
except Exception as e:
|
print(f"✗ 数据库迁移失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def create_admin_user():
|
"""
|
创建管理员用户
|
"""
|
print("\n" + "=" * 60)
|
print("创建管理员用户...")
|
print("=" * 60)
|
|
from django.contrib.auth import get_user_model
|
User = get_user_model()
|
|
default_username = 'admin'
|
default_password = 'admin123'
|
default_email = 'admin@example.com'
|
default_name = '系统管理员'
|
|
try:
|
user = User.objects.get(username=default_username)
|
print(f"管理员用户 '{default_username}' 已存在,跳过创建")
|
print(f" 用户名: {user.username}")
|
print(f" 姓名: {user.name}")
|
print(f" 邮箱: {user.email}")
|
return True
|
|
except User.DoesNotExist:
|
try:
|
user = User.objects.create_superuser(
|
username=default_username,
|
email=default_email,
|
password=default_password
|
)
|
user.name = default_name
|
user.phone = None
|
user.show_hosts = False
|
user.status = 'approved'
|
user.save()
|
|
print("✓ 管理员用户创建成功")
|
print(f" 用户名: {default_username}")
|
print(f" 密码: {default_password}")
|
print(f" 邮箱: {default_email}")
|
print(f" 姓名: {default_name}")
|
print("\n⚠️ 重要提示: 请在首次登录后修改默认密码!")
|
return True
|
|
except Exception as e:
|
print(f"✗ 创建管理员用户失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def create_default_groups():
|
"""
|
创建默认用户组
|
"""
|
print("\n" + "=" * 60)
|
print("创建默认用户组...")
|
print("=" * 60)
|
|
from django.contrib.auth.models import Group
|
|
groups = [
|
{'name': '管理员组', 'description': '拥有所有权限的管理员组'},
|
{'name': '开发人员组', 'description': '开发人员组'},
|
{'name': '测试人员组', 'description': '测试人员组'},
|
{'name': '只读用户组', 'description': '只读用户组'},
|
]
|
|
created_count = 0
|
for group_info in groups:
|
try:
|
Group.objects.get(name=group_info['name'])
|
print(f" 用户组 '{group_info['name']}' 已存在")
|
except Group.DoesNotExist:
|
try:
|
Group.objects.create(name=group_info['name'])
|
print(f" ✓ 创建用户组: {group_info['name']}")
|
created_count += 1
|
except Exception as e:
|
print(f" ✗ 创建用户组 '{group_info['name']}' 失败: {e}")
|
|
print(f"\n✓ 成功创建 {created_count} 个用户组")
|
return True
|
|
|
def collect_static_files():
|
"""
|
收集静态文件
|
"""
|
print("\n" + "=" * 60)
|
print("收集静态文件...")
|
print("=" * 60)
|
|
try:
|
call_command('collectstatic', '--noinput', verbosity=1)
|
print("✓ 静态文件收集成功")
|
return True
|
|
except Exception as e:
|
print(f"✗ 静态文件收集失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def display_summary():
|
"""
|
显示部署摘要
|
"""
|
print("\n" + "=" * 60)
|
print("部署摘要")
|
print("=" * 60)
|
|
from django.contrib.auth import get_user_model
|
from django.contrib.auth.models import Group
|
from apps.lunarlink.models import Project
|
|
User = get_user_model()
|
|
print(f"\n用户数量: {User.objects.count()}")
|
print(f"用户组数量: {Group.objects.count()}")
|
print(f"项目数量: {Project.objects.count()}")
|
|
print("\n默认管理员账号:")
|
print(" 用户名: admin")
|
print(" 密码: admin123")
|
print("\n⚠️ 请在首次登录后立即修改默认密码!")
|
|
|
def main():
|
"""
|
主函数
|
"""
|
print("\n")
|
print("╔" + "=" * 58 + "╗")
|
print("║" + " " * 10 + "接口自动化平台 - 首次部署初始化" + " " * 13 + "║")
|
print("╚" + "=" * 58 + "╝")
|
print()
|
|
steps = [
|
("检查数据库连接", check_database_connection),
|
("执行数据库迁移", run_migrations),
|
("创建管理员用户", create_admin_user),
|
("创建默认用户组", create_default_groups),
|
("收集静态文件", collect_static_files),
|
]
|
|
failed_steps = []
|
|
for step_name, step_func in steps:
|
if not step_func():
|
failed_steps.append(step_name)
|
print(f"\n✗ '{step_name}' 失败,终止部署")
|
break
|
|
if not failed_steps:
|
display_summary()
|
print("\n" + "=" * 60)
|
print("✓ 部署初始化完成!")
|
print("=" * 60)
|
print("\n系统已准备就绪,可以启动服务:")
|
print(" python manage.py runserver")
|
print("\n或使用 gunicorn 启动:")
|
print(" gunicorn backend.wsgi:application -c gunicorn_conf.py")
|
print()
|
return 0
|
else:
|
print("\n" + "=" * 60)
|
print("✗ 部署初始化失败!")
|
print("=" * 60)
|
print(f"\n失败的步骤: {', '.join(failed_steps)}")
|
print("\n请检查错误信息并修复后重试")
|
print()
|
return 1
|
|
|
if __name__ == '__main__':
|
sys.exit(main())
|