1. 项目概述
在RockyLinux 8系统上通过Docker部署GitLab并实现数据备份恢复,是当前企业级代码托管和CI/CD实践的典型方案。作为RHEL兼容发行版,RockyLinux 8提供了稳定的基础环境,而Docker容器化部署则大幅简化了GitLab的安装和维护流程。本文将详细记录从环境准备到日常运维的全套操作流程,特别针对数据安全这个企业最关心的核心需求,给出完整的备份恢复方案。
我曾在三个不同规模的企业环境中实施过这套方案,最大的实例管理着超过500个活跃代码仓库。相比传统安装方式,Docker部署的优势主要体现在三个方面:一是依赖隔离彻底,不会污染主机环境;二是版本升级可控,能精确回滚到任意版本;三是资源利用率高,单台服务器可承载更多用户。下面就从最基础的Docker环境配置开始,逐步拆解每个关键环节。
2. 环境准备与依赖安装
2.1 RockyLinux 8基础配置
首先确保系统为最新状态:
sudo dnf update -y && sudo reboot安装必要工具集:
sudo dnf install -y curl vim wget git lsof调整系统参数以适应容器运行:
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p注意:max_map_count参数对Elasticsearch等组件至关重要,过低会导致服务启动失败。生产环境建议设置为262144以上。
2.2 Docker引擎安装
添加Docker官方仓库:
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo安装容器运行时:
sudo dnf install -y docker-ce docker-ce-cli containerd.io配置镜像加速(国内环境建议):
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } EOF启动并设置开机自启:
sudo systemctl enable --now docker验证安装:
sudo docker run hello-world3. GitLab容器化部署
3.1 目录结构规划
建议采用以下目录结构,便于后续维护:
/opt/gitlab/ ├── config/ # 配置文件 ├── data/ # 应用数据 ├── logs/ # 日志文件 └── backup/ # 备份文件创建目录并设置权限:
sudo mkdir -p /opt/gitlab/{config,data,logs,backup} sudo chmod -R 775 /opt/gitlab3.2 容器启动命令
使用官方GitLab CE镜像:
sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /opt/gitlab/config:/etc/gitlab \ --volume /opt/gitlab/logs:/var/log/gitlab \ --volume /opt/gitlab/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ce:latest关键参数说明:
--shm-size:解决Sidekiq内存不足问题- 端口映射:HTTPS(443)、HTTP(80)、SSH(22)需全部暴露
- 卷挂载:确保配置、数据、日志持久化
首次启动约需5-10分钟完成初始化,可通过日志监控进度:
sudo docker logs -f gitlab3.3 初始配置调整
修改配置文件:
sudo vim /opt/gitlab/config/gitlab.rb关键配置项:
external_url 'https://gitlab.example.com' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 # 保留7天应用配置:
sudo docker exec -it gitlab gitlab-ctl reconfigure4. 备份恢复方案
4.1 手动备份实施
执行完整备份(包含数据库、仓库、附件等):
sudo docker exec -t gitlab gitlab-backup create备份文件命名格式:
TIMESTAMP_gitlab_backup.tar重要:备份文件默认存储在/var/opt/gitlab/backups目录(即宿主机的/opt/gitlab/data/backups)
4.2 自动备份配置
创建定时任务:
sudo crontab -e添加每日凌晨2点执行:
0 2 * * * /usr/bin/docker exec -t gitlab gitlab-backup create CRON=1验证cron服务状态:
sudo systemctl enable crond && sudo systemctl start crond4.3 恢复操作流程
假设需要恢复的备份文件为:1651824000_gitlab_backup.tar
停止相关服务:
sudo docker exec -it gitlab gitlab-ctl stop unicorn sudo docker exec -it gitlab gitlab-ctl stop sidekiq执行恢复(注意备份文件名不带_TIMESTAMP前缀):
sudo docker exec -it gitlab gitlab-backup restore BACKUP=1651824000启动服务并检查:
sudo docker exec -it gitlab gitlab-ctl restart sudo docker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true5. 运维监控与优化
5.1 健康检查方案
内置检查命令:
sudo docker exec -it gitlab gitlab-rake gitlab:check监控关键指标:
- 磁盘空间:df -h /opt/gitlab
- 内存使用:docker stats gitlab
- 服务状态:docker ps --filter "name=gitlab"
5.2 性能调优建议
调整工作线程数(根据CPU核心数):
unicorn['worker_processes'] = 4 sidekiq['concurrency'] = 10数据库连接池优化:
postgresql['max_worker_processes'] = 8调整后需重新加载配置:
sudo docker exec -it gitlab gitlab-ctl reconfigure6. 故障排查记录
6.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502错误 | Unicorn崩溃 | 查看/var/log/gitlab/unicorn/current |
| 备份失败 | 磁盘空间不足 | 清理旧备份或扩展存储 |
| SSH连接超时 | 容器22端口未映射 | 检查docker run的-p 22:22参数 |
| 内存溢出 | Sidekiq占用过高 | 增加--shm-size参数值 |
6.2 日志分析技巧
关键日志路径:
- GitLab主日志:/var/log/gitlab/gitlab-rails/production.log
- PostgreSQL日志:/var/log/gitlab/postgresql/current
- Nginx访问日志:/var/log/gitlab/nginx/gitlab_access.log
高效排查命令:
# 实时查看错误日志 sudo docker exec -it gitlab tail -f /var/log/gitlab/gitlab-rails/production.log | grep -i error # 统计HTTP状态码 sudo docker exec -it gitlab awk '{print $9}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq -c7. 升级与迁移方案
7.1 版本升级步骤
- 停止当前容器:
sudo docker stop gitlab- 拉取新版本镜像:
sudo docker pull gitlab/gitlab-ce:latest- 重新创建容器(使用原有参数):
sudo docker run ... # 与初始安装相同的参数重要:必须保持所有卷挂载参数与原来完全一致
7.2 服务器迁移流程
- 在新服务器重复安装步骤
- 复制整个/opt/gitlab目录到新主机
- 确保目录权限一致:
sudo chown -R 998:998 /opt/gitlab/data sudo chown -R 998:998 /opt/gitlab/config- 使用相同参数启动容器
8. 安全加固建议
8.1 基础安全配置
修改SSH默认端口:
gitlab_rails['gitlab_shell_ssh_port'] = 2222强制HTTPS:
external_url 'https://gitlab.example.com' nginx['redirect_http_to_https'] = true密码复杂度策略:
gitlab_rails['password_compLEXity'] = 2 # 需要大小写+数字8.2 防火墙规则示例
sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --permanent --add-port=2222/tcp # 修改后的SSH端口 sudo firewall-cmd --reload9. 扩展功能集成
9.1 SMTP邮件配置
以腾讯企业邮箱为例:
gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "gitlab@yourdomain.com" gitlab_rails['smtp_password'] = "yourpassword" gitlab_rails['smtp_domain'] = "yourdomain.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true测试邮件发送:
sudo docker exec -it gitlab gitlab-rails console Notify.test_email('recipient@example.com', 'Test Subject', 'Test Body').deliver_now9.2 LDAP集成示例
gitlab_rails['ldap_enabled'] = true gitlab_rails['ldap_servers'] = { 'main' => { 'label' => 'LDAP', 'host' => 'ldap.yourdomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'verify_certificates' => true, 'bind_dn' => 'CN=GitLab Sync,OU=Service Accounts,DC=yourdomain,DC=com', 'password' => 'yourpassword', 'active_directory' => true, 'base' => 'OU=Users,DC=yourdomain,DC=com' } }10. 性能监控方案
10.1 Prometheus监控配置
GitLab内置Prometheus,启用配置:
prometheus['enable'] = true prometheus_monitor['enable'] = true node_exporter['enable'] = true redis_exporter['enable'] = true postgres_exporter['enable'] = true访问监控面板:
http://gitlab.example.com/-/metrics10.2 资源告警设置
示例:当内存使用超过80%时触发告警
gitlab_rails['monitoring_whitelist'] = ['127.0.0.1/8', '192.168.0.0/16'] alertmanager['flags'] = { 'cluster.advertise-address' => "0.0.0.0:9093", 'config.file' => "/var/opt/gitlab/alertmanager/alertmanager.yml" }配置告警规则后,可以通过邮件或Webhook接收通知。