# KaMiXiTong 部署文档 ## 目录 - [环境要求](#环境要求) - [快速开始](#快速开始) - [配置说明](#配置说明) - [数据库配置](#数据库配置) - [启动应用](#启动应用) - [生产环境部署](#生产环境部署) - [安全注意事项](#安全注意事项) - [常见问题](#常见问题) --- ## 环境要求 ### 系统要求 | 项目 | 最低要求 | 推荐配置 | |------|----------|----------| | 操作系统 | Linux/Windows/macOS | Ubuntu 22.04 LTS | | Python | 3.9+ | 3.11+ | | MySQL | 5.7+ | 8.0+ | | 内存 | 512MB | 2GB+ | | 磁盘 | 1GB | 10GB+ | ### 依赖服务 - **MySQL** - 主数据库 - **Redis** (可选) - 用于API限流和缓存 - **Nginx** (推荐) - 反向代理和静态文件服务 --- ## 快速开始 ### 1. 克隆代码 ```bash git clone cd KaMiXiTong/master ``` ### 2. 创建虚拟环境 ```bash # Linux/macOS python3 -m venv venv source venv/bin/activate # Windows python -m venv venv venv\Scripts\activate ``` ### 3. 安装依赖 ```bash pip install -r requirements.txt ``` ### 4. 生成安全密钥 ```bash # 生成 SECRET_KEY python -c "import secrets; print('SECRET_KEY=' + secrets.token_urlsafe(32))" # 生成 AUTH_SECRET_KEY python -c "import secrets; print('AUTH_SECRET_KEY=' + secrets.token_urlsafe(32))" ``` ### 5. 创建配置文件 ```bash # 复制示例配置 cp .env.example .env # 编辑配置文件 nano .env # 或使用其他编辑器 ``` ### 6. 初始化数据库 ```bash # 创建数据库 mysql -u root -p -e "CREATE DATABASE kamixitong CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # 导入初始结构 mysql -u root -p kamixitong < init_mysql.sql # 初始化迁移(可选) flask db upgrade ``` ### 7. 启动应用 ```bash # 开发环境 python run.py # 或使用 Flask CLI flask run --host=0.0.0.0 --port=5088 ``` 访问 http://localhost:5088 进入系统。 --- ## 配置说明 ### 必需环境变量 以下环境变量**必须设置**,否则应用无法启动: | 变量名 | 说明 | 示例 | |--------|------|------| | `SECRET_KEY` | Flask会话密钥 | `32位随机字符串` | | `AUTH_SECRET_KEY` | API签名密钥 | `32位随机字符串` | | `DB_PASSWORD` | 数据库密码 | `your-secure-password` | ### 完整配置文件示例 ```bash # .env 文件 # ==================== Flask 配置 ==================== FLASK_ENV=production FLASK_DEBUG=False # ==================== 数据库配置 ==================== # 方式一:使用完整URL # DATABASE_URL=mysql+pymysql://user:password@localhost:3306/kamixitong?charset=utf8mb4 # 方式二:分离配置(推荐) DB_HOST=localhost DB_PORT=3306 DB_USER=kamixitong DB_PASSWORD=your-secure-database-password DB_NAME=kamixitong # 连接池配置 DB_POOL_SIZE=10 DB_MAX_OVERFLOW=20 DB_POOL_RECYCLE=3600 DB_POOL_TIMEOUT=30 # ==================== 安全配置(必须设置) ==================== SECRET_KEY=your-32-character-secret-key-here AUTH_SECRET_KEY=your-32-character-auth-key-here # ==================== 域名配置 ==================== FRONTEND_DOMAIN=your-domain.com # ==================== CORS配置 ==================== ALLOWED_ORIGINS=https://your-domain.com,https://www.your-domain.com # ==================== 会话配置 ==================== SESSION_LIFETIME_HOURS=168 SESSION_COOKIE_SECURE=True SESSION_COOKIE_HTTPONLY=True SESSION_COOKIE_SAMESITE=Lax # ==================== 记住我配置 ==================== REMEMBER_COOKIE_DURATION=30 REMEMBER_COOKIE_SECURE=True REMEMBER_COOKIE_HTTPONLY=True REMEMBER_COOKIE_SAMESITE=Lax # ==================== 验证器配置 ==================== OFFLINE_CACHE_DAYS=7 MAX_FAILED_ATTEMPTS=5 LOCKOUT_MINUTES=10 MAX_UNBIND_TIMES=3 # ==================== 卡密配置 ==================== LICENSE_KEY_LENGTH=32 LICENSE_KEY_PREFIX= TRIAL_PREFIX=TRIAL_ # ==================== API配置 ==================== API_VERSION=v1 ITEMS_PER_PAGE=20 # ==================== 文件上传配置 ==================== MAX_CONTENT_LENGTH=524288000 UPLOAD_FOLDER=static/uploads # ==================== 日志配置 ==================== LOG_LEVEL=INFO LOG_FILE=logs/kamaxitong.log # ==================== 支付配置(可选) ==================== PAYMENT_ENABLED=False ALIPAY_APP_ID= ALIPAY_PRIVATE_KEY= ALIPAY_PUBLIC_KEY= ALIPAY_NOTIFY_URL= ALIPAY_RETURN_URL= # ==================== Redis配置(可选) ==================== # REDIS_URL=redis://localhost:6379/0 # ==================== 调度器配置 ==================== DISABLE_SCHEDULER=False ``` --- ## 数据库配置 ### MySQL 配置优化 ```sql -- 创建数据库 CREATE DATABASE kamixitong CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户 CREATE USER 'kamixitong'@'%' IDENTIFIED BY 'your-secure-password'; -- 授权 GRANT ALL PRIVILEGES ON kamixitong.* TO 'kamixitong'@'%'; FLUSH PRIVILEGES; ``` ### 数据库初始化 ```bash # 导入SQL结构 mysql -u kamixitong -p kamixitong < init_mysql.sql ``` ### 数据库迁移 ```bash # 初始化迁移(首次) flask db init # 生成迁移脚本 flask db migrate -m "描述信息" # 执行迁移 flask db upgrade ``` --- ## 启动应用 ### 开发环境 ```bash # 直接运行 python run.py # 或使用 Flask CLI flask run --host=0.0.0.0 --port=5088 --debug ``` ### 生产环境 #### 方式一:Gunicorn(推荐) ```bash # 安装 Gunicorn pip install gunicorn # 启动应用 gunicorn -w 4 -b 0.0.0.0:5088 --timeout 120 --access-logfile logs/access.log --error-logfile logs/error.log run:app ``` #### 方式二:uWSGI ```bash # 安装 uWSGI pip install uwsgi # 创建配置文件 uwsgi.ini [uwsgi] module = run:app master = true processes = 4 socket = 0.0.0.0:5088 chmod-socket = 660 vacuum = true die-on-term = true logto = logs/uwsgi.log # 启动 uwsgi --ini uwsgi.ini ``` #### 方式三:使用启动脚本 ```bash # 使用生产启动脚本 python run_production.py ``` ### Systemd 服务配置 创建服务文件 `/etc/systemd/system/kamixitong.service`: ```ini [Unit] Description=KaMiXiTong Application After=network.target mysql.service [Service] User=www-data Group=www-data WorkingDirectory=/var/www/kamixitong Environment="PATH=/var/www/kamixitong/venv/bin" EnvironmentFile=/var/www/kamixitong/.env ExecStart=/var/www/kamixitong/venv/bin/gunicorn -w 4 -b 127.0.0.1:5088 --timeout 120 run:app Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` ```bash # 启用服务 sudo systemctl daemon-reload sudo systemctl enable kamixitong sudo systemctl start kamixitong # 查看状态 sudo systemctl status kamixitong ``` --- ## 生产环境部署 ### Nginx 配置 创建配置文件 `/etc/nginx/sites-available/kamixitong`: ```nginx server { listen 80; server_name your-domain.com www.your-domain.com; # 强制 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com www.your-domain.com; # SSL 证书 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; # 安全头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 日志 access_log /var/log/nginx/kamixitong_access.log; error_log /var/log/nginx/kamixitong_error.log; # 静态文件 location /static/ { alias /var/www/kamixitong/static/; expires 30d; add_header Cache-Control "public, immutable"; } # 上传文件 location /static/uploads/ { alias /var/www/kamixitong/static/uploads/; expires 7d; # 限制上传文件大小 client_max_body_size 500M; } # API 代理 location /api/ { proxy_pass http://127.0.0.1:5088; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时设置 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # 应用代理 location / { proxy_pass http://127.0.0.1:5088; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket 支持(如果需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` ```bash # 启用站点 sudo ln -s /etc/nginx/sites-available/kamixitong /etc/nginx/sites-enabled/ # 测试配置 sudo nginx -t # 重载 Nginx sudo systemctl reload nginx ``` ### SSL 证书配置 ```bash # 安装 Certbot sudo apt install certbot python3-certbot-nginx # 获取证书 sudo certbot --nginx -d your-domain.com -d www.your-domain.com # 自动续期 sudo certbot renew --dry-run ``` ### 防火墙配置 ```bash # UFW 配置 sudo ufw allow 22/tcp # SSH sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable ``` --- ## 安全注意事项 ### 1. 密钥安全 ```bash # 生成强密钥 python -c "import secrets; print(secrets.token_urlsafe(32))" # 永远不要在代码中硬编码密钥 # 不要将 .env 文件提交到版本控制 ``` ### 2. 文件权限 ```bash # 设置正确的文件权限 chmod 600 .env chmod 700 logs/ chmod -R 755 static/ chmod -R 750 static/uploads/ ``` ### 3. 数据库安全 - 使用强密码 - 限制数据库用户权限 - 禁用远程root登录 - 定期备份 ```bash # 数据库备份脚本 mysqldump -u kamixitong -p kamixitong > backup_$(date +%Y%m%d).sql ``` ### 4. 定期更新 ```bash # 更新 Python 依赖 pip install --upgrade -r requirements.txt # 系统更新 sudo apt update && sudo apt upgrade ``` ### 5. 监控日志 ```bash # 查看应用日志 tail -f logs/kamaxitong.log # 查看 Nginx 日志 tail -f /var/log/nginx/kamixitong_error.log # 查看系统日志 journalctl -u kamixitong -f ``` --- ## 常见问题 ### Q1: 应用启动失败,提示 SECRET_KEY 未设置 **解决方案:** 确保 `.env` 文件中设置了 `SECRET_KEY` 环境变量: ```bash # 检查 .env 文件 cat .env | grep SECRET_KEY # 如果没有,生成并添加 echo "SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" >> .env ``` ### Q2: 数据库连接失败 **解决方案:** 检查数据库配置和连接: ```bash # 测试数据库连接 mysql -h DB_HOST -u DB_USER -pDB_PASSWORD DB_NAME # 检查环境变量 echo $DB_HOST $DB_USER $DB_NAME ``` ### Q3: API 返回 401 签名验证失败 **解决方案:** 确保客户端和服务端使用相同的 `AUTH_SECRET_KEY`: ```bash # 检查配置 cat .env | grep AUTH_SECRET_KEY # 如果需要,重新生成 echo "AUTH_SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" >> .env ``` ### Q4: 文件上传失败 **解决方案:** 检查上传目录权限和大小限制: ```bash # 创建上传目录 mkdir -p static/uploads # 设置权限 chmod 755 static/uploads # 检查 Nginx 配置 # 确保 client_max_body_size 设置正确 ``` ### Q5: 定时任务不执行 **解决方案:** 检查调度器状态: ```bash # 检查环境变量 cat .env | grep DISABLE_SCHEDULER # 确保没有禁用调度器 # DISABLE_SCHEDULER=False ``` ### Q6: 内存占用过高 **解决方案:** 优化配置: ```bash # 减少工作进程数 gunicorn -w 2 ... # 减少数据库连接池 DB_POOL_SIZE=5 DB_MAX_OVERFLOW=10 ``` ### Q7: 前端页面能正常访问,但API调用失败怎么办? **解决方案:** 检查以下几点: 1. 确认Nginx配置正确,特别是 `proxy_set_header` 指令 2. 确认Flask应用监听地址设置为 `0.0.0.0` 3. 检查浏览器开发者工具中的网络请求,确认API请求的URL是否正确 ### Q8: 如何确认域名配置是否正确? **解决方案:** 可以通过以下方式检查: 1. 在浏览器中打开应用,按F12打开开发者工具 2. 切换到Network标签页 3. 刷新页面,观察API请求的URL是否为域名地址而非localhost --- ## 性能优化建议 ### 1. 启用 Redis 缓存 ```bash # 安装 Redis sudo apt install redis-server # 配置环境变量 echo "REDIS_URL=redis://localhost:6379/0" >> .env ``` ### 2. 数据库优化 ```sql -- 添加索引 CREATE INDEX idx_license_key ON license(license_key); CREATE INDEX idx_machine_code ON device(machine_code); CREATE INDEX idx_product_id ON product(product_id); ``` ### 3. 静态文件 CDN 将静态文件托管到 CDN 可以显著提高加载速度。 ### 4. 启用 Gzip 压缩 在 Nginx 配置中添加: ```nginx gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; gzip_min_length 1000; ``` --- ## 升级指南 ### 版本升级步骤 ```bash # 1. 备份数据库 mysqldump -u kamixitong -p kamixitong > backup_before_upgrade.sql # 2. 备份配置 cp .env .env.backup # 3. 拉取新代码 git pull origin main # 4. 更新依赖 pip install -r requirements.txt # 5. 执行数据库迁移 flask db upgrade # 6. 重启服务 sudo systemctl restart kamixitong ``` --- ## 技术支持 如遇问题,请检查: 1. 应用日志:`logs/kamaxitong.log` 2. Nginx 日志:`/var/log/nginx/kamixitong_error.log` 3. 系统日志:`journalctl -u kamixitong` --- *最后更新:2024年*