| 特性 | 描述 |
|---|---|
| 🤖 Telegram Bot | 收款通知、余额查询、绑定管理,无需二次开发 |
| 🔒 代理回调 | 支持通过代理服务器转发回调,防止暴露源站 IP |
| ⚡ 高性能 | 单进程支撑高并发,资源占用低 |
| 🔌 插件化 | 56+ 支付通道插件,热加载支持 |
- Node.js 18+
- MySQL 8+
- 内存 1G+
本项目已内置 Docker 部署文件,支持一条命令启动应用和数据库。
⚠️ 重要说明(必读)
- 使用 Docker 部署不代表可以平滑升级。
- 实际更新时,通常需要你自己处理镜像更新、数据库迁移、配置兼容与回滚。
- 换句话说,任何更新基本都和你没什么关系,还是要靠你自己运维。
- 如果只是玩玩、测试体验,可以使用 Docker。
- 如果准备生产长期运行,建议手搓部署并自行维护升级链路。
docker compose up -d --build默认会启动:
lunafirpay-app(端口3000)lunafirpay-db(端口3306)
Docker 部署只使用根目录 config.yaml,不需要维护第二份 Docker 专用配置。
你只需要修改 config.yaml 里的数据库配置:
database:
host: "db"
port: 3306
user: "你的数据库用户"
password: "你的数据库密码"
database: "lunafirpay"
host在 compose 场景必须是db(MySQL 服务名)。
应用容器启动时会先执行数据库用户同步脚本:
- 按
config.yaml读取database.user/password/database - 使用 MySQL root 权限自动创建/更新对应用户
- 自动授予该库权限后再启动 Node.js 服务
因此你只改 config.yaml 一处即可,避免账号不一致导致 Access denied。
首次启动时会自动执行 initialization.sql 初始化数据库。
如果你改了数据库账号、密码或库结构,建议重建数据卷让初始化重新执行:
docker compose down -v
docker compose up -d --build
down -v会删除数据库数据,请先备份。
适用场景:你使用 docker compose 部署了 lunafirpay-app + lunafirpay-db。
- 进入目录并赋予执行权限(首次执行时)
cd server
chmod +x .update-docker.sh- 执行更新
./.update-docker.sh- 如果你的数据库 root 密码不是默认值,使用下面命令
DB_ROOT_PASSWORD=你的root密码 DB_NAME=lunafirpay ./.update-docker.sh- 更新完成后检查容器状态
docker compose ps
docker logs --tail 100 lunafirpay-app说明:
- 脚本会自动判断镜像时间戳版本(新版本更大才升级)。
- 脚本会自动对比
initialization.sql的哈希,只有变更时才执行数据库迁移。 - 脚本不会执行
down -v,不会主动删除数据库卷数据。
适用场景:你是手动部署(node app.js / systemd / pm2)。
- 进入目录并赋予执行权限(首次执行时)
cd server
chmod +x update.sh- 执行更新
./update.sh- 常见可选参数
GIT_REF=origin/main SERVICE_NAME=lunafirpay ./update.sh说明:
- 脚本会从 Git 拉取并切换到目标提交。
- 自动保留本地
config.yaml,避免更新覆盖运行配置。 - 自动处理本地未提交改动(stash)以避免更新冲突。
- 自动对比
initialization.sql哈希并按需执行平滑数据库迁移。 - 最后自动重启服务(systemd / pm2 / nohup)。
本项目每次推送到 main 分支或发布新标签时,都会自动构建并推送 Docker 镜像到 GitHub Container Registry(GHCR)
你可以直接拉取官方镜像,无需本地构建:
docker pull ghcr.io/skynami/lunafirpay:latest- 也可以拉取指定 tag,例如
ghcr.io/skynami/lunafirpay:v1.0.0 - 镜像自动构建流程见
.github/workflows/docker-publish.yml
# 克隆仓库
git clone https://github.com/Skynami/LunaFirPay.git
cd LunaFirPay
# 安装依赖
npm install
# 导入数据库
mysql -u root -p your_database < initialization.sql
# 配置数据库
cp config.yaml.example config.yaml
# 编辑 config.yaml 填写数据库连接信息
# 修改根目录 nginx.conf 配置文件
nano nginx.conf
# 启动服务
node app.js使用 deploy.sh 可以在 Linux 服务器上快速完成部署(自动安装 Node.js、配置数据库、systemd 守护进程):
# 导入数据库信息
mysql -u root -p your_database < initialization.sql
# 运行一键部署脚本(root 运行)
bash deploy.sh
# 修改根目录 nginx.conf 配置文件
nano nginx.conf💡 提示: 搭建完成后,第一个注册的用户将自动成为管理员。
server/
├── app.js # 应用入口
├── config.yaml # 配置文件
├── dist/ # 前端构建产物
├── routes/ # 路由模块
│ ├── merchant/ # 商户端接口
│ └── provider/ # 服务商端接口
├── plugins/ # 支付通道插件
├── Telegram/ # Telegram Bot 模块
├── utils/ # 工具函数
| 路径 | 说明 |
|---|---|
/direct/:token |
直接收款页(渲染 views/direct.ejs) |
/api/pay/cashier |
收银台页面 |
/api/pay/direct/create-order |
直接收款创建订单 |
/api/pay/dopay |
执行支付 |
/api/pay/qrcode |
支付二维码 |
/api/pay/success |
支付成功页 |
/submit.php |
兼容易支付提交接口 |
/mapi.php |
兼容易支付 MAPI |
/api.php |
兼容易支付 API |
callback-proxy.js 是一个独立的 Node.js 回调中转服务,用于隐藏支付平台源站 IP。
支付成功后,支付平台通过代理服务器向商户发送回调通知:
支付平台 -> 代理服务器 -> 商户服务器
请求格式:https://代理域名/https://商户回调地址
支持部署到各云厂商的 Serverless 云函数:
| 云厂商 | 服务名称 |
|---|---|
| 阿里云 | 函数计算 FC |
| 腾讯云 | 云函数 SCF |
| AWS | Lambda |
⚠️ 注意: 不支持 Cloudflare Workers,因为 Workers 不支持原生 Node.jshttp模块,而且CPU时间严格限制,根本无法完成回调
部署步骤:
- 创建云函数,运行环境选择 Node.js 18+
- 上传
callback-proxy.js代码 - 根据云函数要求修改监听端口(如阿里云 FC 使用
9000) - 设置 HTTP 触发器/API 网关为「无需鉴权」
- 获取云函数的公网访问地址
⚠️ 注意: 不需要太高性能,使用最低档的配置就可以完成,此举可以节省费用 配置支付平台:
在 config.yaml 中配置代理地址:
callbackProxy: "https://your-proxy-domain.com/"node callback-proxy.js
# 默认监听 6666 端口加入 Telegram 群组讨论交流:
欢迎提交 Issue 和 Pull Request。
无。 爱干嘛干嘛,商用、修改、分发、二次销售随便你。
如果这个项目对你有帮助,请给一个 ⭐ Star