はじめに

Those who survive a long time on the battlefield start to think they are invincible.
I bet you do too, buddy.

「不死身のエースってのは戦場に長く居たものの過信だ」
「お前のことだよ相棒」

ゲーム『エースコンバットZERO』に登場する、ピクシーことラリー・フォルクの台詞です。筆者はこの言葉を、自分が運用しているGROWIのトップページに掲げています。

長く同じ仕事をしていると、成功体験が積み重なっていきます。幾度となくトラブルを切り抜け、障害を復旧し、時には無茶な要求にも対応してきた。

そうして経験を重ねるうちに、自分なら何とかできるという自信が生まれます。その自信は、日々の運用を支える大切なものです。

「自分は失敗しない」という過信に変わっていないか。そんな自戒を込めて、この言葉を掲げていました。

この言葉に、もう一度突きつけられました。

たった一つの失念

2026年11月5日。いつものようにGROWIのバージョンアップを実施していました。筆者が運用しているGROWIは、Gitからソースコードを取得し、ビルドして稼働させているものです。

アップデートに際しては、

  1. 変更内容を確認
  2. 必要に応じて退避する
  3. ブランチを切り替えてビルドする

何度も繰り返してきた作業です。今回、筆者は一つの手順を忘れていました。

git stash

作業ツリーに残っている変更を、一時的に退避するためのコマンドです。本来なら、作業状態を確認したうえで、必要な変更を退避してからアップデートを進めるべきでしたが失念しました。

ここまでは、筆者自身の失態です。問題は、その後でした。

復旧のつもりが

普段、こうした技術的な相談にはGeminiを利用しています。ところが今回は、いつもとは異なる相談先を使いました。

そこで案内されたのが、次のコマンドです。

sudo git reset --hard
sudo git clean -fd

説明は「変更を破棄して綺麗にする」。確かに、Gitの作業ツリーを整理するという意味では、目的に沿ったコマンドです。しかし、運用中のシステムに対しては話が変わります。

  • git reset --hard は追跡対象ファイルの未コミット変更を破棄します。
  • git clean -fd は、Gitが追跡していないファイルやディレクトリを削除します。

後者は、Gitの管理対象外にある独自の設定や追加ファイルまで巻き込む可能性があります。そして筆者は、そのコマンドを実行してしまいました。

ここで問題なのは、AIが危険なコマンドを提示したという事実だけではありません。

そのコマンドが何をするのか知っているはずの筆者が、十分に影響範囲を確認せず、実行してしまったことです。

普段なら、他人が書いた手順書にこのコマンドがあれば、まず確認するでしょう。

  • 削除対象は何か。
  • 退避は済んでいるか。
  • ロールバックできるか。

それを、自分自身の作業では怠ってしまったという過信です。

不死身ではなかったエース

その後、GROWIの起動に失敗しました。

Active: activating (auto-restart)
(Result: exit-code)

ExecStart=/bin/bash /home/www-data/growi/growi-start.sh
(code=exited, status=127)

終了コード127。起動スクリプト内で必要なコマンドが見つからない場合などに発生するエラーです。ここで、ようやく自分が置かれている状況を認識しました。

単なるアップデート作業だったはずが、稼働中のシステムを復旧する作業に変わっている。

幸い、筆者にはバックアップがありました。日頃から、設定変更やアップデートの前にはバックアップを取得する習慣があります。その習慣に助けられました。

バックアップから復元し、GROWIを再ビルド。無事、サービスを起動させることができました。

これで一件落着。 ……とは、なりませんでした。

消えた文字の個性

GROWIの画面を開いて、違和感を覚えました。フォントが違います。筆者はGROWIの表示フォントを、独自に配置した「kiloji」に変更しています。

これは2025年9月に実施したカスタマイズで、Apacheのリバースプロキシ設定を利用し、フォントファイルを直接配信する仕組みを構築したものです。

ところが、今回の復旧後には、そのフォントが適用されなくなっていました。調べてみると、

ls -lah /home/www-data/growi/packages/preset-themes/public/fonts/kiloji/

結果は、

そのようなファイルやディレクトリはありません

先ほどの git clean -fd によって削除された可能性が高い、というか原因はこれです。Git管理外に置いていた独自フォントのディレクトリが消えていました。

ここで役立ったのが、以前に書いていた技術メモでした。

フォントの配置場所、ApacheのAlias設定、カスタムCSS、動作確認方法。

当時の作業を記録していたため、何を復元すればよいのかがすぐに分かりました。フォントファイルを元の場所に戻し、表示を確認。無事、いつものGROWIが帰ってきました。

2025年9月の自分が書いた記録に、2026年11月の自分が助けられたわけです。

経験という諸刃の剣

今回の一件を振り返って、改めて考えさせられました。筆者は長年、サーバを運用してきています。

  • OSのアップデート
  • 脆弱性への対応
  • サービスの移行
  • 証明書の更新
  • 障害対応

等など。その経験があるからこそ、トラブルが発生しても落ち着いて対応できます。しかし、経験があるからこそ、慣れによって確認を省略してしまうこともあります。

  • 「いつもやっているから大丈夫」
  • 「この程度なら何とかなる」
  • 「何かあっても戻せる」

どれも、完全に間違った考えではありません。実際、今回はバックアップによって復旧できました。

しかし、復旧できることと、事故を起こしてよいことは同義ではありません。

ここを取り違えた瞬間、経験は自信から慢心へと変わってしまいます。

もう一つ、AIとの付き合い方についても考えさせられました。AIは便利です。自分では思いつかなかった解決策を提示してくれることもあります。しかし、AIが提示したコマンドを実行するのは、あくまでも自分です。相談先を変更したことも、提示されたコマンドも、今回の経緯を構成する要素ではあります。

それでも、最初の手順を失念したのは自分であり、コマンドを実行したのも自分です。そこをAIの責任に転嫁してしまえば、今回の失敗から得られるものは少なくなってしまうでしょう。

必要なのは、AIを疑うことではなく、AIの提案も含めて、自分の判断を検証することなのだと思います。

『HELLSING』でアーカードが言う

銃は私が構えよう。照準も私が定めよう
弾を弾装に入れ遊底を引き安全装置も私が外そう
だが
殺すのはおまえの殺意だ

そう、AIは判断基準に過ぎません。判断を受け入れる、決断をする。そして、その結果を受け入れ、責任を取るのは自分自身です。

生き残った理由

一方で、今回の復旧を可能にしたものも、長年の運用経験から生まれた習慣でした。

  • バックアップを取ること。
  • 変更内容を記録すること。
  • 設定ファイルの差分を残すこと。
  • 作業が終わったら、その経緯を技術メモとして残すこと。

今回、筆者は過去の自分が残したバックアップと記録によって助けられました。経験が過信を生み、経験から身についた習慣が、その過信による失敗を救った。

皮肉な話ではありますが、ここに一つの答えがあるようにも思います。

長く生き残ってきたことは、自分が不死身である証明にはなりません。

むしろ、失敗する可能性を認め、そのときに備えてきたからこそ、失敗からのリカバリーが可能になりました。

  • バックアップは、自分が失敗する可能性を認めているからこそ取るものです。
  • 作業記録も、未来の自分がすべてを覚えているとは限らないからこそ残すものです。

つまり、それらは自分の能力への過信とは正反対のところにある習慣なのです。

おわりに

無事に復旧したGROWIを開くと、そこにはいつものフォントで、いつもの警句が表示されていました。

Those who survive a long time on the battlefield start to think they are invincible.
I bet you do too, buddy.

「不死身のエースってのは戦場に長く居たものの過信だ」
「お前のことだよ相棒」

これまで何度も目にしてきた言葉です。その意味も、十分に理解していたつもりでした。

今日もまた、この言葉が自分に向けられていると感じました。

人はミスを犯す。そこに、今回のピボット旅行で飼い始めた脳内シャアがしゃしゃり出る前に、その「器」が語りかけてきました。

「過ちを気に病むことはない。
ただ認めて、次の糧にすればいい。
それが大人の特権だ。」

で、今回のお話は締めます。