家のトップページに「最新を適用」ボタン ― カーネルと WordPress の版を表示して、パスワード付きで更新・再起動できるようにした
家のサーバーと AWS のサーバー(どちらも AlmaLinux)について、動いているカーネルと WordPress の版、入れられる最新の版を、家のトップページに並べて表示するようにしました。それぞれの横には「最新を適用」ボタンがあり、押すとその場で更新できます。カーネルは再起動が要るので、パスワード付きで、「深夜3時に再起動」か「今すぐ再起動」を選べるようにしています。
きっかけは、家のサーバーが原因不明で何度も止まった件(家のサーバーが勝手に再起動していた件)です。調べる中で「新しいカーネルは入っているのに、再起動していないので古いまま動いている」状態に気づきました。版の違いが一目で分かり、そのまま直せる場所が欲しくなりました。
今回も、作業は AI(Claude Code)に言葉で頼んで進めました。頼んだのは「4つの版を表示して、全部の横に最新を適用ボタンを付けられる?」という一言と、パスワード・再起動の時刻の決めごとだけです。
- カーネル:OS の中心部分。新しい版を入れても、再起動するまでは古い版で動き続ける
- トップページ:家のサーバーにある自分専用のページ(家のサーバーに自分専用のトップページを作った話)。家の中と VPN からしか開けない
1. まず、自動更新の状況を点検した
ボタンを作る前に、AWS のサーバーで何が自動で更新されているかを AI に調べてもらいました。思っていたのと違う所がありました。
| 対象 | 調べた結果 | 決めたこと |
|---|---|---|
| OS(カーネルを含む) | 毎日自動で更新(dnf-automatic)。ただし再起動はしないので、カーネルは古いまま動いていた | そのまま。再起動はボタンで行う |
| WordPress 本体 | 大きい版も含めて自動で更新 | 大きい版は家で確かめてから手で。小さい修正版(セキュリティ)だけ自動 |
| WordPress のプラグイン・テーマ | 自動更新は無し | 家で入れて確かめてから本番へ |
| Uptime Kuma(監視) | 自動更新の設定は書いてあったが、それを動かすタイマーが無効で、一度も更新されていなかった | タイマーを有効に(家のサーバーも同じ状態だったので両方) |
| Roundcube(Web メール) | 手で入れたもので、OS の更新の対象外 | 新しい版が出たらメールで知らせる仕組みを追加 |
WordPress 本体は、本番だけ wp-config.php に次の1行を足しました。
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
家のブログは大きい版も自動のままにして、先に新しい版を試す役にしています。本番へのブログの同期(テスト環境と本番のブログを丸ごとそろえる)はデータベースと画像だけをコピーし、WordPress 本体のファイルや wp-config.php は上書きしません。なので、この設定は同期しても消えません。
2. トップページの「OS・WordPress の更新」欄
出来上がった欄です(左)。①〜④の4行に、稼働中の版と最新の版が並びます。版が同じなら「最新です」、違えば「更新があります」と出て、ボタンが押せるようになります。下には、ボタンを押した結果の記録が直近5件出ます。

| ボタン | 押すと起きること | パスワード |
|---|---|---|
| ① 家のサーバーのカーネル | 新しいカーネルを入れ、仮想マシンを正しく止めてから再起動 | 要る |
| ② AWS のカーネル | 新しいカーネルを入れて再起動 | 要る |
| ③ 家のブログの WordPress | WordPress を最新の版に(再起動は無し) | 要らない(確認の画面だけ) |
| ④ AWS のブログの WordPress | 同じく最新の版に。家がまだ古い版なら「先に③で確かめることをおすすめします」と出る | 要らない(確認の画面だけ) |
①②の再起動は、「深夜3時に再起動」(初めからこちらが選ばれている)か「今すぐ再起動」を選べます。3時を選ぶと欄に「11/9 03:00 に再起動の予定です」と出て、それまでは「予約を取り消す」で取り消せます。
3. しくみ:画面からは「依頼の印」を置くだけ
カーネルの更新や再起動には、管理者(root)の権限が要ります。でも、Web のページに管理者の権限を持たせるのは危険です。そこで、画面の側は「依頼の印」になる空のファイルを置くだけにし、実際の作業は管理者の権限で動く別の処理が行う形にしました。

- 受付の PHP:決まった8種類の名前(「①を今すぐ」「①を3時」「①の取り消し」など)の印のファイルを、決まったフォルダに置くだけ。それ以外の依頼は断る
- 管理者の権限の処理:systemd の「パス」の機能(フォルダにファイルが現れたら処理を起動する仕組み)で、印を見つけたらすぐ動く。印の名前ごとに決まった作業だけを行い、結果を記録する
- AWS のサーバーへ:専用のユーザーと鍵で SSH する。この鍵で通るのは決まった5つの依頼だけ(下で説明)
- 版の収集:1時間ごとと、ボタンの処理が終わったときに、4つの版を集めて欄に出す。WordPress の最新版は WordPress.org の公開の窓口(API)から取る
AWS のサーバーで通す依頼を5つに絞る
家のサーバーから AWS のサーバーへは、この用途だけの専用ユーザー(ここでは portal)を作ってつなぎます。鍵の登録(authorized_keys)でこの鍵で動かせるコマンドを1つに固定し、そのコマンドが受け付ける依頼を5つに絞りました。
# ~portal/.ssh/authorized_keys(鍵は1行。restrict で転送なども禁止)
restrict,command="/usr/local/sbin/portal-agent-wrap.sh" ssh-ed25519 AAAA... portal@home-server
# /usr/local/sbin/portal-agent-wrap.sh
case "$SSH_ORIGINAL_COMMAND" in
status|kernel-now|kernel-3am|kernel-cancel|wp-update)
exec sudo -n /usr/local/sbin/portal-agent.sh "$SSH_ORIGINAL_COMMAND" ;;
*) echo '{"ok":false}'; exit 1 ;;
esac
管理者の権限を借りる sudo の設定でも、同じ5つの引数のときだけ許可しています。万一この鍵が漏れても、できるのは「版を聞く・再起動する・取り消す・WordPress を最新にする」の5つだけです。試しにほかのコマンドを送ると、断られることも確かめました。
パスワードとほかのサイトからの悪用
- パスワード:サーバーには、パスワードそのものではなくハッシュ(元に戻せない形に変えた値)だけを置き、PHP の
password_verifyで照合する。間違えたときは2秒待たせて、総当たりをしにくくした - ほかのサイトからの悪用:ボタンからの依頼には独自の見出し(
X-Portal: 1)を付け、無い依頼は断る。ほかのサイトのページがこっそり同じ依頼を送ろうとすると、ブラウザが事前の確認で止めるので、パスワードの無い③④も勝手に押させられない
再起動のしかた
- 深夜3時:
systemd-run --on-calendar='*-*-* 03:00:00'で一時的なタイマーを作る。取り消しはそのタイマーを止めるだけ - 家のサーバー:この上で AD のサーバーなどの仮想マシンが動いているので、
virsh shutdownで正しく止めてから再起動する(最大5分待つ)。仮想マシンは自動起動の設定があるので、再起動後に自分で立ち上がる - WordPress の更新:WordPress を操作するコマンド WP-CLI(
wp core update)を使う。公式が出している照合用の値(SHA-512)で、本物のファイルか確かめてから入れた
4. 実際に押してみた
| ボタン | 結果 |
|---|---|
| ② AWS のカーネル(今すぐ) | 08:57:41 に受け付け、15秒後には新しいカーネル(687.59.1 → 687.66.1)で起動。止まったままのサービスは無し。メールのサーバーだけ、ウイルス検査の起動を待って約1分遅れて動いた |
| ③ 家の WordPress | 約14秒で 7.1.3 → 7.1.4。トップ・記事・管理画面とも正常に開き、PHP のエラーも無し |
| ④ AWS の WordPress | 約21秒で 7.1.3 → 7.1.4。本番のブログも正常 |
WordPress は更新のあと、WP-CLI の wp core verify-checksums で、ファイルが公式の正しい中身と一致することも確かめました(改変や取りこぼしが無いということ)。
試して見つかった直し所が1つありました。②で再起動した後、欄の表示が最大1時間古い版のままでした。版の収集が1時間ごとで、再起動の直前に集めた値が残っていたためです。「今すぐ再起動」のときは5分後にもう一度集めるようにしました。
5. 気をつけていること・これから
- ①(家のサーバーの再起動)はまだ試していない:今は最新なので押せない。次に新しいカーネルが出たら、深夜3時の予約で試す
- ①を押すと、このページ自体も止まる:家のサーバーが再起動するので、結果は数分後にページを開き直して見る
- WordPress は家が先:③で家を上げて、少し使ってから④で本番を上げる
- パスワードの無い③④:家の中の誰でも押せるが、再起動は無く、最新の版に上げるだけなので、このままにした
