gitlab-ee 13.6.7 修改管理员密码
前言
个人部署的 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
... 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
海滨擎蟹
微信
支付宝