# Linux 定时部署脚本说明 适用于当前这套流程: - 静态图片可由远端 URL 拉取 - 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` | 日志生成服务写入的源目录 | | `STATIC_ASSET_MANIFEST` | `src/content/static-assets/index.json` | 静态资源下载清单 | | `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_STATIC_ASSET_SYNC` | `true` | 默认先按清单同步静态资源 | | `RUN_LOCAL_REBUILD` | `true` | 默认先在宿主机执行 `npm run rebuild` | | `LOCK_FILE` | `/tmp/personal-homepage-deploy.lock` | 防止重复执行的锁文件 | 如果你的机器目录不同,可以通过环境变量覆盖。 --- ## 2. 脚本实际执行内容 脚本默认顺序如下: 1. 检查目录与命令是否存在 2. 获取锁文件,避免重复执行 3. 按 `STATIC_ASSET_MANIFEST` 下载静态资源到目标目录 4. 把 `LOG_SOURCE_DIR` 同步到 `LOG_TARGET_DIR` 5. 进入 `SITE_DIR` 执行 `npm run rebuild` 6. 进入 `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 ``` 如果这次不想拉远端图片: ```bash RUN_STATIC_ASSET_SYNC=false ./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. 建议 当前建议: - 静态图片清单维护在 `src/content/static-assets/index.json` - `LOG_SOURCE_DIR` 作为日志服务的宿主机挂载目录 - `SITE_DIR` 直接指向 homepage 仓库根目录 - 优先先手动跑通一次: ```bash ./scripts/deploy-homepage.sh ``` 确认没问题后再挂 cron。 静态资源清单推荐写成按目录分组的格式: ```json [ { "target_dir": "public/images/projects", "files": [ { "url": "https://example.com/seafile-cover.png", "filename": "personal-homepage.png" } ] }, { "target_dir": "public/images/gallery", "files": [ { "url": "https://example.com/seafile-gallery-1.jpg", "filename": "gallery-1.jpg" } ] } ] ```