以下操作皆在root用戶下, 話不多說, 直接開干
第一步: 備份原gitlab
進入gitlab目錄下, 我這邊是: /home/git/gitlab
執行命令: sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
備份完成后會在: /home/git/gitlab/tmp/backups 下產生一個備份的壓縮文件, 如: 1566977804_2019_08_28_9.5.3_gitlab_backup.tar (其中 9.5.3 代表gitlab的版本, 備份文件只能恢復到相同版本的gitlab服務中)
如果備份命令不起作用(可能是gitlab安裝方式的區別), 請參考: http://blog.sina.com.cn/s/blog_6ff7a3b50102w3oj.html
第二步: 安裝docker
centos7安裝方式: yum install docker (centos6請自行搜索安裝docker方式)
啟動docker服務: service docker start
第三步: 尋找合適的gitlab鏡像
進入docker鏡像官網搜索gitlab: https://hub.docker.com/r/gitlab/gitlab-ce/tags
根據剛才備份文件名中的版本號, 在tag列表中找到對應的鏡像版本
記下tag名字, 我這里是: 9.5.3-ce.0 (一會拉取鏡像時有用)
第四步: 拉取鏡像
執行命令: docker pull docker.io/gitlab/gitlab-ce:9.5.3-ce.0 (冒號后面就是剛剛找到的對應版本號)
拉取完成后, 執行命令: docker images (查看本地鏡像列表, 正常的話列表中出現gitlab鏡像)
第五步: 在宿主機上准備3個掛載目錄
mkdir -p /home/docker/gitlab/config
mkdir -p /home/docker/gitlab/data
mkdir -p /home/docker/gitlab/logs
開放掛載目錄權限: chmod -R 777 /home/docker/gitlab
第六步: 使用gitlab鏡像啟動容器
幾個坑:
1.如果宿主機的ssh遠程登入端口為22的話, 最好將其修改為其他端口, 如: 2200 (否則gitlab安裝完成后, 無法正常使用項目中的ssh地址進行clone/pull/push等操作) , 修改ssh端口的方案參考: https://www.cnblogs.com/rwxwsblog/p/5756894.html
2.啟動容器時使用的映射端口需要確保沒有被占用, 否則將無法正常訪問, 查看當前服務器監聽的端口列表命令: netstat -lnpt
3.確保映射的宿主機端口是開放的(1.服務器防火牆 2.阿里雲安全組策略), 修改防火牆參考: https://www.linuxidc.com/Linux/2019-06/159104.htm
執行命令: docker run --name='gitlab' -d --publish 22:22 --publish 1443:443 --publish 18080:80 --restart always --privileged=true --volume /home/docker/gitlab/config:/etc/gitlab --volume /home/docker/gitlab/logs:/var/log/gitlab --volume /home/docker/gitlab/data:/var/opt/gitlab <本地gitlab鏡像id>
執行命令: docker ps -a (查看docker當前容器列表, 正常的話可以看到一個 gitlab 容器, 並且狀態為 Up)
第七步: 測試gitlab服務運行狀態
回到線下環境使用瀏覽器訪問: http://宿主機ip:18080 , 看到如下界面代表服務啟動正常 (如果無法訪問或者顯示 502, 可能還在啟動過程中, 稍等1分鍾再刷新試試)
第八步: 使用在gitlab容器中恢復備份文件
首先將備份文件上傳至宿主機 /home/docker/gitlab 目錄下
執行命令: cp /home/docker/gitlab/備份文件名 /home/docker/gitlab/data/backups/
查看gitlab容器id: docker ps -a
進入容器: docker exec -it <容器id> /bin/bash
執行恢復: gitlab-rake gitlab:backup:restore BACKUP=1566977804_2019_08_28_9.5.3 force=yes (其中橙色字體部分為備份文件名前綴, 這里文件名為: 1566977804_2019_08_28_9.5.3_gitlab_backup.tar)
簡直不敢信, 竟然沒有報錯...
第九步: 查看恢復數據
回到線下瀏覽器, 再次訪問 http://宿主機ip:18080
使用原有的git賬號登入
登入成功, 看到了所有項目! 太感動了...
但是問題隨之而來:
進入項目首頁時, 看到 clone 地址中的hostname變成了一串 隨機字符, 如: git@s4fad15gs1a:xxxxxx/xxxxx.git (理想中應該是: git@git.xxx.com:xxxxx/xxxx.git), 並且無法使用此鏈接 clone 代碼
處理方案:
進入容器: docker exec -it <容器id> /bin/bash
編輯配置文件: vi /etc/gitlab/gitlab.rb
找到 external_url , 取消注釋, 並修改為 external_url 'http://服務器的ip或域名'
找到 gitlab_rails['gitlab_ssh_host'], 取消注釋, 並修改為 gitlab_rails['gitlab_ssh_host'] = '服務器的ip或域名'
保存
更新配置: gitlab-ctl reconfigure
重新啟動: gitlab-ctl restart
等待1分鍾啟動完成后, 再次回到線下查看, 發現地址對了
第十步: 測試clone項目
在本地機器上新建一個文件夾, 進入文件夾, 右鍵調出 Git Bash
執行: git clone git@git.flow360.cn:cardmee/page_pc.git
結果報錯..
由於服務器的更改, 原有的 ssh 授權信息已經失效了, 需要 找到 known_hosts 文件, 將里面原來的 授權記錄一行刪除, 保存
保存后再次執行 git clone git@git.flow360.cn:cardmee/page_pc.git
詢問授權輸入 yes , 回車
正常下載代碼中....
最后2個坑:
1. 我剛剛為了修改clone地址, 改了gitlab.rb文件, 然而當我重啟容器后, 修改的配置又回到了默認狀態, 這就很操蛋了...
解決方案:
在宿主機下進入目錄: cd /home/docker/gitlab/config
以同樣的方式修改 gitlab.rb 文件, 保存
重啟gitlab容器: docker restart <容器id>
測試通過
2.gitlab占用內存過高的優化
解決方案:
在宿主機下進入目錄: cd /home/docker/gitlab/config
修改 gitlab.rb 文件
找到 unicorn['worker_processes'] , 取消注釋, 修改為 unicorn['worker_processes'] = 2
找到 unicorn['worker_memory_limit_min'] , 取消注釋, 修改為 unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
找到 unicorn['worker_memory_limit_max'], 取消注釋, 修改為 unicorn['worker_memory_limit_max'] = "300 * 1 << 20"
找到 sidekiq['concurrency'] , 取消注釋, 修改為 sidekiq['concurrency'] = 5
找到 postgresql['shared_buffers'] , 取消注釋, 修改為 postgresql['shared_buffers'] = "128MB"
保存
重啟容器: docker restart <容器id>