personal-homepage/docs/linux-cron-deploy.md

126 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

# 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。