自建 GitLab CE:把代码仓库搬到自己的服务器
自建 GitLab CE:把代码仓库搬到自己的服务器
用 GitHub 存代码很方便,但有些情况会让人想自建:公司代码不想放公有云、私有仓库数量有限、想自己掌控 CI/CD 流程。GitLab Community Edition 是完整的开源 DevOps 平台,代码托管、Issue 管理、CI/CD Pipeline、Container Registry 全部打包,功能不比 GitHub 少多少。
缺点也很明显:资源消耗大,至少要 4GB 内存才跑得比较顺畅。
服务器配置
GitLab 是我见过的最吃内存的 Web 应用之一:
| 用途 | CPU | 内存 | 硬盘 |
|---|---|---|---|
| 1–5 人小团队 | 2 核 | 4G | 50GB |
| 5–20 人团队 | 4 核 | 8G | 100GB |
我在雨云用 4 核 8G 的机器跑 GitLab,几个人的开发团队日常使用没问题。雨云按月付费,价格比同配置的大厂便宜不少。新用户注册填优惠码2026off能领 5 折优惠券。
用 Docker 部署 GitLab
Docker 方式比直接装包更容易升级和迁移:
mkdir-p/opt/gitlabcat>/opt/gitlab/docker-compose.yml<<'EOF' version: "3.8" services: gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab hostname: git.你的域名.com environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://git.你的域名.com' gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 禁用 Prometheus 等监控组件以节省内存 prometheus_monitoring['enable'] = false grafana['enable'] = false alertmanager['enable'] = false node_exporter['enable'] = false redis_exporter['enable'] = false postgres_exporter['enable'] = false # 调小 Puma worker 数 puma['worker_processes'] = 2 # SMTP 邮件 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "你的邮箱@qq.com" gitlab_rails['smtp_password'] = "邮箱授权码" gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['gitlab_email_from'] = '你的邮箱@qq.com' ports: - "80:80" - "443:443" - "2222:22" volumes: - ./gitlab_config:/etc/gitlab - ./gitlab_logs:/var/log/gitlab - ./gitlab_data:/var/opt/gitlab shm_size: '256m' restart: unless-stopped EOFdockercompose up-d第一次启动需要 3–5 分钟,GitLab 要初始化数据库和配置。
# 查看启动状态dockerlogs-fgitlab# 等待出现 "gitlab Reconfigured!" 表示启动完成获取初始 root 密码
dockerexecgitlabgrep'Password:'/etc/gitlab/initial_root_password这个文件在 24 小时后会自动删除,记得及时改密码。
配置 HTTPS
上面的配置里external_url已经配置了https://,GitLab 内置 Let’s Encrypt 自动申请证书。
确保 DNS 解析正确指向服务器,并在云控制台放行TCP 80和TCP 443(GitLab 需要 80 来验证域名)。
如果你想用已有证书(比如通配符证书),可以在GITLAB_OMNIBUS_CONFIG里指定:
nginx['ssl_certificate'] = "/etc/gitlab/ssl/cert.pem" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/key.pem" letsencrypt['enable'] = falseSSH 推送代码
GitLab 的 SSH 端口映射到了主机的2222,需要在本地~/.ssh/config里配置:
cat>>~/.ssh/config<<'EOF' Host git.你的域名.com Port 2222 IdentityFile ~/.ssh/id_ed25519 EOF在 GitLab 个人设置 → SSH Keys 里添加公钥后就可以 push/pull 了。
启用 GitLab CI/CD
GitLab CI/CD 需要安装 Runner 来执行 Pipeline。在同一台服务器上安装 Runner:
# 安装 gitlab-runnercurl-Lhttps://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh|sudobashsudoaptinstall-ygitlab-runner# 注册 Runnersudogitlab-runner register\--url"https://git.你的域名.com"\--registration-token"从 GitLab 项目设置里找到的 token"\--executor"docker"\--docker-image"alpine:latest"\--description"my-runner"注册完成后,在.gitlab-ci.yml里定义 Pipeline,提交代码就会自动触发 CI。
常用管理操作
# 重新配置(修改配置后运行)dockerexecgitlab gitlab-ctl reconfigure# 重启服务dockerexecgitlab gitlab-ctl restart# 备份dockerexecgitlab gitlab-backup create# 查看备份文件ls/opt/gitlab/gitlab_data/backups/备份策略
GitLab 备份会打包代码仓库、数据库、Wiki、附件等:
# 手动备份dockerexecgitlab gitlab-backup create# 加入 cron 自动备份(每天凌晨 2 点)echo"0 2 * * * docker exec gitlab gitlab-backup create"|crontab-备份文件存在/opt/gitlab/gitlab_data/backups/,记得同步到其他位置。
内存优化
如果内存吃得太狠,可以进一步调整:
# 在 GITLAB_OMNIBUS_CONFIG 里添加 puma['worker_processes'] = 1 # 最小 worker 数 sidekiq['concurrency'] = 5 # 减少 Sidekiq 并发 gitlab_workhorse['workhorse_keywatcher'] = false调整后重新配置:docker exec gitlab gitlab-ctl reconfigure
GitLab CE 自建的主要优势是完全掌控:代码在自己机器上,CI/CD 免费无限制,可以按需扩展 Runner。对于看重数据主权或者 CI 用量大的团队来说,一次部署的成本回本很快。
