## 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/app server/config server/extend server/public/dongqiudi-crawler server/route ``` 默认会排除运行态或较大目录,例如 `.env`、`vendor`、`runtime`、`public/uploads`、`public/admin`、`public/mobile`、爬虫 `data/logs/venv`。如确实需要包含,可追加参数: ```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 -To -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 ``` ### 自动增量发布 如果只是发布最近一次提交的后端改动,可以使用 `--auto-incremental`,脚本会自动对比 `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 ``` 先演练不上传: ```powershell cd D:\www\sport-era powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun ``` 注意:自动增量只包含最近两个提交之间已经提交到 Git 的差异,不会包含工作区未提交文件。如有多次提交需要一起发布,请继续使用 `--from --to `。 如果当前根目录 Git 只把 `server` 记录为 gitlink/submodule,且本机没有 `server/.git` 子仓库元数据,脚本无法拿到 `server` 内部的文件级差异;此时会自动降级为打包当前工作区默认的 5 个 server 目录,保证可以继续发布。 ### 只演练不上传 先确认打包范围、包大小和增量删除清单: ```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" ``` ### 常见问题 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. `server is tracked as a root gitlink`:脚本检测到根 Git 只记录了 `server` 指针,无法做文件级增量,会自动改为打包当前工作区默认 5 个 server 目录。 6. 仍需使用 Bash 兼容版时,可继续运行 `bash ./scripts/deploy-server.sh ...`。 ![likeshop全开源商城](https://server.likeshop.cn/uploads/gitad/fastbuildAI.png)
![likeshop全开源商城](https://server.likeshop.cn/uploads/gitad/likeshop.png)
![BuildingAI](https://server.likeshop.cn/uploads/gitad/fastbuildAI.png)

likeadmin(PHP) 通用管理后台

🚀快速开发 🛠️ 一键生成代码 ✅后台多端自适应 📱手机端 🖥️PC(电脑)端前台

⬇⬇SaaS版点击这里⬇⬇

![](/server/public/readme/likeadmin.png) ## 🚀🚀🚀docker 本地一句命令快速部署体验 ### 🐳 快速部署 安装启动 [docker](https://www.docker.com/) 之后,在终端运行以下命令即可体验。
```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 部署每次会下载最新源码。
2.安装的时候,数据默认帐号为 root,默认密码为 root。
3.docker 快速部署只适合本地部署体验,不熟悉 docker 请勿用于生产环境,可能造成数据丢失等问题。 ### 🛜 访问 访问安装程序:http://127.0.0.1:20221
PC 端管理后台:http://127.0.0.1:20221/admin/login
PC 端前台:http://127.0.0.1:20221/pc/
手机端前台:http://127.0.0.1:20221/mobile/ ## 👀 体验后台 ### 管理后台 **地址:https://php.likeadmin.cn/admin
账号:admin 密码:123456** ### 微信小程序前台
### 手机端网页前台 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)
### 📱 手机端前台界面

### 🖥️PC 端前台界面 ![](/server/public/readme/pc-1.png) ![](/server/public/readme/pc-2.png) ![](/server/public/readme/pc-3.png) ## 👨‍💻‍ 简介 我们希望能够为开源社区做出更多的贡献,推出永久免费开源的 likeadmin 通用前后端分离管理后台系统。遵循 MIT 开源许可协议,您可以免费使用,甚至允许把你基于 likeadmin 开发的软件应用开源、发布、销售。
## 🧐 进一步了解 ### 🧰 场景介绍 1.likeadmin 已经搭建好前后端分离的底层,包含程序安装、登录、登出、工作台、菜单权限控制、角色、管理员、部门管理、岗位管理、素材管理、网站设置、图库管理等基础功能,无需重复造轮子。更有开发者工具功能,一键生成代码,大大节省开发时间。
2.可视化系统程序安装界面,可自定义安装数据,开发者可快速扩展发行自己的软件产品。
3.likeadmin 定位为通用的软件系统管理后台,方便开发者快速开发软件系统,文档清晰、代码易懂、简单易用。
4.集成通用的微信支付(API3)、微信小程序公众号登录、阿里云、腾讯云短信,阿里云 OSS、腾讯云 COS、七牛云 OSS 等通用模块。 ### 🐙 后端架构方面 1.服务端使用 PHP8.0 开发,性能有突破性的提升。
2.使用最新 ThinkPHP8 框架,目前国内最流行的 PHP 框架,高性能、简单易用、文档齐全、支持 composer 快速安装组件、支持 Redis、支持 PSR 多种规范等。 ### 🐹 前端架构方面 #### 后台 1.使用最流性的前后端分离方案 typescript、vue3、vite 开发,保持了代码的简洁、一致和规范。
2.后台界面使用 element-plus UI 框架,简单精美的后台界面,丰富的组件库,方便快速开发,满足各种后台交互。 #### 手机前台 手机端 uniapp 前台,可以编译成手机 H5 网页、微信小程序、安卓 App,苹果 App 等客户端。 #### PC 端前台 PC 端前台使用 Nuxt.js,支持服务器端渲染(SSR),对 SEO 友好。 ### 🛠️  代码生成器 一键生成前后端业务代码,大大提升开发效率。