文档

自托管部署

仓库里还没有 docker-compose.yml,所以这一页只提供手动部署步骤——不展示不存在的一键命令。

生产环境三条红线:JOINT_DEV_MODE=1 只能用于本地调试;不要裸跑 HTTP,必须配置 HTTPS/WSS;实时会话注册表在内存中,暂时无法横向扩容,重启会断开会话。

手动部署

git clone <repo> && cd joint/server
npm install
cp .env.example .env   # 按下表填写
npm run migrate
npm run start

建议用 systemd 或 pm2 守护进程,确保崩溃后自动拉起。

环境变量

PORT=8080                 # 监听端口
JOINT_DEV_MODE=0          # 生产必须为 0
DATABASE_URL=file:./joint.db   # SQLite 或 postgres://...
JWT_SECRET=<随机 32 字节>       # 令牌签名密钥
PAIRING_HMAC_SECRET=<随机值>   # 配对码摘要密钥
SMTP_HOST=…  SMTP_PORT=…  SMTP_USER=…  SMTP_PASS=…
MAIL_FROM=joint@yourdomain.com
PUSH_PROVIDER_KEY=<推送服务密钥>

邮件服务

  • 登录验证码依赖 SMTP,未配置时用户无法登录
  • 建议使用带独立发信域名的服务,降低验证码进垃圾箱的概率
  • 开发模式下验证码会打印在后端日志中,生产环境务必关闭

HTTPS / WSS 反向代理

server {
  listen 443 ssl;
  server_name joint.example.com;

  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
  }
}

缺少 Upgrade / Connection 头会导致实时会话连不上,只有通知能用。

数据库:SQLite 还是 PostgreSQL

  • SQLite:单人或小团队自用,零运维,备份就是复制一个文件
  • PostgreSQL:多人共用、需要定期备份与监控时更合适
  • 两者数据模型一致,可通过导出/导入迁移

备份、升级与迁移

# SQLite 备份
sqlite3 joint.db ".backup joint-$(date +%F).db"

# 升级
git pull && npm install && npm run migrate && systemctl restart joint

升级前先备份数据库;迁移脚本是向前兼容的,回滚需要用备份恢复。

健康检查与日志

  • 健康检查:GET /health 返回 200 即视为存活
  • 日志默认输出到 stdout,由 systemd/pm2 或 Docker 收集
  • 关注日志中的配对失败、限流触发与 WebSocket 断开记录

推送通知

  • 需要配置推送服务密钥,否则只有 App 前台时能看到消息
  • iOS 与 Android 分别需要各自的推送凭证
  • 推送内容只包含事件类型与会话标识,不携带终端正文