#!/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())