问题现象
在 GitLab 中将一个**公有(Public)项目改为私有(Private)**时,点击保存后失败,页面无明确错误提示。

查找日志
方法一:查看 production.log
# 查看 GitLab Rails 生产日志
tail -f /var/log/gitlab/gitlab-rails/production.log
在执行"改为私有"操作的同时观察日志,会发现关键报错:
OpenSSL::Cipher::CipherError ()
方法二:使用 gitlab-ctl tail(官方推荐)
gitlab-ctl tail gitlab-rails
原因
GitLab 在修改项目可见性时,会尝试对某些敏感字段(如 runner token)进行加密/解密操作。如果加密密钥或 token 数据异常,就会抛出 OpenSSL::Cipher::CipherError。
解决方法
进入 GitLab 数据库控制台
gitlab-rails dbconsole
清空 runner token 相关字段
-- 清空项目的 runner token
UPDATE projects SET runners_token = null, runners_token_encrypted = null;
-- 清空命名空间的 runner token
UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
-- 清空应用设置的注册 token
UPDATE application_settings SET runners_registration_token_encrypted = null;
-- 清空 CI runner 的 token
UPDATE ci_runners SET token = null, token_encrypted = null;
执行后输出示例:
UPDATE 16 -- 更新了 16 个项目
UPDATE 33 -- 更新了 33 个命名空间
UPDATE 1 -- 更新了 1 条应用设置
UPDATE 0 -- 没有 CI runner(可选)

验证
执行完上述 SQL 后,不需要重启服务,立即生效。回到 GitLab Web 界面,再次点击"保存"即可成功将项目改为私有。
参考链接
- GitLab Issue #66002
- GitLab Issue #59413
- GitLab Backup/Restore — When the secrets file is lost
- 删除项目参考
注意事项
| 注意点 | 说明 |
|---|---|
| 清空 token 的影响 | 清空后 CI runner 需要重新注册,项目 runner token 会失效 |
| 不需要重启 | SQL 执行后立即生效,无需重启 GitLab 服务 |
| 先备份数据库 | 生产环境操作前建议先备份 gitlab-rake gitlab:backup:create |
| 日志定位 | 遇到类似问题优先查看 production.log 或 gitlab-ctl tail gitlab-rails |
Professional English Terms
| Term | Meaning |
|---|---|
| OpenSSL::Cipher::CipherError | OpenSSL 加密/解密错误,通常由密钥或数据异常引起 |
| Runner Token | GitLab Runner 用于注册和认证的令牌 |
| gitlab-rails dbconsole | GitLab Rails 数据库控制台,可直接执行 SQL |
| Project Visibility | 项目可见性(Public / Internal / Private) |