Files
sbnews/README.md
T
2026-06-12 22:23:47 +08:00

408 lines
19 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Sport Era 服务器部署脚本
部署脚本位置:
- Windows 原生:`scripts/deploy-server.ps1`
- Bash 兼容版:`scripts/deploy-server.sh`
脚本通过 SSH 别名 `sbnews` 连接服务器,打包本地 `server` 代码并在服务器目录解压安装。Windows 下优先使用 `deploy-server.ps1`,不依赖 WSL。
## Docker 爬虫定时任务
Docker 只负责运行 Python 爬虫和容器内 cron。MySQL、Redis、Nginx 继续使用宿主机服务,容器通过运行时环境变量连接宿主机服务。
配置源:
- Docker Compose`docker/docker-compose.crawler.yml`
- 环境变量示例:`docker/.env.docker.example`
- 任务清单:`server/public/dongqiudi-crawler/config/crawler_tasks.yaml`
- 任务日志:管理后台 `系统设置 -> 系统维护 -> 爬虫任务日志`
- 错误日志:管理后台 `系统设置 -> 系统维护 -> 爬虫错误日志`
禁用的定时任务不要放进 Docker 执行清单;如需临时停用某个 Docker 爬虫任务,将 `crawler_tasks.yaml` 对应任务的 `active` 改为 `false`,然后重建或重启 crawler 容器。
### 当前 Docker 定时任务列表
| 任务标识 | 任务名称 | 动作 | Cron |
| --- | --- | --- | --- |
| `video` | 视频列表采集 | `video` | `54 * * * *` |
| `lottery_draw` | 彩种开奖数据采集 | `lottery_draw` | `*/2 * * * *` |
| `match_finish` | 超时比赛收尾 | `match_finish` | `*/1 * * * *` |
| `error_report` | 爬虫错误报告邮件 | `error_report` | `*/1 * * * *` |
| `csl_match` | 中超赛程页面采集 | `csl_match` | `0 */1 * * *` |
| `nba_match` | NBA赛程页面采集 | `nba_match` | `*/1 * * * *` |
| `cba_match` | CBA赛程页面采集 | `cba_match` | `0 */1 * * *` |
| `epl_match` | 英超赛程页面采集 | `epl_match` | `0 */1 * * *` |
| `bundesliga_match` | 德甲赛程页面采集 | `bundesliga_match` | `0 */1 * * *` |
| `laliga_match` | 西甲赛程页面采集 | `laliga_match` | `0 */1 * * *` |
| `seriea_match` | 意甲赛程页面采集 | `seriea_match` | `0 */1 * * *` |
| `ligue1_match` | 法甲赛程页面采集 | `ligue1_match` | `0 */1 * * *` |
| `ucl_match` | 欧冠赛程页面采集 | `ucl_match` | `0 */1 * * *` |
| `uel_match` | 欧联赛程页面采集 | `uel_match` | `0 */1 * * *` |
| `tennis_match` | 网球赛程页面采集 | `tennis_match` | `0 */1 * * *` |
| `esports_match` | 电竞赛程页面采集 | `esports_match` | `0 */1 * * *` |
| `sports_match` | 体坛赛程页面采集 | `sports_match` | `0 */1 * * *` |
| `truth_social` | Truth Social帖子采集+同步 | `truth_social` | `0 */12 * * *` |
| `league_news` | 中超资讯采集 | `league_news` | `*/30 * * * *` |
| `article_content` | 文章内容补全 | `article_content` | `*/1 * * * *` |
| `live_detail` | 实时比赛详情更新 | `live_detail` | `*/1 * * * *` |
| `crypto_news` | 加密货币新闻采集 | `crypto_news` | `0 */1 * * *` |
| `article_content_fetch` | 资讯正文抓取 | `article_content_fetch` | `*/1 * * * *` |
| `dqd_worldcup` | 懂球帝世界杯采集 | `dqd_worldcup` | `*/10 * * * *` |
| `fifa_worldcup_news` | FIFA世界杯资讯 | `fifa_worldcup_news` | `*/10 * * * *` |
| `lottery_community` | 49宝典新旧澳六合彩社区采集 | `lottery_community` | `*/10 * * * *` |
| `taiwan_lottery_news` | 台湾彩券资讯采集 | `taiwan_lottery_news` | `15 */2 * * *` |
| `hkjc_lottery_news` | 香港赛马会资讯采集 | `hkjc_lottery_news` | `45 */2 * * *` |
| `cba_news` | CBA资讯采集 | `cba_news` | `20 * * * *` |
| `nba_news` | NBA资讯采集 | `nba_news` | `10 * * * *` |
### Docker 爬虫常用命令
以下命令默认在测试服执行:
```bash
ssh sbnews
cd /www/wwwroot/test-server.sbnews.net/docker
```
查看容器状态:
```bash
sudo docker ps --filter name=sport-era-crawler
sudo docker compose -f docker-compose.crawler.yml ps crawler
```
构建并启动 crawler
```bash
sudo docker compose -f docker-compose.crawler.yml up -d --build crawler
```
重启 crawler
```bash
sudo docker compose -f docker-compose.crawler.yml restart crawler
```
查看容器日志:
```bash
sudo docker logs --tail 100 sport-era-crawler
```
查看容器内已渲染的 cron
```bash
sudo docker exec sport-era-crawler sed -n '1,260p' /etc/cron.d/sport-era-crawler
```
手动执行并写入“爬虫任务日志”:
```bash
sudo docker exec sport-era-crawler python scripts/docker_task_runner.py run nba_match --task-key nba_match --task-name 'NBA赛程页面采集' --cron-expression 'manual'
sudo docker exec sport-era-crawler python scripts/docker_task_runner.py run live_detail --task-key live_detail --task-name '实时比赛详情更新' --cron-expression 'manual'
sudo docker exec sport-era-crawler python scripts/docker_task_runner.py run match_finish --task-key match_finish --task-name '超时比赛收尾' --cron-expression 'manual'
sudo docker exec sport-era-crawler python scripts/docker_task_runner.py run article_content_fetch --task-key article_content_fetch --task-name '资讯正文抓取' --cron-expression 'manual'
```
仅调试 Python 动作,不写入“爬虫任务日志”:
```bash
sudo docker exec sport-era-crawler python main.py nba_match
```
检查容器依赖:
```bash
sudo docker exec sport-era-crawler python -c "import scrapling, browserforge; print('crawler runtime ok')"
```
### PowerShell 一次执行命令
在 Windows PowerShell 中执行:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net
```
如果 `sbnews` 配置在 `C:\Users\Administrator\.ssh\config` 中,默认会使用 Windows 的 `ssh.exe` 读取该配置。
### 全量发布
不传 commit id 即为全量发布:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net
```
全量模式默认以仓库根目录为源,只打包以下三个子目录:
```text
server/
uniapp/
admin/
```
也就是说,远端 `RemoteDir` 下最终会形成:
```text
<RemoteDir>/server
<RemoteDir>/uniapp
<RemoteDir>/admin
```
默认会排除运行态或较大目录,例如 `server/.env``server/vendor``server/runtime``server/public/uploads``server/public/admin``server/public/mobile`、爬虫 `data/logs/venv`,以及 `uniapp/node_modules``uniapp/dist``admin/node_modules``admin/dist`。如确实需要包含,可追加参数:
```bash
--include-env
--include-vendor
--include-runtime
--include-uploads
--include-public-builds
--include-crawler-data
```
### 增量发布
传入两个 commit id,脚本会对比差异,只打包 `--to` 版本中的变更文件,并在服务器删除两个 commit 之间被删除的文件:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From <old_commit> -To <new_commit> -RemoteDir /www/wwwroot/test-server.sbnews.net
```
示例:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From abc1234 -To def5678 -RemoteDir /www/wwwroot/test-server.sbnews.net
```
### 自动增量发布
如果只是发布最近一次提交的后端改动,可以使用 `-AutoIncremental`,脚本会默认对比 `HEAD~1``HEAD`
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net
```
如果需要一次发布最近 N 个提交的后端改动,可以追加 `-AutoIncrementalCommits <n>`,例如发布最近 3 个提交会对比 `HEAD~3``HEAD`
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net
```
先演练不上传:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun
```
脚本会在打包和上传前先检查默认打包范围(`server` + `uniapp` + `admin`);如果这些目录内存在未提交、删除或未跟踪文件,会先自动提交这些变更,再继续计算增量范围。可以通过 `-AutoCommitMessage "提交说明"` 自定义这次自动提交的说明。若存在合并冲突,需要先手动解决。
注意:自动增量只包含指定提交范围内已经提交到 Git 的差异,不会包含工作区未提交文件。需要指定任意起止提交时,继续使用 `-From <old_commit> -To <new_commit>`
如果当前根目录 Git 只把 `server``uniapp``admin` 记录为 gitlink/submodule,脚本无法拿到对应目录内部的文件级差异;此时会把该目录从当前工作区按源码目录补进增量包,保证可以继续发布。
### 只演练不上传
先确认打包范围、包大小和增量删除清单:
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun
```
脚本会在打包后打印 `update log`:增量模式包含 commit 范围、commit 摘要、变更文件和删除文件;全量模式包含当前最新 commit 和默认打包目录。
每条部署日志都会带耗时,例如 `[+0.123s][total 1.456s]``+` 表示距离上一条日志的耗时,`total` 表示本次脚本启动后的累计耗时。服务器解压安装阶段会额外打印 `[deploy][remote]` 日志,用来判断耗时是在本地、上传还是远端解压。
### 发布后执行命令
如果需要解压后在服务器项目目录执行命令,可使用 `--post-install`
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net -PostInstall "php think optimize:clear"
```
### 发布 uniapp 源码到服务器并在服务器构建
默认发布命令会把 `server/``uniapp/``admin/` 一起同步到远端根目录;如果需要在服务器端构建 `uniapp`,建议在远端根目录执行构建,再把 H5 产物写回同一套代码下的 `server/public/mobile`
```powershell
cd D:\www\sport-era
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 `
-Sudo `
-RemoteDir /www/wwwroot/test-server.sbnews.net `
-UniappReleasePath ../server/public/mobile `
-PostInstall "cd uniapp && npm install && npm run build:h5"
```
说明:
- `-RemoteDir` 指向服务器上的项目根目录,解压后里面会同时有 `server/``uniapp/``admin/`
- `-UniappReleasePath` 会通过环境变量 `UNIAPP_RELEASE_PATH` 传给 `uniapp/scripts/release.mjs`;这里传 `../server/public/mobile`,是因为构建命令会先 `cd uniapp`,再把 H5 产物回写到兄弟目录 `server/public/mobile`
- 服务器需要预先安装 `node >= 18.19.0``npm`,否则 `npm install` / `npm run build:h5` 无法执行。
### 常见问题
1. `ssh: Could not resolve hostname sbnews`:检查 Windows 的 `C:\Users\Administrator\.ssh\config` 是否存在 `Host sbnews`,或直接用 `-HostName <服务器IP>`
2. PowerShell 禁止执行脚本:使用示例中的 `-ExecutionPolicy Bypass -File`,或以管理员身份调整当前用户执行策略。
3. `tar: Cannot utime``Cannot change mode`:远端目录权限不足,请加 `-Sudo`。脚本会使用 `sudo tar` 覆盖解压,并默认跳过还原 owner/permission,减少权限冲突。
4. 增量发布提示 commit 无效:确认 commit id 属于当前根目录 Git 可识别的历史。
5. `root gitlink include paths will be copied from working tree`:脚本检测到默认发布范围里仍有 gitlink/submodule 目录,会把这些目录从当前工作区源码补进增量包。
6. 仍需使用 Bash 兼容版时,可继续运行 `bash ./scripts/deploy-server.sh ...`
7. 服务器运行 `uniapp``node: command not found``npm: command not found`:先在服务器安装 Node.js 18.19+ 与 npm,再执行 `-SourceDir uniapp` 的发布命令。
<a href="https://www.likeshop.cn">![likeshop全开源商城](https://server.likeshop.cn/uploads/gitad/fastbuildAI.png)</a><br>
<a href="https://www.likeshop.cn">![likeshop全开源商城](https://server.likeshop.cn/uploads/gitad/likeshop.png)</a><br>
<a href="https://www.buildingai.cc">![BuildingAI](https://server.likeshop.cn/uploads/gitad/fastbuildAI.png)</a><br>
<h1 align="center">likeadminPHP
通用管理后台</h1>
<h4 align="center">🚀快速开发 🛠️ 一键生成代码 ✅后台多端自适应 📱手机端 🖥️PC(电脑)端前台</h4>
<p align="center">
<p align="center"><a href="https://gitee.com/likeadmin/likeadmin_php_saas">⬇⬇SaaS版点击这里⬇⬇</a></p>
<p align="center">
<a href="https://www.php.net/"><img src="https://img.shields.io/badge/PHP-8-8892bf"></a>
<a href="https://www.tslang.cn/"><img src="https://img.shields.io/badge/TypeScript-5-294e80"></a>
<a href="#"><img src="https://img.shields.io/badge/ThinkPHP-8.0-6fb737"></a>
<a href="#"><img src="https://img.shields.io/badge/Vue.js-3.5-4eb883"></a>
<a href="#"><img src="https://img.shields.io/badge/vite-5-ffc018"></a>
<a href="#"><img src="https://img.shields.io/badge/Element Plus-2.8-409eff"></a>
<a href="https://uniapp.dcloud.io/"><img src="https://img.shields.io/badge/uniapp-3-d85806"></a>
<a href="https://www.nuxtjs.cn/"><img src="https://img.shields.io/badge/Nuxt.js-3-18bc78"></a>
</p>
<p align="center">
<a href="https://mp.weixin.qq.com/"><img src="https://img.shields.io/badge/微信-公众号-05ce66"></a>
<a href="https://mp.weixin.qq.com/"><img src="https://img.shields.io/badge/微信-小程序-05ce66"></a>
<a href="https://open.weixin.qq.com/"><img src="https://img.shields.io/badge/微信-开放平台-05ce66"></a>
<a href="https://pay.weixin.qq.com/"><img src="https://img.shields.io/badge/微信-支付API3-05ce66"></a>
<a href="https://cloud.tencent.com/"><img src="https://img.shields.io/badge/腾讯云-COS-00a3ff"></a>
<a href="https://cloud.tencent.com/"><img src="https://img.shields.io/badge/腾讯云-短信-00a3ff"></a>
<a href="https://www.alipay.com"><img src="https://img.shields.io/badge/支付宝-支付-00a0eb"></a>
<a href="https://www.aliyun.com/"><img src="https://img.shields.io/badge/阿里云-OSS-ff6a00"></a>
<a href="https://www.aliyun.com/"><img src="https://img.shields.io/badge/阿里云-短信-ff6a00"></a>
<a href="https://www.qiniu.com/"><img src="https://img.shields.io/badge/七牛云-OSS-07beff"></a>
</p>
![](/server/public/readme/likeadmin.png)
## 🚀🚀🚀docker 本地一句命令快速部署体验
### 🐳 快速部署
安装启动 [docker](https://www.docker.com/) 之后,在终端运行以下命令即可体验。<br>
```shell
docker run -d --name likeadmin_php -p 20221:80 -e MYSQL_ROOT_PASSWORD=root registry.cn-guangzhou.aliyuncs.com/likeadmin/likeadmin_php:latest
```
如果需要自定义参数永久挂载数据,在终端运行以下命令,其中整个"[]"改成自定义参数。
```shell
docker run -d --name likeadmin_php \
-v 【主机存储数据库路径】:/var/lib/mysql \
-v 【主机存储项目代码文件路径】:/var/www/html/likeadmin_php \
-p 【访问端口】:80 \
-e MYSQL_ROOT_PASSWORD=【Mysql密码】 \
registry.cn-guangzhou.aliyuncs.com/likeadmin/likeadmin_php:latest
```
### ⚠️ 注意
1.如果出现无法访问,请等待 1 分钟,docker 部署每次会下载最新源码。<br> 2.安装的时候,数据默认帐号为 root,默认密码为 root。<br>
3.docker 快速部署只适合本地部署体验,不熟悉 docker 请勿用于生产环境,可能造成数据丢失等问题。
### 🛜 访问
访问安装程序:http://127.0.0.1:20221
<br>PC 端管理后台:http://127.0.0.1:20221/admin/login
<br>PC 端前台:http://127.0.0.1:20221/pc/
<br>手机端前台:http://127.0.0.1:20221/mobile/
## 👀 体验后台
### 管理后台
**地址:https://php.likeadmin.cn/admin <br>
账号:admin 密码:123456**
### 微信小程序前台
<img width="40%" src="/server/public/readme/mnp.jpg" /><br>
### 手机端网页前台
https://php.likeadmin.cn/mobile
### PC(电脑)端网页前台
https://php.likeadmin.cn/pc/
### 开发文档
地址:[https://www.likeadmin.cn](https://www.likeadmin.cn "https://www.likeadmin.cn")
### 🖥️ 界面预览
![](/server/public/readme/admin-1.png)
![](/server/public/readme/admin-2.png)
![](/server/public/readme/admin-3.png)
![](/server/public/readme/admin-4.png)
<br>
### 📱 手机端前台界面
<center class="half">
<img width="23%" src="/server/public/readme/mobile-1.png" />
<img width="23%" src="/server/public/readme/mobile-2.png" />
<img width="23%" src="/server/public/readme/mobile-3.png" />
<img width="23%" src="/server/public/readme/mobile-4.png" />
</center> <br>
### 🖥️PC 端前台界面
![](/server/public/readme/pc-1.png)
![](/server/public/readme/pc-2.png)
![](/server/public/readme/pc-3.png)
## 👨‍💻‍ 简介
我们希望能够为开源社区做出更多的贡献,推出永久免费开源的 likeadmin 通用前后端分离管理后台系统。遵循 MIT 开源许可协议,您可以免费使用,甚至允许把你基于 likeadmin 开发的软件应用开源、发布、销售。
<br>
## 🧐 进一步了解
### 🧰 场景介绍
1.likeadmin 已经搭建好前后端分离的底层,包含程序安装、登录、登出、工作台、菜单权限控制、角色、管理员、部门管理、岗位管理、素材管理、网站设置、图库管理等基础功能,无需重复造轮子。更有开发者工具功能,一键生成代码,大大节省开发时间。<br> 2.可视化系统程序安装界面,可自定义安装数据,开发者可快速扩展发行自己的软件产品。<br>
3.likeadmin 定位为通用的软件系统管理后台,方便开发者快速开发软件系统,文档清晰、代码易懂、简单易用。<br> 4.集成通用的微信支付(API3)、微信小程序公众号登录、阿里云、腾讯云短信,阿里云 OSS、腾讯云 COS、七牛云 OSS 等通用模块。
### 🐙 后端架构方面
1.服务端使用 PHP8.0 开发,性能有突破性的提升。<br> 2.使用最新 ThinkPHP8 框架,目前国内最流行的 PHP 框架,高性能、简单易用、文档齐全、支持 composer 快速安装组件、支持 Redis、支持 PSR 多种规范等。
### 🐹 前端架构方面
#### 后台
1.使用最流性的前后端分离方案 typescript、vue3、vite 开发,保持了代码的简洁、一致和规范。<br> 2.后台界面使用 element-plus UI 框架,简单精美的后台界面,丰富的组件库,方便快速开发,满足各种后台交互。
#### 手机前台
手机端 uniapp 前台,可以编译成手机 H5 网页、微信小程序、安卓 App,苹果 App 等客户端。
#### PC 端前台
PC 端前台使用 Nuxt.js,支持服务器端渲染(SSR),对 SEO 友好。
### 🛠️  代码生成器
一键生成前后端业务代码,大大提升开发效率。