📦 第05章 · gitlab.rb 配置
external_url/反代/邮件/HTTPS
gitlab.rb 配置¶
这一章讲 GitLab 的核心配置文件 /etc/gitlab/gitlab.rb,重点讲"外部 nginx 反代"这种最常见的部署形态,以及怎么配域名、关掉 GitLab 自带 letsencrypt、配邮件。本机就是这么配的。
作用与"改后必 reconfigure"¶
gitlab.rb 是 Omnibus 的"声明式配置"入口。你在这里写 external_url、nginx[...]、gitlab_rails[...] 等,然后运行:
sudo gitlab-ctl reconfigure
reconfigure 才会把你的配置落到实处(生成 /var/opt/gitlab/**/gitlab.yml 等并在服务中生效)。改完 gitlab.rb 不 reconfigure 是无效的。
外部 nginx 反代的完整配置(本机实际)¶
这是最推荐的架构:外部 nginx(机外层,监听 0.0.0.0:443,负责 TLS/Let's Encrypt) → GitLab 自带 nginx(仅 127.0.0.1:8090) → GitLab 内部组件(puma/sidekiq 等)。
# ===== 访问地址 =====
external_url 'https://gitlab.bangdream.xyz'
# ===== GitLab 自带 nginx:只监听回环 + 纯 HTTP,TLS 交给外层 =====
nginx['enable'] = true
nginx['listen_address'] = ['127.0.0.1']
nginx['listen_port'] = 8090
nginx['listen_https'] = false
nginx['http2'] = false
# 让 GitLab 正确识别"前面有 https 反代"
nginx['proxy_set_headers'] = {
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on",
"X-Forwarded-For" => "$proxy_add_x_forwarded_for",
"X-Forwarded-Host" => "$http_host",
"Host" => "$http_host",
"Upgrade" => "$http_upgrade",
"Connection" => "$connection_upgrade"
}
# 不让 GitLab 自动申请 Let's Encrypt(由外层 nginx 统一签发)
letsencrypt['enable'] = false
关键 |
listen_https = false加上proxy_set_headers里把X-Forwarded-Proto设为https,GitLab 才知道自己实际是在 HTTPS 后面,否则会让用户/一些链接跑成 http,出现"登录后跳转错、或页面总提示不安全"。
外层 nginx 怎么反代 GitLab¶
外层 nginx(如 /etc/nginx/sites-available/gitlab.bangdream.xyz.conf)注意:
server {
server_name gitlab.bangdream.xyz;
client_max_body_size 0; # 允许大文件(如大仓库推送)
location / {
proxy_pass http://127.0.0.1:8090;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 300s;
}
# ssl_certificate ... 由 certbot 托管
}
注意 | GitLab 需要 WebSocket 支持(终端/SSH 等),所以外层 nginx 要配
Upgrade/Connection升级头。还要把client_max_body_size设大(或0),否则上传大仓库/附件会 413。
邮件发送(SMTP)配置¶
本机用 QQ 邮箱 SMTP 发邮件(通知/找回密码):
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "1807523025@qq.com"
gitlab_rails['smtp_password'] = "你的QQ邮箱SMTP授权码"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_ssl'] = false
gitlab_rails['gitlab_email_from'] = '1807523025@qq.com'
gitlab_rails['gitlab_email_reply_to'] = '1807523025@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
注意 | QQ 邮箱要用授权码而非登录密码(在 QQ 邮箱设置里生成)。若报"无法连接发送服务器",检查端口/加密方式是否被运营商屏蔽,或换发件服务。
常用配置项小结¶
| 配置 | 作用 |
|---|---|
external_url |
对外访问地址,决定链接里显示的域名 |
nginx['enable']/listen_* |
控制自带 nginx 是否用、监听哪、是否 TLS |
letsencrypt['enable'] |
GitLab 是否自动申请证书(反代场景通常关) |
gitlab_rails['smtp_*'] |
邮件发送 |
gitlab_rails['time_zone'] |
时区(如 'Asia/Shanghai') |
gitlab_rails['initial_root_password'] |
首次 root 密码 |
postgresql['password'] |
内嵌 PostgreSQL 密码 |
改完怎么让配置生效¶
sudo gitlab-ctl reconfigure # 应用 gitlab.rb 改动(必须)
sudo gitlab-ctl restart # 如 nece 需要重启相关组件
gitlab-ctl status # 看各组件是否 ok
常见坑¶
| 坑 | 现象 | 解决 |
|---|---|---|
| 改了没生效 | 链接/端口没变 | 忘了 reconfigure,或语法错误 |
| 登录后跳 http | 反代没设 X-Forwarded-Proto | 补 proxy_set_headers 里的 https |
| 上传大仓库 413 | nginx 客户端大小限制 | 外层 nginx client_max_body_size 0 |
| 邮件发不出去 | SMTP 参数/授权码/端口错 | 换授权码;确认 465/587 可出站 |
nginx[listen_https] 冲突 |
重复 TLS/证书冲突 | 统一只让一层终止 TLS |
相关命令¶
sudo gitlab-ctl reconfigure/status/restart/tailgrep -r "external_url" /etc/gitlab/gitlab.rb- 检查生成的配置:
sudo gitlab-ctl show-config