跳至主要内容

Gitea Doctor 入门指南

·阅读 6 分钟

在帮助用户升级的过程中,无论是通过 Gitea 论坛 还是 Hostea 诊所,我都意识到很少有 Gitea 管理员知道 gitea doctor 命令。因此,我决定撰写这篇博文作为入门指南。

一日一苹果,医生远离我

或者在我们的案例中,Gitea 版本 低于 1.11.5。从那时起,gitea doctor 就可用,并且旨在针对特定 Gitea 版本运行。尝试从 Gitea 1.16 运行 doctor 来验证 Gitea 1.2 实例的完整性并不是一个好主意:它会对数据库的组织方式以及许多其他细节感到困惑。历史趣闻:gitea doctor 已回溯移植到 Gitea 1.10.5Gitea 1.10.6,如果您运行此特定版本并遇到导致回溯移植的问题,它可能会有所帮助。

随着每个版本的发布,gitea doctor 都得到了改进并获得了新功能。例如,在 Gitea 1.17 中,它开始识别 孤立的 Pull Request 并能够修复它们。如果 Gitea 1.16 中存在此类问题,它并不知道。

呼叫 Doctor

在下文中,示例基于一个 Gitea 1.16.8 实例,您可以按如下方式运行它

$ docker run --name gitea -p 3000:3000 -e GITEA__security__INSTALL_LOCK=true -d gitea/gitea:1.16.8-rootless
$ docker exec gitea gitea admin user create --admin --username root --password admin1234 --email [email protected]
$ docker exec gitea mkdir /var/lib/gitea/data/log

然后,您可以转到 Web 界面 创建一个名为 test 的仓库,并包含一个初始的 README.md 文件。完成后,可以按如下方式调用 doctor

$ docker exec gitea gitea doctor --all
[1] Check paths and basic configuration
- [I] Configuration File Path: "/etc/gitea/app.ini"
- [I] Repository Root Path: "/var/lib/gitea/git/repositories"
- [I] Data Root Path: "/var/lib/gitea"
- [I] Custom File Root Path: "/var/lib/gitea/custom"
- [I] Work directory: "/var/lib/gitea"
- [I] Log Root Path: "/var/lib/gitea/data/log"
OK
[2] Check if there is garbage storage files
OK
[3] Check Database Version
OK
[4] Check consistency of database
OK
[5] Check if user with wrong type exist
OK
[6] Check if OpenSSH authorized_keys file is up-to-date
OK
[7] Check if SCRIPT_TYPE is available
- [I] ScriptType bash is on the current PATH at /bin/bash
OK
[8] Check if hook files are up-to-date and executable
OK
[9] Recalculate Stars number for all user
OK
[10] Check old archives
- [I] 0 old archives in repository need to be deleted
OK
[11] Enable push options
- [I] Checked 1 repositories, 0 need updates.
OK
[12] Check for incorrectly dumped repo_units (See #16961)
- [W] Found 0 broken repo_units
OK
[13] Recalculate merge bases
- [W] 0 PRs with incorrect mergebases of 0 PRs total in 1 repos
OK
[14] Check git-daemon-export-ok files
- [I] Checked 1 repositories, 0 need updates.

Doctor 知道什么?

尽管 doctor 可以与 fsck(8) 相比,但它并不能知道一切。fsck 花了数十年时间才成为查找文件系统问题和可靠地修复它们而不会丢失数据的最终权威。如今,世界上只有少数人敢在 fsck 无法从数据丢失中恢复时手动尝试文件系统恢复。

第一个 doctor 版本已经两年了,Gitea 管理员在尝试找出 Gitea 实例为何无法正常运行时,仍然会定期对数据库运行 SQL 查询或移动文件。但是,值得检查一下 doctor 是否已经有了解决方案,方法是列出它所能做的一切

$ docker exec gitea gitea doctor --list
Default Name Title
* paths Check paths and basic configuration
storages Check if there is garbage storage files
* check-db-version Check Database Version
check-db-consistency Check consistency of database
* check-user-type Check if user with wrong type exist
* authorized-keys Check if OpenSSH authorized_keys file is up-to-date
script-type Check if SCRIPT_TYPE is available
hooks Check if hook files are up-to-date and executable
recalculate-stars-number Recalculate Stars number for all user
check-old-archives Check old archives
enable-push-options Enable push options
fix-broken-repo-units Check for incorrectly dumped repo_units (See #16961)
recalculate-merge-bases Recalculate merge bases
check-git-daemon-export-ok Check git-daemon-export-ok files

然后调用看起来很有趣的 check

$ docker exec gitea gitea doctor --run authorized-keys
[1] Check if OpenSSH authorized_keys file is up-to-date
OK

挑战在于弄清楚哪个 check 做了什么,目前最好的信息来源是…… 源代码 本身。 doctor.go 命令是入口点,而 doctor 目录 包含其余部分。

一些 checks 很容易理解,即使您不了解 Go,例如 authorized-keys 检查。其他一些则更为复杂,您最好的选择是 向 Gitea 聊天室寻求帮助

会造成伤害吗?

默认情况下,doctor(非常类似于 fsck -N)仅执行非破坏性检查并显示诊断信息,以及问题严重程度的指示。在上面的示例中,只有带有 [I](表示信息)和 [W](表示可以忽略但可能值得调查的警告)的行。这两个警告实际上只是信息性的,应该标记为 [I]在 doctor 的更新版本中已修复

现在让我们做一些坏事:从我们仓库中的钩子中删除权限

$ docker exec gitea chmod -x /var/lib/gitea/git/repositories/root/test.git/hooks/post-receive

使用旨在查找该问题的 check 运行 doctor

$ docker exec gitea gitea doctor --run hooks
[1] Check if hook files are up-to-date and executable
- [W] old hook file /var/lib/gitea/git/repositories/root/test.git/hooks/post-receive is not executable

使用 --fix 标志要求它修复此问题

$ docker exec gitea gitea doctor --run hooks --fix
[1] Check if hook files are up-to-date and executable
- [W] Regenerated hooks for root/test
- [W] old hook file /var/lib/gitea/git/repositories/root/test.git/hooks/post-receive is not executable

最后再运行一次以检查一切正常

$ docker exec gitea gitea doctor --run hooks
[1] Check if hook files are up-to-date and executable
OK

即使 doctor 无法修复问题,它也可以通过显示扩展的调试输出提供帮助,默认情况下,该输出位于其运行的目录中的 doctor.log 文件中。或者,它可以通过 --log-file - 显示在标准输出上,这在 docker 中运行时最方便。

更进一步

如果这对您有所帮助,我将非常感谢您 在 Mastodon 上给我发送消息。这将鼓励我撰写更多博文来分享我对 Gitea 的学习成果。更好的是:您可以 发送 Pull Request 来改进 doctor 并帮助它成熟。

An icon showing wave propagation

加入我们的社区

Gitea 是开源的。为我们的 GitHub 仓库加星标,并加入我们在 Discord 上的社区!

An icon showing a paper plane

订阅我们的新闻通讯

随时了解 Gitea 的最新动态