Nexora Mazu
🏮 妈祖商城项目全栈负责代理。 模型
github-copilot/claude-opus-4.6,上级 nexora。
2026-05-10 鉴真溯源跨小程序复用 — 需求当场撤回
dora 在 nexora 频道下需求:把府见福礼小程序(pyerp_shop_wx,aid=1)的「鉴真溯源」功能搬到「湄洲妈祖官方文创」(aid=3)。扫描后摸清架构:两个小程序共用同一仓库 pyerp_shop_php / pyerp_shop_wx,按 aid 分商户;pages/certification/certification.vue 页面已在编译产物里存在,妈祖文创只是首页缺入口。
接到指令后改 siteinfo.js 切 meiyuhaowu.com + 首页加浮动按钮 + scanForTrace 方法 + CSS。但 uni-app 2.x 老项目 CLI 编译依赖兼容差,需 HBuilderX。08:23 dora 一句「恢复刚刚的需要修改」全部回滚 → 源码回到原始状态。后续派 cspy feature cmozit1f30006041c4uxkp3k3 跑了一轮分析(结论:阶段 1 直接改 ddwx_designerpage 表 JSON 加导航项,不用 CC;阶段 2 才需要派 CC 改前端),等 dora 拍 UI 风格 + aid + 后端商品支持范围三个问题再动。目前阻塞在产品决策。
2026-05-02 收银台订单丢推 ERP(MZSC-62)
跨服务器问题,由 nexora-ops 接手排查(妈祖商城 + 妈祖ERP 47.119.139.162/chaojierp 都在 ops 范围)。
订单 C260429122215259577(¥646.96,4-29 12:22 已支付)未推到 ERP。根因:商城 cashier_pay() 函数被注释、shop_order_push_log 队列未写入;推送队列写入与订单状态更新无事务保障 → 漏一笔即永久丢失,且无任何告警。
工单 MZSC-62 (Plane 妈祖商城项目) High:建议加定时对账任务(5-10min 扫已支付收银台 vs push_log)+ 失败日志表 + 队列写入与状态更新同事务。详细排查过程与生产架构见 nexora-ops 05-02 段。
2026-05-01 假期事件:阿里云 OSS UserDisable + xhfl 后台 tab 改造
事件 1 — 兴化福礼商城图片上传失败(阿里云 OSS 欠费):
13:04 用户截图”请求上传接口出现异常”,初判定位到 www.mazugift.com 兴化福礼/府见福礼站点(账号 xhfl00),不是本地 mazugift-php 容器。ThinkPHP runtime 日志反复出现 [error] [0]UserDisable: UserDisable RequestId: ... —— 阿里云 OSS 账户被禁用(欠费停服)。图片上传链路是 本地写入 → uploadoss() 上传 OSS,OSS 报错导致整个上传接口异常。13:27 Daddy 充值后 13:10 起 UserDisable 不再出现,恢复正常。
附带在本地容器 mazugift-php 上修了两个潜在坑(与本次无关,但顺手做了):
- 创建缺失的
/var/www/html/upload/目录 upload_max_filesize2M → 20M、post_max_size8M → 25M(写入/usr/local/etc/php/conf.d/uploads.ini,容器重启生效;如--force-recreate需写 Dockerfile 持久化)
节后落实方案(已写入 nexora-ops HEARTBEAT.md,5 月 6 日上班提醒):
- P0 — 预存余额或开通自动续费(根治)
- P1 — 阿里云余额预警
- P2 — 代码改造:
uploadoss()失败时降级返回本地 URL,避免 OSS 挂掉拖死整个上传接口
详见 decisions 05-01 段。
事件 2 — xhfl 后台「运营数据概览」时间 tab 改造:
站点 www.mazugift.com 后台首页(/?s=/Backstage/index,控制器 app/controller/Backstage.php::index()),原 6 个 tab 今日/昨日/本周/近7天/本月/近30天 调整为 今日/昨日/本周/本月/上个月/本年度:
| 文件 | 改动 |
|---|---|
app/view/backstage/welcome.html 267-272 | 前端 tab 按钮:去掉”近7日""近30日”,新增”上个月""本年度” |
app/controller/Backstage.php 253-302 | 后端:新增 day=9(上个月)和 day=365(本年度)的时间范围计算 |
备份留服务器:Backstage.php.bak20260501 / welcome.html.bak20260501。Daddy 测试通过,记录已写入 memory/2026-05-holiday-incidents.md。
2026-04-30 E2E 工单洪水(自动化测试 ≠ 真实故障)
整天 mazu-cs 被 wechat-e2e 模拟用户灌了 461 条请求,触发 ~9 个 ESCALATE 工单(用户 / 门店都是字面 E2E测试)转发到 nexora-mazu。每次都正确判别为测试用户,不实际碰生产,但每次给出标准排查清单作为备忘:docker ps / docker logs --tail 100 www_mazugift_com / df -h / MySQL 连接 + 慢查询 / PHP-FPM 进程内存。该模式现在可以认为是E2E 流程自检——客服 → 工单 → 项目代理链路完整、不误伤生产。后续真有一类问题需要排查(支付宝 ISV app_auth_token),处理路径已在 04-29 段记录。
2026-04-29 商城关停 + 客服收支付宝 ISV 工单
- 14:55 cobra 在 nexora 频道指令”把妈祖商城先关了” → nexora-mazu 停掉
mazugift-phpDocker 容器,商城对外不可访问 - 15:48 mazu-cs 客服转派工单 cmok8bjwh000904goszn8oswu(用户 “Vol / 朝阳店” 走 H5 商城问”妈祖的访问地址是多少 / 给我直接能用链接”):客服回复商城确实 502,建议有 SSH 权限的同事到
47.96.90.171查 docker;同一工单内附带 04-29 早 09:28 mazu-cs 收到的另一类问题截图 — 府见福礼小程序支付宝支付报”此用户不允许自调用,第三方应用禁止直接调用该接口,请传入应用授权令牌” - 支付宝 ISV
app_auth_token修复方案与 04-28 退款问题同根因,本仓库 HEADdd330ba已含修复(见 04-28 段),mazu-cs 上报后无人确认是否已部署到生产 - 决定层面:关停命令未给原因;客服侧没有自助拉起容器的能力(运维权限隔离)→ 见 decisions 04-29
2026-04-28 H5 商城上线 + 支付宝退款 ISV 修复 + 仓库结构澄清
两件事一天搞定,全程 Daddy 在 nexora 频道一对一陪改:
1. H5 商城上线 mazugift.nexora.restry.cn/h5/
商城小程序前端仓库 pyerp_shop_wx 是 uni-app(Vue2 + uView UI) 跨平台项目,manifest.json 已带 H5 配置。第一轮走了弯路:去 /tmp/uni-build/ 用 @vue/cli + vue-cli-plugin-uni 自建编译壳,装 moment / uview-ui / vuex-persistedstate / sass / less + 改 vue.config.js (lintOnSave:false) + 修若干 @import "/main.css" → @/main.css 路径才编通。Daddy 反问”为什么要弄得这么麻烦?源码本身就跨平台” → 后来直接在仓库根用 npm run build:h5 编译,部署到 ~/repos/pyerp_shop_php/h5/ 静态目录。
siteinfo.js 由生产 https://www.mazugift.com 改为 https://mazugift.nexora.restry.cn,siteinfo.js 走 webpack require 打包入 bundle,不会作为独立文件出现在产物里。
uni-app H5 端 scoped CSS 标签选择器失效(坑):底部 tabbar 图标/文字错乱,根因 dp-tabbar 组件 scoped CSS 用 image[data-v-xxx] / view[data-v-xxx],但 H5 端 <image> 编译为 <uni-image>、<view> 编译为 <uni-view> → 标签选择器全部 miss。修法:标签选择器改 class 选择器(.dp-tabbar-center-icon / .dp-tabbar-center-text)。结论:H5 与小程序原生差距较大,目前主用小程序,H5 暂作辅助,保留 /h5/ 子路径访问,根路径 / 维持 PHP 后台 302 不动。
H5 首屏 API 需带 needinit=1 让后端在响应里附 _initdata(菜单/初始化数据),并非单独 init 接口。
2. 支付宝退款 ISV 应用授权令牌补丁
后台触发退款报:此用户不允许自调用,第三方应用禁止直接调用该接口。请传入应用授权令牌或更换其他类型应用。 根因:商家用的是支付宝第三方/服务商(ISV)应用,必须传 app_auth_token 才能代商户调 alipay.trade.refund,但 app/common/Alipay.php refund() 方法在创建 AopClient 之后直接 execute,未走 app_auth_token 流程(同文件的支付/查询方法都有)。
本地 ~/repos/pyerp_shop_php/app/common/Alipay.php 加上 alipay_mode==1 → getAuthToken() → $aop->appAuthToken=...(与支付方法对齐)。Docker 容器代码挂载即时生效。
意外发现:撤销改动 git pull 时看到生产仓库 HEAD dd330ba “支付宝退款 + 收银台退款功能 + 扫码盒语音播报 + 小票打印” 已经包含 app_auth_token 修复 → 之前 checkout 的是旧版本,无需自己再改一遍,撤销本地改动即可。
最近上游提交(mazu 全栈仓库结构存档):
| 仓库 | 最近提交(4 月) |
|---|---|
pyerp_shop_php(商城后端) | dd330ba 支付宝退款+收银台退款+扫码盒语音+小票打印 / 30d0844 config.php 环境变量化(04-27) / b8121ce GitLab CI/CD 自动部署 / 59c998d 支付宝收款+接口文档 |
pyerp_shop_wx(小程序端) | a482dac 底部图片+3 文档 / dd01ce2+124755b 防伪码 / 8a5c49d+f2062be 早期初始化 |
测试退款的现实:本地环境改动需要真实支付宝订单(沙箱或小程序 0.01 下单)才能验证;生产 47.96.90.171 SSH 权限我们没有,要等部署到生产。
2026-04-27 mazugift dev 全站 500 → config.php 环境变量化(里程碑)
mazugift.nexora.restry.cn 整站 500 / 容器 curl 无返回。一路排到底:
| 层 | 问题 | 修法 |
|---|---|---|
| 数据库连接 | config.php 硬编码 DB_HOST=192.168.3.22(局域网 IP),容器内 timeout | 改回 pyerp-mysql(Docker 网络) |
| 凭证管理 | DB 地址/用户/密码/库名全部硬编码在 config.php | getenv() 读环境变量 + 默认值兜底;新建 .env + .env.example;docker-compose.yml 加 env_file 注入;重建容器生效 |
| 验证码 500 | /?s=/captcha 调 imagecreate() 报 500 → PHP 容器缺 GD 扩展 | apt install php-gd(含 libpng / libjpeg / libfreetype),并写进 mazugift-dev/Dockerfile 持久化 |
| Git 状态 | 项目目录之前没有 git repo | git init 后随 30d0844 commit 推到 GitLab(config.php env-var 改造) |
部署机制澄清:dev 环境代码目录是直接挂载到容器(/home/claw/repos/pyerp_shop_php → 容器内),改本地源码即时生效,不走 CI/CD。Cobra 一开始误说”通过 CI/CD 部署”被 Daddy 当场纠正,实际只有 GitLab CI pipeline 文件(b8121ce)提交过、没真正在跑。
Daddy 全库审查结论:所有数据库连接确认指向本机 pyerp-mysql(172.19.0.2:3306 / 宿主机映射 13306),没有任何指向生产数据库。mazugift 用户连 py_test 库(385 表),yt1988 是超级管理员(isadmin=2)。
派生:部署规范公告(cobra 04-27 拟稿,全 nexora 项目代理通用):
所有项目部署时,数据库密码、API Key、Token 等身份凭证严禁硬编码到代码中。
- 通过
.env文件或环境变量注入;.env必须.gitignore- 代码只引用环境变量,不出现明文凭证
- Docker 部署统一通过
docker-compose.yml的env_file或environment
详见 decisions 04-27 段。
2026-04-27 Test PostgreSQL 共享容器(同日 cobra 起,跨项目复用)
为内网开发提供共享 PG 实例,不暴露外网:
| 项 | 值 |
|---|---|
| 容器 | test-postgresql |
| 地址 | 192.168.1.235:15432 |
| 用户 | admin |
| 密码 | Nexora@PG2026(含 @ → URL 形式要 %40 转义) |
| 默认库 | testdb |
| 监听 | 仅内网 IP,UFW inactive / iptables ACCEPT;pg_hba.conf host all all all scram-sha-256 |
踩坑:第一轮服务端配置生成时,bash 命令替换把密码字段吞了 → 客户端连不上。手动 cat 写入 pg_hba.conf / 配置文件后才正常(同样的踩坑当天 ottor/tiger 部署 Hysteria2 又复现一次,详见 vpn-proxy-management)。
2026-04-24 生产 500 + 小程序码配置缺失
- MySQL 连接失败 500:妈祖商城
SQLSTATE[HY000] [2002] No such file or directory— MySQL socket 丢失。排查确认 MySQL 服务状态 + 连接配置,恢复正常 - 后台”查看链接”图片加载不出来:前端调
getwxacodeunlimit拉小程序码,但开发环境没配微信小程序access_token/appid/secret/ 域名白名单 → 非 bug 是环境配置问题,生产环境不受影响。结论回复 Daddy 无需修代码
2026-04-18 深度体检
- 技术栈:基于点大商城 V2 (diandashop) 商业 SaaS 魔改,ThinkPHP 6 + PHP 7.4 + Layui
- 代码量:500 万行 PHP / 44,000+ 文件;80%+ 是不用的模块(餐饮/课程/论坛/直播/FIFA/求签…)
- C 端不可用:所有域名 302 跳转到后台登录页,H5 目录只有一个
4.html;实际 C 端依赖微信小程序(代码在另一仓库) - 代码质量 3/10:前后端未分离;零工程化(无测试/CI/migration);PHP 7.4 EOL;git 仅一个”初始化” commit
- 迁移建议:推荐 CRMEB Pro(同为 ThinkPHP 生态,14k+ stars,数据迁移平滑);6-8 周 / 1 人。 2026-04-18 晚间由 nexora-ops 部署 CRMEB 妈祖实例(https://crmeb-mazu.nexora.restry.cn)
基本信息
| 属性 | 值 |
|---|---|
| Bot 名称 | @nexora-mazu |
| Emoji | 🏮 |
| 创建时间 | 2026-04-16 |
| 上级 | nexora |
| 模型 | github-copilot/claude-opus-4.6 |
负责系统
| 属性 | 值 |
|---|---|
| 系统地址 | mazugift.nexora.restry.cn |
| 技术栈 | PHP CRMEB |
| Docker 容器 | Docker 容器 |
| 数据库 | 3 个子商城数据库(mazugift_fuli 等),pyerp-mysql:13306 |
| 生产数据源 | 47.96.90.171 |
| Plane 项目 | MZSC — 61 条 Issue,14 条未完成(Plane 上最多) |
| 当前进度 | Step 0 完成 |
角色
项目制重组后每个项目代理全栈负责:前端 UI、后端 API、数据库、部署、测试、Bug 跟踪。跨项目共享服务由 nexora-ops(运维)、nexora-alert(监控)、nexora-docs(文档)承担。