- server/:node:http+node:sqlite 零依赖后端(users/sessions/user_stats/codex_unlocks/runs 五表) - 安全:scrypt密码哈希/服务端session/全prepared statement/输入白名单/限流/CSP等安全头/静态白名单防穿越 - 前端:o-auth登陆注册 + o-home飞行员大厅(排行榜Top100三排序+图鉴展柜背景:随机3主3副2僚机+刷怪巡游) - 图鉴改为收集点亮制(未收集=剪影+???),服务端codex_unlocks与本地并集同步 - 修复:回标题/大厅后背景卡在上场残影——render按battleUI门控+离场G=null;空闲=星空 - 结算上报:endRun/rush胜利两处submitRun,Boss击杀计数入排行榜 - playwright全流程验证通过(注册/登陆/游戏/结算/图鉴/安全注入/限流);游戏视觉未验收(用户亲自)
2.6 KiB
2.6 KiB
Star Raid 部署指南
运行要求
- Node.js ≥ 22.5(使用内置
node:sqlite,零 npm 依赖,无需npm install) - SQLite 数据库文件自动创建于
star-raid/data/starraid.db(已在 .gitignore)
启动
cd star-raid
npm start # = node server/server.js
# 或指定环境变量
PORT=8643 HOST=0.0.0.0 node server/server.js
| 环境变量 | 默认 | 说明 |
|---|---|---|
PORT |
8643 |
监听端口 |
HOST |
0.0.0.0 |
监听地址 |
COOKIE_SECURE |
空 | HTTPS 部署时必须设为 1(Cookie 加 Secure) |
DATA_DIR |
star-raid/data |
数据库目录 |
公网部署(nginx + HTTPS 推荐)
server {
listen 443 ssl;
server_name your-domain.com;
# ssl_certificate / certbot 申请
location / {
proxy_pass http://127.0.0.1:8643;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; # 限流按真实 IP
}
}
启动时 COOKIE_SECURE=1 PORT=8643 node server/server.js,用 systemd/supervisor 守护进程。
已实现的安全措施
- 密码:scrypt + 每用户随机盐 + 时序安全比较;登陆失败统一报错(不泄露账号是否存在),不存在账号也跑一次哈希防时序探测
- 会话:32 字节随机 token 存服务端 SQLite,HttpOnly + SameSite=Lax,7 天滑动续期,可吊销
- SQL 注入:全部 prepared statement;图鉴 key 服务端白名单(
server/api.js的CODEX_KEYS,新增装备时必须同步) - 输入:用户名/邮箱/密码白名单校验;请求体 ≤16KB;POST 强制
application/json(配合 SameSite 防 CSRF) - 限流:注册 10 次/5 分钟/IP,登陆 20 次/5 分钟/IP,成绩上报 20 次/5 分钟/账号
- 静态资源白名单:只放行
/、/css/、/js/(server/、data/、demo/不可访问),防目录穿越 - 安全头:CSP / X-Frame-Options / X-Content-Type-Options / Referrer-Policy
v1 边界(明确不做)
- 邮箱仅作唯一标识,无验证邮件、无找回密码(需 SMTP 服务,留 v2)
- 反作弊仅为基础校验(数值范围/限流):纯客户端游戏无法杜绝作弊,有志者改内存照样能伪造高分。如需严肃竞技,要加服务端回放校验(大工程)
- 星币/机库强化/机体解锁仍存浏览器 localStorage,不随账号同步(跨设备冲突解决复杂,留 v2)
- 排行榜 = 全服单榜,无分页/赛季
数据维护
- 备份:拷贝
data/starraid.db(WAL 模式,建议先PRAGMA wal_checkpoint或直接停服拷贝) - 重置排行榜:停服后删除
data/下文件,重启自动重建空库