Files
akmon/push-receiver-service

基于 Supabase 的推送消息接收服务

专门用于接收和存储各种推送消息到 Supabase 数据库的独立服务。

🌟 特性

  • 基于 Supabase: 使用 Supabase PostgreSQL 数据库
  • 推送消息接收: 支持多种类型的推送消息SOS、健康、位置、告警等
  • 批量处理: 支持单个和批量消息处理
  • 重复检测: 自动检测和处理重复消息
  • 实时监控: 提供详细的统计和监控功能
  • 安全保护: API 密钥验证和请求频率限制
  • 完整日志: 详细的操作日志记录
  • 优雅关闭: 支持服务的优雅启动和关闭

🚀 快速开始

1. 安装依赖

cd push-receiver-service
npm install

2. 配置 Supabase

  1. 创建 Supabase 项目:

  2. ⚠️ 重要:数据库适配说明:

    • 本服务已适配现有的 ak_usersak_devices
    • 推送消息相关表使用 ps_ 前缀(ps_push_messagesps_push_types 等)
    • 请确保现有的基础表已存在于您的 Supabase 项目中
    • 详细适配信息请查看 SUPABASE_ADAPTATION.md
  3. 执行数据库初始化脚本:

    • 在 Supabase Dashboard 中打开 "SQL Editor"
    • 复制 database/supabase-init.sql 文件内容
    • 粘贴到 SQL Editor 中并执行
  4. 配置环境变量:

    cp .env.supabase .env
    

    然后编辑 .env 文件:

    SUPABASE_URL=https://your-project-ref.supabase.co
    SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
    API_KEY=your-custom-api-key
    

3. 初始化数据库

node setup-supabase.js

4. 启动服务

node supabase-server.js

服务将在 http://localhost:3001 启动。

📋 API 端点

基础信息

  • 服务信息: GET /
  • 健康检查: GET /api/health

推送消息接收

  • 单个消息: POST /api/push/message
  • 批量消息: POST /api/push/batch

数据查询

  • 统计信息: GET /api/stats
  • 消息列表: GET /api/messages
  • 清理数据: POST /api/cleanup

🔧 API 使用示例

发送单个推送消息

curl -X POST http://localhost:3001/api/push/message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key" \
  -d '{
    "pushType": "HEALTH",
    "userId": "123e4567-e89b-12d3-a456-426614174000",
    "deviceId": "987fcdeb-51a2-43d7-8f9e-123456789abc",
    "H": 75,
    "O": 98,
    "T": 36.5
  }'

注意: userIddeviceId 必须使用 UUID 格式,且必须是现有 ak_usersak_devices 表中的有效记录。

发送批量推送消息

curl -X POST http://localhost:3001/api/push/batch \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key" \
  -d '{
    "messages": [
      {
        "pushType": "SOS",
        "userId": "123e4567-e89b-12d3-a456-426614174000",
        "emergencyLevel": "HIGH",
        "lat": 39.9042,
        "lng": 116.4074
      },
      {
        "pushType": "HEALTH",
        "userId": "456e7890-e89b-12d3-a456-426614174001",
        "H": 80,
        "O": 95
      }
    ]
  }'

JavaScript 调用示例

// 发送单个推送消息
const response = await fetch('http://localhost:3001/api/push/message', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-API-Key': 'your-api-key'
    },
    body: JSON.stringify({
        pushType: 'HEALTH',
        userId: '123e4567-e89b-12d3-a456-426614174000',
        deviceId: '987fcdeb-51a2-43d7-8f9e-123456789abc',
        H: 105,
        O: 88
    })
});

const result = await response.json();
console.log('推送结果:', result);

Python 调用示例

import requests

# 发送单个推送消息
response = requests.post('http://localhost:3001/api/push/message', 
    headers={
        'Content-Type': 'application/json',
        'X-API-Key': 'your-api-key'
    },
    json={
        'pushType': 'HEALTH',
        'userId': 'user_12345',
        'H': 105,
        'O': 88
    }
)

result = response.json()
print('推送结果:', result)

📊 支持的推送类型

类型 说明 优先级 必需字段
SOS 紧急求救 1 (最高) userId
ALERT 告警信息 2 userId, alertType
HEALTH 健康数据 3 userId
LOCATION 位置信息 4 userId
DEVICE_STATUS 设备状态 4 deviceId
ACTIVITY 活动数据 5 userId

🗄️ 数据库结构

主要数据表

  1. push_messages: 推送消息主表
  2. push_types: 推送类型配置表
  3. message_processing_logs: 消息处理日志表
  4. devices: 设备信息表
  5. users: 用户信息表
  6. system_stats: 系统统计表

消息数据结构

{
  "id": "uuid",
  "push_type": "HEALTH",
  "user_id": "user_12345",
  "device_id": "device_001",
  "raw_data": { "完整的原始数据" },
  "parsed_data": { "解析后的结构化数据" },
  "received_at": "2025-06-25T10:30:00Z",
  "processing_status": "processed",
  "priority": 3,
  "is_duplicate": false,
  "source_ip": "192.168.1.100",
  "user_agent": "Device Client/1.0"
}

🔒 安全配置

API 密钥验证

在环境变量中设置 API_KEY

API_KEY=your-secure-api-key

所有 API 请求(除健康检查外)都需要在请求头中包含:

X-API-Key: your-secure-api-key

请求频率限制

  • 默认:每分钟最多 1000 个请求
  • 可通过环境变量配置:RATE_LIMIT_MAX_REQUESTS

CORS 配置

可通过 ALLOWED_ORIGINS 环境变量配置允许的来源。

📈 监控和日志

日志文件

  • logs/supabase-push-service.log: 一般日志
  • logs/supabase-push-service-error.log: 错误日志
  • logs/database.log: 数据库操作日志

统计信息

访问 /api/stats 获取详细的统计信息:

{
  "success": true,
  "data": {
    "service": {
      "uptime": 3600,
      "requestCount": 150,
      "messageCount": 120,
      "errorCount": 2
    },
    "messages": [
      {
        "push_type": "HEALTH",
        "total_count": 80,
        "processed_count": 78,
        "failed_count": 2,
        "pending_count": 0
      }
    ]
  }
}

🔧 环境配置

完整的环境变量配置

# 服务器配置
PORT=3001
HOST=0.0.0.0
NODE_ENV=production

# Supabase 配置
SUPABASE_URL=https://your-project-ref.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key

# 安全配置
API_KEY=your-secure-api-key
ALLOWED_ORIGINS=*
RATE_LIMIT_MAX_REQUESTS=1000

# 日志配置
LOG_LEVEL=info
LOG_DIR=./logs

# 消息处理配置
MAX_MESSAGE_SIZE=1048576
BATCH_SIZE_LIMIT=1000
ENABLE_DUPLICATE_CHECK=true

# 数据清理配置
AUTO_CLEANUP_ENABLED=true
AUTO_CLEANUP_DAYS=30

🚀 部署

Docker 部署

FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install --production

COPY . .

EXPOSE 3001

CMD ["node", "supabase-server.js"]

PM2 部署

npm install -g pm2
pm2 start supabase-server.js --name "supabase-push-receiver"
pm2 startup
pm2 save

云服务部署

支持部署到:

  • Vercel
  • Netlify
  • Railway
  • Heroku
  • AWS Lambda
  • 腾讯云函数

🛠️ 开发

项目结构

push-receiver-service/
├── lib/
│   └── supabase-database.js    # Supabase 数据库操作类
├── database/
│   └── supabase-init.sql       # 数据库初始化脚本
├── logs/                       # 日志目录
├── supabase-server.js          # 主服务器文件
├── setup-supabase.js           # 数据库设置脚本
├── package.json
├── .env.supabase              # Supabase 环境配置模板
└── README.md

运行测试

# 测试 Supabase 连接
node setup-supabase.js

# 启动开发服务器
npm run dev

🤝 业务集成

与现有系统集成

  1. 配置推送地址: 将设备或系统的推送地址指向此服务
  2. 设置API密钥: 确保所有推送请求都包含正确的API密钥
  3. 监控日志: 定期检查服务日志确保正常运行
  4. 数据分析: 使用 Supabase Dashboard 或 API 进行数据分析

数据流处理

设备/系统 → 推送消息 → 接收服务 → Supabase → 业务处理
                ↓
            实时通知/告警

📞 支持

如果您在使用过程中遇到问题:

  1. 检查日志文件获取详细错误信息
  2. 确认 Supabase 配置正确
  3. 验证 API 密钥和网络连接
  4. 查看 Supabase Dashboard 的数据库状态

注意: 这是一个专门的消息接收服务,只负责接收和存储推送消息。业务逻辑处理需要另外实现。