Giteaコンテナ再構築でユーザー情報が消えた?!絶望からの手動復旧ガイド

📝 概要

Giteaコンテナの再構築作業中に発生した深刻なデータ消失事例について、その経緯と解決方法を詳しく解説します。

事の発端は、Traefikへの移行作業でした。

docker-compose.ymlファイルを修正した後、何気なく実行した docker compose up -d --force-recreate というコマンドが、予期せぬ悲劇の引き金となりました。

🔍 問題の発生と現象

突如としてgit pushが失敗し始め、さらに深刻なことに、ユーザーアカウントへのログインが不可能となりました。

長年積み重ねてきたIssueやPull Request、そしてそこでの貴重なディスカッションの記録が姿を消してしまいました。

🔎 初期調査の結果

当初の調査では、環境設定に問題は見当たりませんでした。

ボリュームのパスは正しく設定され、パーミッションも適切で、外部データベースも使用していませんでした。

さらに、Giteaのバージョンダウングレードや、重要な設定パラメータであるSECRET_KEYの変更も行っていなかったため、状況はより一層ミステリアスなものとなりました。

💡 問題の真相

詳細な分析により、この問題の真相が明らかになりました。

最大の要因は、docker-compose.ymlでイメージを「gitea/gitea:latest」と指定していたことでした。

この設定により、新しいバージョンのGiteaが自動的にpullされ、意図しないメジャーバージョンアップが発生したのです。

さらに、--force-recreateフラグの使用により、既存のコンテナが強制的に破棄され、新しいバージョンでの再作成が強制されました。

新バージョンのGiteaは起動時に自動マイグレーションを試みましたが、DBロックやI/Oエラーなどの些細な問題により失敗。

その結果、既存のデータベースを「互換性なし」と判断し、新しい空のデータベースを作成してしまいました。

🛠️ 復旧手順の詳細

この状況からの復旧には、段階的なアプローチが必要です。

まず、以前と同じユーザー名で新規登録を行います。

  1. 管理者アカウントでログインし、右上のアバターから [サイト管理] をクリック。
  2. 左のメニューから [リポジトリ] を選択。
  3. ページの上部にある [未採用リポジトリの検索] ボタンをクリックします。

これにより、サーバー上に残っているリポジトリの一覧が表示されます。

各リポジトリの横にある [採用] ボタンをクリックし、所有者として先ほど作成したユーザーを選択します。

この作業を繰り返すことで、リポジトリを元の所有者に戻すことができます。

⚠️ 注意:この方法ではIssueやPRなどのメタデータは復旧できないことに注意が必要です。

🎓 得られた教訓

この経験から得られた重要な教訓は、本番環境では決して:latestタグを使用せず、具体的なバージョン(例:gitea/gitea:1.22.2)を指定すること、--force-recreateの使用は慎重に判断すること、そして何より、重要な操作の前には必ずバックアップを取得することです。

今回はgiteaのボリュームを永続化にしてたため、リポジトリが残っていたのが救いでした。