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

2.9 KiB
Raw Blame History

Linux 定时部署脚本说明

适用于当前这套流程:

  • log 由另一个服务生成
  • log 落到宿主机目录
  • 宿主机定时任务复制 log 到 homepage 仓库
  • 宿主机执行 npm run rebuild
  • 宿主机执行 docker compose up -d --build homepage

统一脚本:

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 执行:
docker compose -f "$DOCKER_COMPOSE_FILE" up -d --build "$DOCKER_SERVICE_NAME"

3. 直接执行

使用默认值:

./scripts/deploy-homepage.sh

覆盖部分变量:

LOG_SOURCE_DIR=/data/logs \
SITE_DIR=/srv/personal-homepage \
RSYNC_DELETE=true \
./scripts/deploy-homepage.sh

如果你只想做 log 同步 + Docker 重建,不想先在宿主机跑一次 npm run rebuild

RUN_LOCAL_REBUILD=false ./scripts/deploy-homepage.sh

4. 推荐的 cron 配置

例如每天 00:00 执行一次:

0 0 * * * /home/basil/source/personal-homepage/scripts/deploy-homepage.sh >> /var/log/personal-homepage-deploy.log 2>&1

例如每 30 分钟执行一次:

*/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 仓库根目录
  • 优先先手动跑通一次:
./scripts/deploy-homepage.sh

确认没问题后再挂 cron。