(2025/6/8 タイトルを分かりやすくし自身が管理者であるGiteaでしか使えないことを一応追記)

皆さんは2段階認証(以下2FA)を利用しているだろうか。

今回、Giteaの自身の2FAの認証情報・リカバリーキーを紛失してしまい、意図せずロックアウトされてしまったので対処法を紹介する。

日本語情報がなかったので私と同じような状況に陥ってしまった者の役に立つことを願う。

当方の環境

  • Debian 12
  • Gitea 1.22.3
  • MariaDB(MySQL 互換)
  • 2FAにGoogle Authenticatorを利用

本記事の内容を実行すべき人

本記事は自身が管理者であるGiteaにログインできなくなった人を対象としています。 他者が運用しているGiteaサーバーで自身が2FAを紛失した場合は当然この方法は使えないので当該運営者に連絡する必要がある。

CLI上から2FAを無効化できない!!

まず、Giteaでは管理者アカウントで2FAを紛失してしまった場合、CLIのgiteaコマンド等で2FAを無効化することはできない

DBを操作する必要がある。以下に一連の手順を示す。

Giteaを停止する

まず、自身のサーバ上で稼働しているGiteaを停止する。

systemdに登録している場合以下のコマンドで停止できる。

systemctl stop gitea

バックアップを取る(重要!!)

操作を誤ってしまった時の為にバックアップを取ることをおすすめする。

まずは、Giteaをインストールしたユーザに切り替える。ここではgitとする。

su git

そしてGiteaのインストールディレクトリまで移動し、以下のコマンドを実行する。

PATHが通っている場合、インストールディレクトリまで移動しなくてもよい。./を消して実行できる。

./gitea dump -c Giteaの設定ファイルのパス

もし以下のエラーが出た場合、当該ディレクトリに書き込み権限がないということである。

2025/06/01 00:00:00 cmd/dump.go:102:fatal() [F] Unable to create dump file "/usr/local/bin/gitea-dump-0000000000.zip": open /usr/local/bin/gitea-dump-0000000000.zip: permission denied

なのでとりあえず以下のコマンドのように-fで自身のホームディレクトリと保存したいファイル名を指定すればよい。

./gitea dump -c Giteaの設定ファイルのパス -f バックアップファイルを置きたいディレクトリとファイル名のパス
例:./gitea dump -c /etc/gitea/app.ini -f /home/git/gitea-dump-for2fa-recovery.zip

なお-fで保存先を指定しなかった場合実行したディレクトリ上に配置される。

MySQLにログインする

以下のコマンドでMySQLにログインする。

なお、DBの接続情報やDB名を忘れた場合Giteaの設定ファイルに書かれているのでそれを使えばよい。

mysql -u ユーザー名 -D GiteaをインストールしたDB名 -p

このコマンドを実行した後パスワードを求められるので入力する。

IDを確認する

その後、以下のSQL文でまず自身のidを確認する。

MariaDB [gitea]> select id from user where name = '自身のユーザー名';

すると例のような出力が出るが、それがIDである。

例では1となっている。

+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

two_factorテーブルの自身のIDのレコードを削除する

以上で確認したIDを用いて以下のSQL文を実行する。

MariaDB [gitea]> delete from two_factor where id = '自分のID';

以上で2FAを無効化できた。