3. 企业级GitLab实例初始化

单机 Omnibus 默认把 PostgreSQL、Redis、Gitaly 数据都放在 /var/opt/gitlab 下,适合验证,不适合生产。生产级初始化的核心思路是:把有状态组件外置——数据库交给外部 PostgreSQL 集群,缓存与队列交给外部 Redis(或 Redis Sentinel/Cluster),仓库与附件交给对象存储,账号体系对接企业 LDAP,通知走企业 SMTP。这样 GitLab 应用节点变成近似无状态,可水平扩展、可快速重建,备份与容灾边界也更清晰。

本节以一台 GitLab 应用节点(gitlab.example.com)为例,外部依赖如下:PostgreSQL 14 主库 10.20.1.11:5432,Redis 哨兵组 10.20.1.21:6379,对象存储使用兼容 S3 的 MinIO minio.example.com:9000,SMTP 为 smtp.example.com:587,LDAP 为 ldap.example.com:636。所有参数均为教学示例,实际以环境为准。

GitLab 应用节点与外部依赖的连接拓扑 GitLab 应用节点 gitlab.example.com gitlab.rb 统一配置 gitlab-ctl reconfigure Puma / Sidekiq / Gitaly 外部 PostgreSQL 10.20.1.11:5432 gitlabhq_production 外部 Redis 10.20.1.21:6379 cache / queues / shared 对象存储 (S3/MinIO) minio.example.com:9000 artifacts / uploads / lfs SMTP 邮件服务 smtp.example.com:587 STARTTLS 认证 企业 LDAP ldap.example.com:636 uid / cn 用户目录 SQL 5432 Redis 6379 HTTPS 9000 SMTP 587 LDAPS 636

一、外部 PostgreSQL:先建库建角色,再改连接参数

GitLab 不会自动创建外部数据库,需要先在 PostgreSQL 上准备。以 gitlab 用户和 gitlabhq_production 库为例:

CREATE ROLE gitlab WITH LOGIN PASSWORD 'Str0ng_Pg_Pass';
CREATE DATABASE gitlabhq_production OWNER gitlab;
\c gitlabhq_production
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS btree_gist;

然后在 /etc/gitlab/gitlab.rb 中关闭内置库并指向外部实例:

postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'unicode'
gitlab_rails['db_host'] = '10.20.1.11'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_database'] = 'gitlabhq_production'
gitlab_rails['db_username'] = 'gitlab'
gitlab_rails['db_password'] = 'Str0ng_Pg_Pass'

执行 gitlab-ctl reconfigure 后,用 gitlab-rake db:migrate 初始化表结构。判断成功的依据是命令无报错退出,且 gitlab-rake db:version 能输出当前迁移版本号;若报 PG::ConnectionBad,优先检查 pg_hba.conf 是否允许应用节点网段、密码是否含特殊字符未转义。

二、外部 Redis:区分 cache、queues、shared_state

GitLab 使用三个逻辑 Redis 实例:cache 存页面与权限缓存,queues 承载 Sidekiq 任务,shared_state 保存分布式锁与限流。生产建议至少把 queues 与 cache 分离,避免缓存淘汰影响任务投递。配置示例:

redis['enable'] = false
gitlab_rails['redis_cache_instance'] = 'redis://:Pass@10.20.1.21:6379/0'
gitlab_rails['redis_queues_instance'] = 'redis://:Pass@10.20.1.21:6379/1'
gitlab_rails['redis_shared_state_instance'] = 'redis://:Pass@10.20.1.21:6379/2'

验证方式:gitlab-rake gitlab:redis:info 应能列出三个实例并显示 PING 成功;在 Redis 侧用 redis-cli -n 1 keys 'resque:*' 可看到 Sidekiq 队列键。

三、对象存储:把 artifacts、uploads、LFS 外置

对象存储能显著降低本地磁盘压力,也让备份只需处理数据库与配置。以 MinIO 为例,先创建 bucket:gitlab-artifacts、gitlab-uploads、gitlab-lfs、gitlab-packages。配置片段:

gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
  'provider' => 'AWS',
  'aws_access_key_id' => 'minio_access',
  'aws_secret_access_key' => 'minio_secret',
  'region' => 'us-east-1',
  'endpoint' => 'https://minio.example.com:9000',
  'path_style' => true
}
gitlab_rails['artifacts_object_store_enabled'] = true
gitlab_rails['artifacts_object_store_bucket'] = 'gitlab-artifacts'
gitlab_rails['uploads_object_store_enabled'] = true
gitlab_rails['uploads_object_store_bucket'] = 'gitlab-uploads'
gitlab_rails['lfs_object_store_enabled'] = true
gitlab_rails['lfs_object_store_bucket'] = 'gitlab-lfs'

注意 path_style => true 是 MinIO 等自建 S3 的关键,否则会走虚拟主机风格域名而解析失败。验证:上传一个测试附件后,在 MinIO 控制台对应 bucket 中应出现新对象;若 GitLab 报 Aws::S3::Errors::AccessDenied,检查密钥权限与 bucket 策略。

四、SMTP 与 LDAP:打通通知与统一身份

SMTP 决定密码重置、流水线失败等通知能否送达:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.example.com'
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = 'gitlab@example.com'
gitlab_rails['smtp_password'] = 'Mail_Pass'
gitlab_rails['smtp_authentication'] = 'login'
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'

LDAP 让员工用域账号登录,避免本地账号泛滥:

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => '企业LDAP',
    'host' => 'ldap.example.com',
    'port' => 636,
    'uid' => 'uid',
    'encryption' => 'simple_tls',
    'base' => 'ou=People,dc=example,dc=com',
    'bind_dn' => 'cn=gitlab,ou=Service,dc=example,dc=com',
    'password' => 'Ldap_Bind_Pass'
  }
}

验证命令:gitlab-rake gitlab:ldap:check 会输出连接结果与样例用户;gitlab-rake gitlab:check 汇总各组件状态。邮件可用 gitlab-rails console 中 Notify.test_email('a@example.com','test','body').deliver_now 实测。

所有密码建议放入 gitlab-secrets.json 之外的加密渠道或环境变量注入,避免明文散落在 gitlab.rb 中;reconfigure 前先 gitlab-ctl show-config 预览合并结果。
外部 PostgreSQL 与 Redis 的网络延迟直接影响 GitLab 响应,建议与应用节点同可用区、内网互通;对象存储需保证带宽,否则 clone 大仓库会明显变慢。

完成以上五类外置配置并逐项验证后,GitLab 应用节点即具备生产级基础环境:状态集中在数据库、Redis 与对象存储,节点本身可替换、可扩容,为后续高可用与 CI/CD 扩展打下基础。