Note这是「Mix Space + Yohaku 部署系列」的第三篇,专注于自动更新的配置。建议先完成前两篇的部署,再继续阅读本文。博客搭建完成之后,真正的运维工作才刚刚开始。前端 Yohaku 会迭代,后端 Core 会修复漏洞,依赖的镜像也会不断更新。如果每次都手动登录服务器拉取、重启,不仅繁琐,还容易忘记——等某天发现博客还跑在一个月前的旧版本上,才会想起该更新了。这篇文章会带你用 1Panel 的计划任务,把更新这件事变成自动化流程。设定好之后,服务器会按你的节奏自动检查并拉取最新镜像,让博客系统始终保持新鲜,而你什么也不需要做。Note本文适用场景: · 后端 Core 和前端 Yohaku 均已通过 1Panel 本地应用部署 · 前端镜像来自 ghcr.io 私有仓库(或官方 innei/shiro:latest) · 希望以最小人力成本保持系统最新核心思路1Panel 的计划任务功能支持定期执行自定义脚本。我们只需要写两条命令:BASHcd /opt/1panel/apps/local/mxspace/mxspace && docker compose pull && docker compose up -d cd /opt/1panel/apps/local/yohaku/yohaku && docker compose pull && docker compose up -d逐条拆解一下:命令片段 作用 cd ... 切换到应用所在的 Compose 目录 docker compose pull 拉取最新镜像(不重启) docker compose up -d 基于新镜像重建并启动容器两条命令分别对应后端和前端。当计划任务触发时,1Panel 会依次执行,前后端一起更新,一气呵成。第一步 · 创建脚本库1Panel 的「脚本库」功能可以保存常用的脚本片段,供计划任务或手动调用。我们把更新脚本存进去,后续既可以在计划任务中引用,也可以随时手动执行。方式一 · 通过 1Panel 面板创建(推荐)侧边栏进入 计划任务 → 脚本库,点击右上角 创建:字段 填写内容 名称 自动更新博客(可自定义) 脚本内容 见下方代码块填入以下脚本:BASH#!/bin/bash echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始更新 Mix Space 后端..." cd /opt/1panel/apps/local/mxspace/mxspace if docker compose pull && docker compose up -d; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 后端更新成功" else echo "$(date '+%Y-%m-%d %H:%M:%S') - 后端更新失败,请检查日志" exit 1 fi echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始更新 Yohaku 前端..." cd /opt/1panel/apps/local/yohaku/yohaku if docker compose pull && docker compose up -d; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 前端更新成功" else echo "$(date '+%Y-%m-%d %H:%M:%S') - 前端更新失败,请检查日志" exit 1 fi echo "$(date '+%Y-%m-%d %H:%M:%S') - 全部更新完成 🎉"点击 确认 保存。脚本库就创建好了。方式二 · 使用命令行快速写入如果你习惯 SSH 操作,也可以直接在服务器上创建脚本文件:BASHsudo tee /opt/1panel/scripts/自动更新博客.sh > /dev/null << 'EOF' #!/bin/bash echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始更新 Mix Space 后端..." cd /opt/1panel/apps/local/mxspace/mxspace if docker compose pull && docker compose up -d; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 后端更新成功" else echo "$(date '+%Y-%m-%d %H:%M:%S') - 后端更新失败,请检查日志" exit 1 fi echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始更新 Yohaku 前端..." cd /opt/1panel/apps/local/yohaku/yohaku if docker compose pull && docker compose up -d; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 前端更新成功" else echo "$(date '+%Y-%m-%d %H:%M:%S') - 前端更新失败,请检查日志" exit 1 fi echo "$(date '+%Y-%m-%d %H:%M:%S') - 全部更新完成 🎉" EOF chmod +x /opt/1panel/scripts/自动更新博客.sh然后在 1Panel 脚本库中,选择「从文件导入」即可。导入时需导航到脚本文件所在目录 /opt/1panel/scripts/,如果路径与你的安装环境不一致,可在服务器上查看实际存放位置后再导入。第二步 · 创建计划任务脚本就位后,我们来设定执行计划。侧边栏进入 计划任务 → 计划任务,点击右上角 创建:字段 填写内容 任务名称 自动更新博客(可自定义) 执行周期 自定义 Cron 表达式 脚本内容 选择「脚本库」,选中上一步创建的 自动更新博客 执行超时 保持默认(10 分钟) 出错时通知 可选,建议开启执行周期怎么定?作者的建议是每天一次,在凌晨服务器负载最低的时候执行。用 Cron 表达式写就是:CRON0 3 * * *这表示每天凌晨 3:00 执行。你可以根据自己的需求调整:频率 Cron 表达式 说明 每天一次 0 3 * * * 推荐,凌晨低峰期 每 6 小时 0 */6 * * * 更新更频繁,适合活跃迭代的项目 每周一次 0 3 * * 0 每周日凌晨 手动触发 留空,后续点「执行」按钮 不自动执行,仅在需要时手动更新1Panel 执行计划任务的一个小细节计划任务创建后,1Panel 默认会在服务器时区的对应时间执行。如果服务器时区不是 Asia/Shanghai,可以检查一下:BASHtimedatectl如果时区不对,改成北京时间:BASHsudo timedatectl set-timezone Asia/Shanghai第三步 · 验证与手动执行计划任务创建完成后,有两种方式验证是否正常工作。方式一 · 手动执行在计划任务列表中,找到刚创建的任务,点击右侧的 执行 按钮。1Panel 会立即运行脚本,几秒后刷新页面,在「执行记录」中查看输出日志。如果看到类似这样的输出,就说明成功了:LOG2026-08-06 15:30:01 - 开始更新 Mix Space 后端... 2026-08-06 15:30:05 - 后端更新成功 2026-08-06 15:30:05 - 开始更新 Yohaku 前端... 2026-08-06 15:30:08 - 前端更新成功 2026-08-06 15:30:08 - 全部更新完成 🎉方式二 · 等待自动触发如果你设定的是每天凌晨 3 点,那第二天早上起来看一眼执行记录就好。如果脚本执行失败,1Panel 会记录错误日志,你可以在执行记录中查看具体原因。 常见问题Q:更新后容器没变,是脚本没生效吗?不一定。docker compose pull 会检查镜像是否有新版本,如果没有更新,up -d 不会重建容器,状态会显示为 up-to-date。这是正常行为,不必担心。Q:使用 ghcr.io 私有镜像时拉取失败?计划任务执行时使用的是服务器的 Docker 环境,需要确保已经通过 docker login ghcr.io 登录过。1Panel 的容器仓库认证与 Docker 登录是独立的,建议在服务器上手动执行一次:BASHdocker login ghcr.io -u 你的GitHub用户名 -p 你的PAT注意:用于拉取 ghcr.io 镜像的 Personal Access Token(PAT)需要授予 read:packages 权限,否则登录后会报 unauthorized。可到 GitHub 个人设置 → Developer settings → Personal access tokens 中创建或修改。Q:后端和前端更新有依赖顺序吗?后端更新通常不会破坏前端的兼容性,但为了稳妥,先更新后端、再更新前端是更稳健的顺序。脚本里已经按这个顺序写了。Q:更新过程中博客会不可用吗?docker compose up -d 会重建容器并启动容器,期间停机时间极短(几秒到十几秒)。如果你的博客访问量很大,可以考虑在凌晨低峰期执行。Q:脚本执行失败了怎么排查?在 1Panel 计划任务的执行记录中查看完整日志登录服务器手动运行脚本,观察具体报错检查 /opt/1panel/apps/local/mxspace/mxspace 和 /opt/1panel/apps/local/yohaku/yohaku 目录是否存在 docker-compose.yml 文件检查 Docker 服务是否正常运行:docker psQ:可以只更新后端或只更新前端吗?可以。从脚本中删除对应的那一段即可。如果只想更新后端,保留第一段 cd ... mxspace,删掉第二段 cd ... yohaku。小结一条脚本 + 一个计划任务 = 自动更新的 Mix Space 博客系统。回顾一下整个流程:创建脚本库:把更新命令保存为可复用的脚本创建计划任务:设定执行周期,关联脚本库验证执行:手动触发一次,确认日志正常之后的一切,都交给 1Panel 去打理。它会按你的节奏,安静地在后台拉取最新镜像、重启容器,让博客始终保持最新。而你只需要专注于一件事——继续写下一篇值得被细细展开的文字。运维的本质,是让系统在无人注视时依然秩序井然。参考资料· 1Panel 计划任务文档 · Docker Compose 命令行参考 · Cron 表达式生成器历久弥新,贵在坚持。 愿你的博客,在无声的更新中,日复一日地生长 🌿
这是「Mix Space + Yohaku 部署系列」的第三篇,专注于自动更新的配置。建议先完成前两篇的部署,再继续阅读本文。
博客搭建完成之后,真正的运维工作才刚刚开始。
前端 Yohaku 会迭代,后端 Core 会修复漏洞,依赖的镜像也会不断更新。如果每次都手动登录服务器拉取、重启,不仅繁琐,还容易忘记——等某天发现博客还跑在一个月前的旧版本上,才会想起该更新了。
这篇文章会带你用 1Panel 的计划任务,把更新这件事变成自动化流程。设定好之后,服务器会按你的节奏自动检查并拉取最新镜像,让博客系统始终保持新鲜,而你什么也不需要做。
本文适用场景: · 后端 Core 和前端 Yohaku 均已通过 1Panel 本地应用部署 · 前端镜像来自 ghcr.io 私有仓库(或官方 innei/shiro:latest) · 希望以最小人力成本保持系统最新
核心思路
1Panel 的计划任务功能支持定期执行自定义脚本。我们只需要写两条命令:
逐条拆解一下:
命令片段 作用 cd ... 切换到应用所在的 Compose 目录 docker compose pull 拉取最新镜像(不重启) docker compose up -d 基于新镜像重建并启动容器
两条命令分别对应后端和前端。当计划任务触发时,1Panel 会依次执行,前后端一起更新,一气呵成。
第一步 · 创建脚本库
1Panel 的「脚本库」功能可以保存常用的脚本片段,供计划任务或手动调用。我们把更新脚本存进去,后续既可以在计划任务中引用,也可以随时手动执行。
方式一 · 通过 1Panel 面板创建(推荐)
侧边栏进入 计划任务 → 脚本库,点击右上角 创建:
字段 填写内容 名称 自动更新博客(可自定义) 脚本内容 见下方代码块
填入以下脚本:
点击 确认 保存。脚本库就创建好了。
方式二 · 使用命令行快速写入
如果你习惯 SSH 操作,也可以直接在服务器上创建脚本文件:
然后在 1Panel 脚本库中,选择「从文件导入」即可。导入时需导航到脚本文件所在目录 /opt/1panel/scripts/,如果路径与你的安装环境不一致,可在服务器上查看实际存放位置后再导入。
第二步 · 创建计划任务
脚本就位后,我们来设定执行计划。
侧边栏进入 计划任务 → 计划任务,点击右上角 创建:
字段 填写内容 任务名称 自动更新博客(可自定义) 执行周期 自定义 Cron 表达式 脚本内容 选择「脚本库」,选中上一步创建的 自动更新博客 执行超时 保持默认(10 分钟) 出错时通知 可选,建议开启
执行周期怎么定?
作者的建议是每天一次,在凌晨服务器负载最低的时候执行。用 Cron 表达式写就是:
这表示每天凌晨 3:00 执行。你可以根据自己的需求调整:
频率 Cron 表达式 说明 每天一次 0 3 * * * 推荐,凌晨低峰期 每 6 小时 0 */6 * * * 更新更频繁,适合活跃迭代的项目 每周一次 0 3 * * 0 每周日凌晨 手动触发 留空,后续点「执行」按钮 不自动执行,仅在需要时手动更新
1Panel 执行计划任务的一个小细节
计划任务创建后,1Panel 默认会在服务器时区的对应时间执行。如果服务器时区不是 Asia/Shanghai,可以检查一下:
如果时区不对,改成北京时间:
第三步 · 验证与手动执行
计划任务创建完成后,有两种方式验证是否正常工作。
方式一 · 手动执行
在计划任务列表中,找到刚创建的任务,点击右侧的 执行 按钮。1Panel 会立即运行脚本,几秒后刷新页面,在「执行记录」中查看输出日志。
如果看到类似这样的输出,就说明成功了:
方式二 · 等待自动触发
如果你设定的是每天凌晨 3 点,那第二天早上起来看一眼执行记录就好。如果脚本执行失败,1Panel 会记录错误日志,你可以在执行记录中查看具体原因。
常见问题
Q:更新后容器没变,是脚本没生效吗?
不一定。docker compose pull 会检查镜像是否有新版本,如果没有更新,up -d 不会重建容器,状态会显示为 up-to-date。这是正常行为,不必担心。
Q:使用 ghcr.io 私有镜像时拉取失败?
计划任务执行时使用的是服务器的 Docker 环境,需要确保已经通过 docker login ghcr.io 登录过。1Panel 的容器仓库认证与 Docker 登录是独立的,建议在服务器上手动执行一次:
注意:用于拉取 ghcr.io 镜像的 Personal Access Token(PAT)需要授予 read:packages 权限,否则登录后会报 unauthorized。可到 GitHub 个人设置 → Developer settings → Personal access tokens 中创建或修改。
Q:后端和前端更新有依赖顺序吗?
后端更新通常不会破坏前端的兼容性,但为了稳妥,先更新后端、再更新前端是更稳健的顺序。脚本里已经按这个顺序写了。
Q:更新过程中博客会不可用吗?
docker compose up -d 会重建容器并启动容器,期间停机时间极短(几秒到十几秒)。如果你的博客访问量很大,可以考虑在凌晨低峰期执行。
Q:脚本执行失败了怎么排查?
Q:可以只更新后端或只更新前端吗?
可以。从脚本中删除对应的那一段即可。如果只想更新后端,保留第一段 cd ... mxspace,删掉第二段 cd ... yohaku。
小结
一条脚本 + 一个计划任务 = 自动更新的 Mix Space 博客系统。
回顾一下整个流程:
之后的一切,都交给 1Panel 去打理。它会按你的节奏,安静地在后台拉取最新镜像、重启容器,让博客始终保持最新。而你只需要专注于一件事——继续写下一篇值得被细细展开的文字。
运维的本质,是让系统在无人注视时依然秩序井然。
参考资料
· 1Panel 计划任务文档 · Docker Compose 命令行参考 · Cron 表达式生成器
历久弥新,贵在坚持。 愿你的博客,在无声的更新中,日复一日地生长 🌿