126 lines
2.9 KiB
Markdown
126 lines
2.9 KiB
Markdown
# Linux 定时部署脚本说明
|
||
|
||
适用于当前这套流程:
|
||
|
||
- log 由另一个服务生成
|
||
- log 落到宿主机目录
|
||
- 宿主机定时任务复制 log 到 homepage 仓库
|
||
- 宿主机执行 `npm run rebuild`
|
||
- 宿主机执行 `docker compose up -d --build homepage`
|
||
|
||
统一脚本:
|
||
|
||
```bash
|
||
scripts/deploy-homepage.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 1. 当前默认值
|
||
|
||
脚本里的默认值已经按当前主页项目直接写死:
|
||
|
||
| 变量 | 默认值 | 说明 |
|
||
|---|---|---|
|
||
| `LOG_SOURCE_DIR` | `/home/basil/bot/data/git-summary` | 日志生成服务写入的源目录 |
|
||
| `SITE_DIR` | `/home/basil/source/personal-homepage` | 个人主页仓库根目录 |
|
||
| `LOG_TARGET_DIR` | `$SITE_DIR/src/content/logs` | 复制后的日志目标目录 |
|
||
| `DOCKER_COMPOSE_FILE` | `$SITE_DIR/docker-compose.yml` | Compose 文件 |
|
||
| `DOCKER_SERVICE_NAME` | `homepage` | 要重建/重启的服务名 |
|
||
| `RSYNC_DELETE` | `false` | 同步时默认不删除旧日志 |
|
||
| `RUN_LOCAL_REBUILD` | `true` | 默认先在宿主机执行 `npm run rebuild` |
|
||
| `LOCK_FILE` | `/tmp/personal-homepage-deploy.lock` | 防止重复执行的锁文件 |
|
||
|
||
如果你的机器目录不同,可以通过环境变量覆盖。
|
||
|
||
---
|
||
|
||
## 2. 脚本实际执行内容
|
||
|
||
脚本默认顺序如下:
|
||
|
||
1. 检查目录与命令是否存在
|
||
2. 获取锁文件,避免重复执行
|
||
3. 把 `LOG_SOURCE_DIR` 同步到 `LOG_TARGET_DIR`
|
||
4. 进入 `SITE_DIR` 执行 `npm run rebuild`
|
||
5. 进入 `SITE_DIR` 执行:
|
||
|
||
```bash
|
||
docker compose -f "$DOCKER_COMPOSE_FILE" up -d --build "$DOCKER_SERVICE_NAME"
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 直接执行
|
||
|
||
使用默认值:
|
||
|
||
```bash
|
||
./scripts/deploy-homepage.sh
|
||
```
|
||
|
||
覆盖部分变量:
|
||
|
||
```bash
|
||
LOG_SOURCE_DIR=/data/logs \
|
||
SITE_DIR=/srv/personal-homepage \
|
||
RSYNC_DELETE=true \
|
||
./scripts/deploy-homepage.sh
|
||
```
|
||
|
||
如果你只想做 log 同步 + Docker 重建,不想先在宿主机跑一次 `npm run rebuild`:
|
||
|
||
```bash
|
||
RUN_LOCAL_REBUILD=false ./scripts/deploy-homepage.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 推荐的 cron 配置
|
||
|
||
例如每天 00:00 执行一次:
|
||
|
||
```cron
|
||
0 0 * * * /home/basil/source/personal-homepage/scripts/deploy-homepage.sh >> /var/log/personal-homepage-deploy.log 2>&1
|
||
```
|
||
|
||
例如每 30 分钟执行一次:
|
||
|
||
```cron
|
||
*/30 * * * * /home/basil/source/personal-homepage/scripts/deploy-homepage.sh >> /var/log/personal-homepage-deploy.log 2>&1
|
||
```
|
||
|
||
因为脚本内部已经带了 `LOCK_FILE` 锁,所以 cron 不一定还要额外再包一层 `flock`。
|
||
|
||
---
|
||
|
||
## 5. 推荐前提
|
||
|
||
宿主机应具备:
|
||
|
||
- `docker`
|
||
- `docker compose`
|
||
- `npm`
|
||
- `rsync`(推荐,有则优先使用)
|
||
- `flock`(推荐,用于避免重入)
|
||
|
||
如果没有 `rsync`,脚本会自动退回到 `cp -a`。
|
||
|
||
如果没有 `flock`,脚本也能跑,只是没有并发保护。
|
||
|
||
---
|
||
|
||
## 6. 建议
|
||
|
||
当前建议:
|
||
|
||
- `LOG_SOURCE_DIR` 作为日志服务的宿主机挂载目录
|
||
- `SITE_DIR` 直接指向 homepage 仓库根目录
|
||
- 优先先手动跑通一次:
|
||
|
||
```bash
|
||
./scripts/deploy-homepage.sh
|
||
```
|
||
|
||
确认没问题后再挂 cron。
|