使用 Docker Compose 部署 GitLab CE
前言
在现代软件开发中,GitLab 作为一个功能完整的 DevOps 平台,为团队提供了代码管理、CI/CD、项目管理等一站式解决方案。本文将详细介绍如何使用 Docker Compose 部署 GitLab CE(社区版),并采用外部 Nginx 代理的架构设计,实现更灵活的部署方案。
架构设计
本次部署采用以下架构:
- GitLab CE: 运行在 Docker 容器中,禁用内置 Nginx
- 外部 Nginx: 作为反向代理,处理 SSL 终止
- 网络通信: Nginx 与 GitLab 之间使用 HTTP 通信
这种架构的优势:
- 统一的反向代理管理
- 更好的资源利用率
- 便于维护和扩展
环境准备
系统要求
- Docker 20.10+
- Docker Compose 2.0+
- 至少 4GB RAM(推荐 8GB+)
- 至少 20GB 磁盘空间
创建项目目录
mkdir gitlab-docker
cd gitlab-docker
mkdir config logs data
Docker Compose 配置详解
创建 docker-compose.yml
文件:
# 此配置文件禁用了 HTTPS 访问,TLS/SSL 由外部 Nginx 终止,Nginx 到 GitLab 使用 HTTP。如需启用 HTTPS,取消注释 9443 端口映射。
# 此配置文件禁用了捆绑安装 nginx,使用外部统一 nginx 代理
services:
gitlab:
image: gitlab/gitlab-ce:17.9.2-ce.0
container_name: gitlab
restart: always
hostname: 'gitlab.aluopy.cn'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.aluopy.cn'
nginx['enable'] = false
web_server['external_users'] = ['root', 'nginx', 'gitlab']
gitlab_rails['gitlab_ssh_host'] = 'gitlab.aluopy.cn'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['trusted_proxies'] = ['192.168.20.210']
gitlab_rails['max_attachment_size'] = 2048
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "0.0.0.0:9080"
# 内存优化
gitlab_rails['rack_attack_git_basic_auth'] = {
'enabled' => true,
'ip_whitelist' => ["127.0.0.1"],
'maxretry' => 10,
'findtime' => 60,
'bantime' => 3600
}
gitlab_rails['env'] = {
'GITLAB_RAILS_RACK_TIMEOUT' => 300
}
puma['worker_processes'] = 2
puma['min_threads'] = 1
puma['max_threads'] = 8
puma['per_worker_max_memory_mb'] = 1200
sidekiq['concurrency'] = 9
postgresql['shared_buffers'] = "1024MB"
postgresql['max_worker_processes'] = 8
ports:
- '9080:9080'
#- '9443:443'
- '2222:22'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
- '/etc/localtime:/etc/localtime:ro'
shm_size: '256m'
privileged: true
配置参数详解
基础配置
- hostname: 设置 GitLab 的主机名,影响内部服务通信
- external_url: 外部访问的完整 URL
- nginx[‘enable’] = false: 禁用内置 Nginx,使用外部代理
网络配置
- gitlab_workhorse: 配置为监听所有接口的 9080 端口
- trusted_proxies: 信任的代理服务器 IP,确保正确获取客户端真实 IP
- gitlab_ssh_host: SSH 访问的主机名
- gitlab_shell_ssh_port: SSH 端口映射
性能优化配置
Puma Web 服务器优化
puma['worker_processes'] = 2 # 工作进程数
puma['min_threads'] = 1 # 最小线程数
puma['max_threads'] = 8 # 最大线程数
puma['per_worker_max_memory_mb'] = 1200 # 每个工作进程最大内存
Sidekiq 后台任务优化
sidekiq['concurrency'] = 9 # 并发任务数
PostgreSQL 数据库优化
postgresql['shared_buffers'] = "1024MB" # 共享缓冲区
postgresql['max_worker_processes'] = 8 # 最大工作进程
安全配置
gitlab_rails['rack_attack_git_basic_auth'] = {
'enabled' => true,
'ip_whitelist' => ["127.0.0.1"],
'maxretry' => 10, # 最大重试次数
'findtime' => 60, # 时间窗口(秒)
'bantime' => 3600 # 封禁时间(秒)
}
外部 Nginx 配置
参考官方文档:https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/nginx
部署步骤
1. 启动 GitLab 容器
docker-compose up -d
2. 查看启动日志
docker-compose logs -f gitlab
3. 等待初始化完成
GitLab 首次启动需要 5-10 分钟进行初始化,可以通过以下命令检查状态:
docker exec -it gitlab gitlab-ctl status
4. 获取初始 root 密码
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
5. 配置并启动 Nginx
sudo systemctl reload nginx
访问和初始配置
- 访问
https://gitlab.aluopy.cn
- 使用用户名
root
和获取到的初始密码登录 - 立即修改 root 密码
- 配置管理员邮箱和其他基础设置
常用维护命令
查看服务状态
docker exec -it gitlab gitlab-ctl status
重新配置 GitLab
docker exec -it gitlab gitlab-ctl reconfigure
备份数据
docker exec -it gitlab gitlab-backup create
修复文件系统权限
docker exec -it gitlab update-permissions
查看日志
# 查看所有日志
docker-compose logs gitlab
# 查看实时日志
docker-compose logs -f gitlab
# 查看特定服务日志
docker exec -it gitlab tail -f /var/log/gitlab/gitlab-rails/production.log
性能监控
内存使用监控
docker stats gitlab
GitLab 内置监控
访问 https://gitlab.aluopy.cn/admin/system_info
查看系统信息。
故障排除
常见问题
- 容器启动失败
- 检查端口是否被占用
- 确认目录权限是否正确
- 查看容器日志排查具体错误
- 502 Bad Gateway
- 确认 GitLab 服务是否完全启动
- 检查 Nginx 配置是否正确
- 验证网络连通性
- SSH 连接问题
- 确认 2222 端口映射是否正常
- 检查防火墙设置
- 验证 SSH 密钥配置
安全建议
- 定期更新: 保持 GitLab 版本更新,及时修复安全漏洞
- 备份策略: 制定定期备份计划,确保数据安全
- 访问控制: 配置适当的用户权限和项目可见性
- SSL 配置: 使用强加密算法和最新的 TLS 协议
- 监控告警: 设置系统监控和异常告警
结语
通过本文的配置,我们成功部署了一个高性能、易维护的 GitLab CE 实例。这种架构不仅提供了良好的性能表现,还为后续的扩展和维护奠定了坚实基础。在实际使用中,可以根据具体需求调整配置参数,以获得最佳的使用体验。
记住定期备份数据,监控系统性能,确保 GitLab 服务的稳定运行。如有问题,可以查看日志文件或参考 GitLab 官方文档进行排查。