Kamixitong/scripts/setup_env.py
2025-12-12 11:35:14 +08:00

216 lines
6.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
环境变量配置和验证脚本
自动生成安全的随机密钥并验证配置
"""
import os
import sys
import secrets
import getpass
from pathlib import Path
def generate_secret_key(length=32):
"""生成安全的随机密钥"""
return secrets.token_urlsafe(length)
def generate_hex_key(length=32):
"""生成十六进制随机密钥"""
return secrets.token_hex(length)
def check_env_vars():
"""检查必需的环境变量"""
print("🔍 检查环境变量配置...")
print("-" * 60)
required_vars = {
'SECRET_KEY': '应用密钥(用于会话加密)',
'AUTH_SECRET_KEY': '认证密钥用于API签名',
'DATABASE_URL': '数据库连接URL'
}
missing_vars = []
weak_keys = []
for var_name, description in required_vars.items():
value = os.environ.get(var_name)
if not value:
print(f"{var_name:20s} - 未设置 ({description})")
missing_vars.append(var_name)
else:
print(f"{var_name:20s} - 已设置")
# 检查密钥强度
if 'KEY' in var_name:
if len(value) < 32:
print(f"⚠️ {var_name:20s} - 密钥长度不足32字符 (当前: {len(value)})")
weak_keys.append(var_name)
else:
print(f"{var_name:20s} - 密钥长度符合要求")
print("-" * 60)
if missing_vars:
print(f"\n❌ 发现 {len(missing_vars)} 个未设置的环境变量")
return False
elif weak_keys:
print(f"\n⚠️ 发现 {len(weak_keys)} 个强度不足的密钥")
return False
else:
print("\n✅ 所有必需的环境变量已正确配置")
return True
def generate_env_file():
"""生成 .env 文件"""
print("\n🚀 生成 .env 文件...")
print("-" * 60)
# 收集用户输入
database_url = input("数据库URL (mysql://user:pass@localhost:3306/dbname): ").strip()
if not database_url:
print("❌ 数据库URL不能为空")
return False
frontend_domain = input("前端域名 (your-domain.com): ").strip()
admin_email = input("管理员邮箱 (admin@yourcompany.com): ").strip()
# 生成随机密钥
secret_key = generate_secret_key(32)
auth_secret_key = generate_secret_key(32)
# 生成 .env 文件内容
env_content = f"""# KaMiXiTong 生产环境配置
# 生成时间: {__import__('datetime').datetime.now().isoformat()}
# ==========================================
# 🔐 安全配置
# ==========================================
SECRET_KEY={secret_key}
AUTH_SECRET_KEY={auth_secret_key}
# ==========================================
# 🗄️ 数据库配置
# ==========================================
DATABASE_URL={database_url}
DB_POOL_SIZE=20
DB_MAX_OVERFLOW=30
DB_POOL_RECYCLE=3600
DB_POOL_TIMEOUT=30
# ==========================================
# 🌐 系统配置
# ==========================================
SITE_NAME=KaMiXiTong软件授权管理系统
ADMIN_EMAIL={admin_email}
FRONTEND_DOMAIN={frontend_domain}
API_VERSION=v1
# ==========================================
# 🔒 安全策略
# ==========================================
SESSION_COOKIE_SECURE=true
SESSION_COOKIE_HTTPONLY=true
SESSION_COOKIE_SAMESITE=Lax
SESSION_LIFETIME_HOURS=24
REMEMBER_COOKIE_DURATION=30
REMEMBER_COOKIE_SECURE=true
MAX_FAILED_ATTEMPTS=5
LOCKOUT_MINUTES=10
MAX_UNBIND_TIMES=3
# ==========================================
# 💾 缓存配置
# ==========================================
REDIS_URL=redis://localhost:6379/0
# ==========================================
# 📝 日志配置
# ==========================================
LOG_LEVEL=INFO
LOG_FILE=logs/kamaxitong.log
# ==========================================
# 📦 文件上传
# ==========================================
MAX_CONTENT_LENGTH=52428800
UPLOAD_FOLDER=static/uploads
# ==========================================
# 🏷️ 卡密配置
# ==========================================
LICENSE_KEY_LENGTH=32
TRIAL_PREFIX=TRIAL_
OFFLINE_CACHE_DAYS=7
# ==========================================
# 🌍 环境标识
# ==========================================
FLASK_ENV=production
DEBUG=false
# ==========================================
# 💳 支付配置(可选)
# ==========================================
PAYMENT_ENABLED=false
"""
# 写入文件
env_file = Path('.env')
try:
with open(env_file, 'w', encoding='utf-8') as f:
f.write(env_content)
print(f"✅ .env 文件已生成: {env_file.absolute()}")
print(f"\n⚠️ 请妥善保管此文件,不要提交到版本控制系统")
return True
except Exception as e:
print(f"❌ 生成 .env 文件失败: {str(e)}")
return False
def main():
"""主函数"""
print("=" * 60)
print("🔧 KaMiXiTong 环境变量配置工具")
print("=" * 60)
# 检查是否已存在 .env 文件
env_file = Path('.env')
if env_file.exists():
print(f"\n⚠️ 发现已存在的 .env 文件")
overwrite = input("是否覆盖?(y/N): ").strip().lower()
if overwrite != 'y':
print("操作已取消")
return
# 生成 .env 文件
if not generate_env_file():
sys.exit(1)
# 重新加载环境变量
print("\n🔄 重新加载环境变量...")
from dotenv import load_dotenv
load_dotenv()
# 验证配置
if not check_env_vars():
print("\n❌ 环境变量配置不完整,请检查后重新运行")
sys.exit(1)
print("\n" + "=" * 60)
print("✅ 环境变量配置完成!")
print("=" * 60)
print("\n📋 下一步操作:")
print("1. 运行数据库迁移: flask db upgrade")
print("2. 启动应用: flask run")
print("3. 访问健康检查: curl http://localhost:5000/api/v1/health")
print("\n🔐 安全提醒:")
print("- 妥善保管 .env 文件,不要提交到版本控制")
print("- 定期更换密钥")
print("- 确保生产环境启用HTTPS")
if __name__ == '__main__':
main()