前言

个人部署的 gitlab 想要把一个项目共享给其他开发人员,结果管理员账号密码不记得了。登录不了,这样没有办法创建新的账号。

过程

询问 deepseek,给了多个方法,前三个指令执行都报错,最后一个连接到数据库修改之后,还是无法登录。

方法一:使用Rake任务快速重置(oh,no)

sudo gitlab-rake "gitlab:password:reset[root]"
rake aborted!
Don't know how to build task 'gitlab:password:reset' (See the list of available tasks with `rake --tasks`)
Did you mean?  gitlab:assets:vendor
/opt/gitlab/embedded/bin/bundle:23:in `load'
/opt/gitlab/embedded/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)

方法二:通过Rails控制台重置(报错,进不去)

# 以下为正常进入的修改密码流程,修复报错之后可以进入控制台
sudo gitlab-rails console
sudo gitlab-rails console -e production
# 等待控制台加载完成,你会看到类似 irb(main):001:0> 的提示符。
--------------------------------------------------------------------------------
 Ruby:         ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
 GitLab:       13.6.7-ee (db1bf74bddb) EE
 GitLab Shell: 13.13.1
 PostgreSQL:   11.10
--------------------------------------------------------------------------------
irb(main):001:0>
# 查找 root 用户
user = User.find_by_username 'root'
# 或者
user = User.find(1)
# 修改密码
user.password = '你的新密码'          # 请替换为你的强密码
user.password_confirmation = '你的新密码'  # 再次确认
user.save!              # 保存更改,返回 'true' 表示成功
# 退出
exit

方法三:使用 rails runner 重置密码(报错,进不去)

# 1. 查找管理员用户(通常 root 是管理员)
sudo gitlab-rails runner "user = User.find_by_username('root')"

# 2. 如果上一步能找到用户,执行密码重置(将 新密码 替换为你自己的强密码)
sudo gitlab-rails runner "
user = User.find_by_username('root')
user.password = '新密码'
user.password_confirmation = '新密码'
user.save!
"

终极方法:直接修改数据库(外部生成的密码哈希无效,无法登录)

# 1. 进入 GitLab 的 PostgreSQL 数据库
sudo gitlab-psql -d gitlabhq_production

# 2. 查找管理员用户的 ID(通常为 1)
SELECT id, username, email FROM users WHERE admin = true;

# 3. 更新密码(使用 bcrypt 加密,这里假设用户 id 为 1)
# 注意:下面的哈希值是 '12345678' 的 bcrypt 示例,请替换为你自己的密码哈希
UPDATE users SET encrypted_password = '$2a$10$VlT4PR8j/.jLUlwQZo3vUuF4WvL4s0JqYpQsXvY3kG8s1KzH2tLrC' WHERE id = 1;

# 4. 退出数据库
\q

解决

数据库是可以连接,但外部生成的密码哈希更新之后,登录不进去;尝试使用 runner 指令生成,结果还是报错:

sudo TMPDIR=/tmp/gitlab_tmp gitlab-rails runner "puts BCrypt::Password.create('你的新密码', cost: 10)"
Traceback (most recent call last):
        57: from bin/rails:4:in `<main>'
        56: from bin/rails:4:in `require'
...
         3: from /opt/gitlab/embedded/lib/ruby/2.7.0/tmpdir.rb:83:in `mktmpdir'
         2: from /opt/gitlab/embedded/lib/ruby/2.7.0/tmpdir.rb:115:in `create'
         1: from /opt/gitlab/embedded/lib/ruby/2.7.0/tmpdir.rb:108:in `tmpdir'
/opt/gitlab/embedded/lib/ruby/2.7.0/tmpdir.rb:32:in `tmpdir': could not find a temporary directory (ArgumentError)

兜兜转转,最终还是得先解决报错问题。把报错的所有内容贴给 deepseek,解析是 /tmp/ 临时文件夹权限问题。

/tmp 目录的权限是 777,缺少了 sticky bit(粘滞位),这可能导致 Ruby 在尝试创建临时文件时失败。

解决:

# 修复 /tmp 权限(添加 sticky bit)(粘滞位)
# 权限添加到临时创建的子目录是没有用的 /tmp/gitlab_tmp
sudo chmod 1777 /tmp
ls -ld /tmp
drwxrwxrwt 6 root root 233472 3月  15 22:46 /tmp

之后使用上面的 runner 指令生成密码哈希,然后更新数据库:

sudo gitlab-psql -d gitlabhq_production
UPDATE users SET encrypted_password = '复制的哈希值' WHERE username = 'root';
select id,username,email,encrypted_password from users; 
\q

此时想了一下,报错的问题解决了,前面的几种(除了方法一)方法应该都可以了。

PS:几种查看 gitlab 版本的方法:

# 帮助菜单 Help 点击可以看到 
GitLab Enterprise Edition 13.6.7-ee

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

cat /opt/gitlab/version-manifest.txt
...

sudo gitlab-rake gitlab:env:info
...