朝まだき 頁の奥で 文字めざむ
docker compose pull で最新イメージを取得し、up -d でコンテナを再構築します。手順は3ステップです。まずスクリプトライブラリに更新スクリプトを作成し(パネルまたはコマンドラインでインポート可能)、次にスケジュールタスクを作成してCron式を設定します(毎日午前3時を推奨)。最後に手動実行して検証します。よくある質問への回答も収録:コンテナに変化がなくても正常、ghcr.ioは事前ログインが必要でPATには read:packages 権限が必須、バックエンドを先に更新してからフロントエンドを更新するのが推奨、更新時のダウンタイムは数秒のみ、失敗時はログで原因を確認できます。これで、1つのスクリプトと1つのスケジュールタスクによってブログを常に最新状態に保ち、手動運用のコストを削減できます。
「Mix Space + Yohaku 導入シリーズ」の第3回です。今回は自動更新の設定を扱います。まずは前2回の導入を済ませてから、この記事を読み進めることをおすすめします。
ブログを構築し終えたところで、本当の運用はまだ始まったばかり。
フロントエンドの Yohaku はバージョンアップを重ね、バックエンドの Core は脆弱性の修正が入り、依存するイメージも次々と更新されていきます。そのたびに手動でサーバーにログインして pull し、再起動するのは手間なうえ、うっかり忘れてしまうことも。ふと気づけばブログが1か月前の古いバージョンのまま——そんな時にようやく「そろそろ更新しないと」と思い出す、というのがよくあるパターンです。
この記事では、1Panel の計画タスクを使って更新を自動化する手順を紹介します。一度設定してしまえば、サーバーがあなたのペースに合わせて最新イメージを自動で確認・取得し、ブログを常に最新の状態に保ってくれます。あなたがやるべきことは何もありません。
この記事の想定環境: · バックエンド Core とフロントエンド Yohaku をどちらも 1Panel のローカルアプリとして導入済み · フロントエンドのイメージが ghcr.io のプライベートリポジトリ(または公式の innei/shiro:latest)由来 · 最小限の手間でシステムを最新に保ちたい
基本的な考え方
1Panel の計画タスクは、カスタムスクリプトを定期的に実行できる機能です。必要なのは、次の2つのコマンドだけ。
それぞれの意味を順に見ていきましょう:
コマンド 役割 cd ... アプリがある Compose ディレクトリへ移動 docker compose pull 最新イメージを取得(再起動なし) docker compose up -d 新しいイメージでコンテナを再構築して起動
この2つのコマンドは、それぞれバックエンドとフロントエンドに対応しています。計画タスクが発火すると、1Panel が順番に実行し、バックエンドとフロントエンドをまとめて一気に更新してくれます。
ステップ1 · スクリプトライブラリを作成する
1Panel の「スクリプトライブラリ」は、よく使うスクリプトを保存しておき、計画タスクや手動で呼び出せる機能です。更新用スクリプトをここに保存しておけば、計画タスクから参照できるだけでなく、必要に応じていつでも手動で実行できます。
方法1 · 1Panel のパネルから作成(推奨)
サイドバーから 計画タスク → スクリプトライブラリ に進み、右上の 作成 をクリックします:
項目 入力内容 名称 ブログ自動更新(任意に変更可) スクリプト内容 下のコードブロックを参照
以下のスクリプトを入力します:
確認 をクリックして保存すれば、スクリプトライブラリの完成です。
方法2 · コマンドラインですばやく作成する
SSH での操作に慣れているなら、サーバー上で直接スクリプトファイルを作成する方法もあります:
その後、1Panel のスクリプトライブラリで「ファイルからインポート」を選ぶだけです。インポート時はスクリプトファイルが置かれているディレクトリ /opt/1panel/scripts/ を指定します。このパスがインストール環境と異なる場合は、サーバー上で実際の保存場所を確認してからインポートしてください。
ステップ2 · 計画タスクを作成する
スクリプトが準備できたら、実行スケジュールを設定しましょう。
サイドバーから 計画タスク → 計画タスク に進み、右上の 作成 をクリックします:
項目 入力内容 タスク名 ブログ自動更新(任意に変更可) 実行周期 カスタム Cron 式 スクリプト内容 「スクリプトライブラリ」を選択し、前のステップで作成した ブログ自動更新 を選ぶ 実行タイムアウト デフォルトのまま(10分) エラー通知 任意(有効化を推奨)
実行周期はどう決める?
筆者としては、1日1回、サーバーの負荷が最も低い早朝に実行するのがおすすめです。Cron 式で書くと次のようになります:
これは毎日午前3:00に実行することを表します。ご自身の用途に合わせて調整してください:
頻度 Cron 式 説明 1日1回 0 3 * * * 推奨。早朝の低負荷時間帯 6時間ごと 0 */6 * * * 更新が頻繁で、活発に開発が進むプロジェクト向け 週1回 0 3 * * 0 日曜日の早朝 手動実行 空欄にして「実行」ボタンで実行 自動実行せず、必要なときだけ手動更新
1Panel の計画タスク実行に関する小さな注意点
計画タスクを作成すると、1Panel はデフォルトでサーバーのタイムゾーンの該当時刻に実行します。サーバーのタイムゾーンが Asia/Shanghai でない場合は、次のコマンドで確認してみてください:
タイムゾーンが違う場合は、北京時間に変更します:
ステップ3 · 動作確認と手動実行
計画タスクを作成したら、正常に動作するか確認する方法は2つあります。
方法1 · 手動実行
計画タスクの一覧から作成したばかりのタスクを見つけ、右側の 実行 ボタンをクリックします。1Panel がすぐにスクリプトを実行するので、数秒後にページを更新して「実行記録」で出力ログを確認しましょう。
次のような出力が確認できれば成功です:
方法2 · 自動実行を待つ
毎日午前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:バックエンドだけ、またはフロントエンドだけを更新することはできますか?
できます。スクリプトから該当する部分を削除するだけです。バックエンドだけ更新したい場合は、1つ目の cd ... mxspace を残し、2つ目の cd ... yohaku を削除してください。
まとめ
スクリプト1本 + 計画タスク1つ = 自動更新される Mix Space ブログシステム
全体の流れを振り返ってみましょう:
それ以降のことは、すべて 1Panel に任せてしまいましょう。決めたペースで静かに最新イメージを取得し、コンテナを再起動して、ブログを常に最新の状態に保ってくれます。あなたが集中すべきことはただ一つ——じっくりと紡ぎたい次の記事を書き続けることです。
運用の本質は、誰も見ていないところでもシステムが整然と動き続けることにある。
参考資料
· 1Panel 計画タスクのドキュメント · Docker Compose コマンドラインリファレンス · Cron 式ジェネレーター
いつまでも新鮮でいられる秘訣は、続けること。あなたのブログが、静かな更新の中で、日々少しずつ育っていきますように 🌿