Gitea Doctor 入门指南
在帮助用户升级的过程中,无论是通过 Gitea 论坛 还是 Hostea 诊所,我都意识到很少有 Gitea 管理员知道 gitea doctor
命令。因此,我决定撰写这篇博文作为入门指南。
一日一苹果,医生远离我
或者在我们的案例中,Gitea 版本 低于 1.11.5。从那时起,gitea doctor
就可用,并且旨在针对特定 Gitea 版本运行。尝试从 Gitea 1.16 运行 doctor 来验证 Gitea 1.2 实例的完整性并不是一个好主意:它会对数据库的组织方式以及许多其他细节感到困惑。历史趣闻:gitea doctor
已回溯移植到 Gitea 1.10.5 和 Gitea 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 并帮助它成熟。