DEPLOYMENT.md 3.0 KB

OKR 绩效考核系统 — 生产部署清单

部署前安全检查

在将系统部署到云主机前,必须完成以下安全配置:

1. 环境变量设置

# 生成随机密钥(至少 256-bit = 32 字节)
export APP_JWT_SECRET=$(openssl rand -base64 32)

# 设置超级管理员初始密码(部署后立即修改)
export APP_SUPER_ADMIN_PASSWORD="请替换为强密码"

# 数据库加密密钥(启用 SQLCipher 时必需)
export DB_ENCRYPT_KEY=$(openssl rand -base64 32)

# CORS 允许的域名(生产环境用实际域名)
export APP_CORS_ORIGINS="https://okr.your-company.com"

2. 系统服务配置(systemd)

# /etc/systemd/system/okr-performance.service
[Unit]
Description=OKR Performance System
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/okr-performance
EnvironmentFile=/opt/okr-performance/env.prod
ExecStart=/usr/bin/java -jar /opt/okr-performance/okr-performance.jar --spring.profiles.active=prod
Restart=on-failure
RestartSec=10

# 安全加固
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/okr-performance/data
PrivateTmp=yes

[Install]
WantedBy=multi-user.target

3. 数据库文件权限

chmod 700 /opt/okr-performance/data
chmod 600 /opt/okr-performance/data/okr-performance.db
chown -R appuser:appuser /opt/okr-performance

4. 启用 SQLCipher 加密(推荐)

  1. 取消 pom.xmlsqlcipher-jdbc 依赖的注释,重新构建
  2. 修改 application-prod.yml 中 datasource 配置,使用 SQLCipher URL
  3. 迁移现有明文数据库(如有):

    # 方案: 导出 → 启用加密 → 导入
    sqlcipher data/okr-performance.db "PRAGMA key='${DB_ENCRYPT_KEY}';"
    

5. Nginx + HTTPS

# 安装 certbot
apt install certbot python3-certbot-nginx

# 复制 Nginx 配置
cp deployment/nginx-okr-performance.conf /etc/nginx/sites-available/
ln -s /etc/nginx/sites-available/nginx-okr-performance.conf /etc/nginx/sites-enabled/

# 获取 SSL 证书
certbot --nginx -d okr.your-company.com

# 测试并重载
nginx -t && systemctl reload nginx

6. 防火墙规则

# 仅开放 80/443 端口(Nginx)
ufw allow 80/tcp
ufw allow 443/tcp
# 阻止直接访问应用端口
ufw deny 18080/tcp
ufw enable

7. 部署后验证清单

  • HTTPS 可访问,HTTP 自动跳转
  • 安全头齐全(检查 curl -I https://okr.your-company.com
  • 使用 admin 登录后立即修改密码
  • SQL 日志已关闭(检查日志文件无 SQL 输出)
  • 非管理员用户无法查看他人的评分详情
  • 数据库文件权限为 600
  • 环境变量未包含默认值(生产配置无 fallback)

应急响应

如怀疑数据泄露:

  1. 立即轮换 APP_JWT_SECRET(所有用户需重新登录)
  2. 检查 /var/log/nginx/okr-access.log 中的异常访问模式
  3. 检查 operation_log 表中的可疑操作
  4. 重置所有用户密码
  5. 如数据库文件被拷贝,评估是否需要通知相关人员