gitlab遷移docker部署并版本升級

寫在開始:

公司之前的gitlab服務器,版本8.10.5,是由開發(fā)同學安裝、部署和維護。
官方安裝步驟教程好多頁,過程非常繁瑣。而且如果將來遷移或者系統(tǒng)損壞,又得重新部署一遍。
現(xiàn)在交接給運維部門維護,采用docker方式部署,方便快捷,而且將來遷移、升級方便、高效。

基本機器信息:

機器名 業(yè)務 系統(tǒng) IP地址 配置
O 舊gitlab(8.10.5) CentOS 6.5 172.16.17.91 4c/8G/1.2T
A 新gitlab(9.2.2) CentOS 7.2 172.16.16.147 4c/8G/1T
B nginx(1.10.3)
postgresql(9.6)
redis(2.8.4)
haproxy(1.7.6)
CentOS 7.2 172.16.16.148 4c/8G/200G

基本目錄約束:

總目錄:/home/data
docker-compose配置文件:/home/data/docker-compose.yml
docker數(shù)據(jù):/home/data/gitlab/data
nginx:
    配置:/home/data/nginx/etc/sites
    ssl證書:/home/data/nginx/etc/ssl
    logs日志:/home/data/nginx/logs
haproxy配置文件:/home/data/haproxy/etc/haproxy.cfg
postgresql數(shù)據(jù):/home/data/postgresql/data
redis數(shù)據(jù):/home/data/redis/data

一、基本環(huán)境準備

1.關(guān)閉SELinux和防火墻

機器A、B:

#防火墻
#關(guān)閉防火墻
systemctl stop firewalld
#禁止開機啟動
systemctl disable firewalld

#SELinux
#關(guān)閉即時生效
setenforce 0
#永久有效
#修改/etc/selinux/config,“SELINUX=enforcing”修改為“SELINUX=disabled”,然后重啟。
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#重啟生效修改
reboot

2.修改ssh登錄端口

機器A、B:

#編輯配置文件
vi /etc/ssh/sshd_config
#改成8822端口
Port 8822
#重啟ssh服務
systemctl restart sshd

二、安裝

1.docker安裝

#安裝
curl -sSL https://get.daocloud.io/docker | sh
#配置 Docker 加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://26109e56.m.daocloud.io
#啟動docker
systemctl start docker
#加入開機啟動docker
systemctl enable docker

2.docker-compose安裝

curl -L https://get.daocloud.io/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

3.docker鏡像pull

機器A:

#因為遷移和升級是兩個部分,所有需要pull兩個版本,gitlab(https://github.com/sameersbn/docker-gitlab)
docker pull sameersbn/gitlab:8.10.5
docker pull sameersbn/gitlab:9.2.2

機器B:

#redis(https://github.com/sameersbn/docker-redis)
docker pull sameersbn/redis
#nginx(https://github.com/sameersbn/docker-nginx)
docker pull sameersbn/nginx
#postgresql(https://github.com/sameersbn/docker-postgresql)
docker pull sameersbn/postgresql:9.6-2
#haproxy(for gitlab ssh mode)
docker pull haproxy:1.7.6

三、配置

1.機器B

docker-compose配置文件

nginx:
  restart: always
  image: sameersbn/nginx:latest
  volumes:
    - /home/data/nginx/etc/sites:/etc/nginx/conf.d:Z
    - /home/data/nginx/etc/ssl:/etc/nginx/ssl:Z
    - /home/data/nginx/logs:/var/log/nginx:Z
  ports:
    - "80:80"
    - "443:443"

postgresql:
  restart: always
  image: sameersbn/postgresql:9.6-2
  environment:
    - DB_USER=gitlab
    - DB_PASS=hamgua!@#gitlab
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm
  volumes:
    - /home/data/postgresql/data:/var/lib/postgresql:Z
  ports:
    - "5432:5432"

redis:
  restart: always
  image: sameersbn/redis:latest
  volumes:
    - /home/data/redis/data:/var/lib/redis:Z
  ports:
    - "6379:6379"

haproxy:
  restart: always
  image: haproxy:1.7.6
  volumes:
    - /home/data/haproxy/etc:/usr/local/etc/haproxy:Z
  ports:
    - "22:80"    

nginx配置:

upstream git-hamgua {
  server 172.16.16.147:10080 max_fails=3 fail_timeout=30s weight=1;
}


server {
  listen   80;
  listen   443 ssl;
  server_name git.hamgua.com;

  ssl_certificate       /etc/nginx/ssl/git.hamgua.cn.crt;
  ssl_certificate_key   /etc/nginx/ssl/git.hamgua.cn.key;
  ssl_protocols         TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS;
  ssl_session_cache     shared:SSL:10m;
  ssl_session_timeout   10m;

  location / {
    proxy_pass http://git-hamgua;

    proxy_redirect          off;
    #proxy_next_upstream  error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_next_upstream off;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    #proxy_set_header       Accept-Encoding  "";
    proxy_connect_timeout   300;
    proxy_send_timeout      300;
    proxy_read_timeout      300;
    proxy_buffer_size       64k;
    proxy_buffers           16 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_redirect          default;
    proxy_ignore_client_abort on;
    proxy_http_version 1.1;
    proxy_set_header Connection "";

  }

}

haproxy配置:

global
    pidfile /var/run/haproxy.pid
    maxconn 81920
    nbproc 10
    daemon
    quiet

defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 10240
    timeout connect 5000ms
    timeout client 60000ms
    timeout server 60000ms

frontend git
    bind 0.0.0.0:80
    mode tcp
    default_backend gitlab-ssh

backend gitlab-ssh
    option tcpka
    balance roundrobin
    mode tcp
    server gitlab-ssh1 172.16.16.147:10022 weight 1 check port 10022 inter 1s rise 2 fall 2

2.機器A

docker-compose配置文件(8.10.5版本)

gitlab:
  restart: always
  image: sameersbn/gitlab:8.10.5
  ports:
    - "10080:80"
    - "10022:22"
  environment:
    #postgresql
    - DB_ADAPTER=postgresql
    - DB_HOST=172.16.16.148
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=hamgua!@#gitlab
    - DB_NAME=gitlabhq_production
    #redis
    - REDIS_HOST=172.16.16.148
    - REDIS_PORT=6379

    #global config
    - DEBUG=false
    - TZ=Asia/Shanghai
    - GITLAB_TIMEZONE=Shanghai
    - GITLAB_ROOT_EMAIL=hamgua@hamgua.com
    - GITLAB_SECRETS_DB_KEY_BASE=mjztzlfksTvRz5wNXjVDstTJZklGKDWsHX6Q9s55ZVc9v7TdGvDs3DHzFLxsKWsT

    - GITLAB_HOST=git.hamgua.com
    #ssl port
    - GITLAB_PORT=443
    #ssh port
    - GITLAB_SSH_PORT=22
    - GITLAB_HTTPS=true
    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false
    - GITLAB_PAGES_ENABLED=true
    - GITLAB_PAGES_DOMAIN=git.hamgua.com
    - GITLAB_EMAIL=hamgua@hamgua.com
    - GITLAB_EMAIL_REPLY_TO=hamgua@hamgua.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=hamgua@hamgua.com
    
    #backup
    #every day    
    - GITLAB_BACKUP_SCHEDULE=daily
    - GITLAB_BACKUP_TIME=01:00
    #7 days
    - GITLAB_BACKUP_EXPIRY=604800
    
    #smtp
    - SMTP_ENABLED=true
    - SMTP_DOMAIN=hamgua.com
    - SMTP_HOST=smtp.exmail.qq.com
    - SMTP_PORT=587
    - SMTP_USER=hamgua@hamgua.com
    - SMTP_PASS=hamgua
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=plain
    - IMAP_ENABLED=false
  volumes:
    - /home/data/gitlab/data:/home/git/data:Z

四、初始化和啟動

1.docker初始化

機器B:

cd /home/data
docker-compose create nginx redis postgresql

機器A:

cd /home/data
docker-compose create gitlab

2.docker啟動

(注意必須先啟動機器B的redis、postgresql服務)
機器B:

cd /home/data
docker-compose start nginx redis postgresql

機器A:

cd /home/data
docker-compose start gitlab

五、備份和恢復

1.備份(機器O)

#登錄機器O,執(zhí)行備份,會生成類似1497291058_gitlab_backup.tar的備份文件
cd /var/opt/gitlab/backups/
gitlab-rake gitlab:backup:create RAILS_ENV=production
#發(fā)送到docker gitlab服務器的備份目錄
scp 1497291058_gitlab_backup.tar root@172.16.16.147:/home/data/gitlab/data/backups/

2.恢復(機器A)

#登錄gitlab容器
docker exec -ti data_gitlab_1 bash
#執(zhí)行恢復
sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production

恢復輸入確認

#一共有兩個部分需要確認
1.恢復git數(shù)據(jù)
Before restoring the database we recommend removing all existing
tables to avoid future upgrade problems. Be aware that if you have
custom tables in the GitLab database these tables and all data will be
removed.

Do you want to continue (yes/no)? 輸入yes

2.恢復authorized_keys文件
This will rebuild an authorized_keys file.
You will lose any data stored in authorized_keys file.
Do you want to continue (yes/no)? 輸入no

3.清除緩存

#登錄gitlab容器
docker exec -ti data_gitlab_1 bash
#清除緩存
sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production

六、升級gitlab

1.關(guān)閉和刪除8.10.5版本的gitlab docker容器(機器A)

docker-compose stop gitlab
docker-compose rm gitlab

2.啟動9.2.2版本gitlab docker容器(機器A)

9.2.2的docker-compose配置文件:

gitlab:
  restart: always
  image: sameersbn/gitlab:9.2.2
  ports:
    - "10080:80"
    - "10022:22"
  environment:
    #postgresql
    - DB_ADAPTER=postgresql
    - DB_HOST=172.16.16.148
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=hamgua!@#gitlab
    - DB_NAME=gitlabhq_production

    #redis
    - REDIS_HOST=172.16.16.148
    - REDIS_PORT=6379

    #global config
    - DEBUG=false
    
    - TZ=Asia/Shanghai
    - GITLAB_TIMEZONE=Shanghai

    - GITLAB_HOST=git.hamgua.com
    #ssl port
    - GITLAB_PORT=443
    #ssh port
    - GITLAB_SSH_PORT=22
    - GITLAB_HTTPS=true
    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false
    - GITLAB_PAGES_ENABLED=true
    - GITLAB_PAGES_DOMAIN=git.hamgua.com
    
    - GITLAB_RELATIVE_URL_ROOT=
    - GITLAB_SECRETS_DB_KEY_BASE=mjztzlfksTvRz5wNXjVDstTJZklGKDWsHX6Q9s55ZVc9v7TdGvDs3DHzFLxsKWsT
    - GITLAB_SECRETS_SECRET_KEY_BASE=RWNLdwXfsGHdGGjwSw678sWxztJ3sPJbfVm2BRrHq5Ql9XCZVXVLTHN7vpSdWmKF2DJ4qV2s5NJgZwcxPjZw5wJ9PwvdhjsQ99dWjmLDXvwBsWV3K227573vVQCmwZ5R
    - GITLAB_SECRETS_OTP_KEY_BASE=LrC872vHQ5bnjB6m7xBHPF99H9NPvqcFJlbf47TVZN835FnGG5kJvFtRwQQVRmBfcW96TJtJF5sxWKBKmm6QWf2RNddScLXMnwmmtGcDptRclZ97GLx8SxVSjdgm88WG    
    
    - GITLAB_ROOT_EMAIL=hamgua@hamgua.com
    - GITLAB_EMAIL=hamgua@hamgua.com
    - GITLAB_EMAIL_REPLY_TO=hamgua@hamgua.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=hamgua@hamgua.com
    
    #backup
    #every day
    - GITLAB_BACKUP_SCHEDULE=daily
    - GITLAB_BACKUP_TIME=01:00
    #7 days
    - GITLAB_BACKUP_EXPIRY=604800
    
    #smtp
    - SMTP_ENABLED=true
    - SMTP_DOMAIN=hamgua.com
    - SMTP_HOST=smtp.exmail.qq.com
    - SMTP_PORT=587
    - SMTP_USER=hamgua@hamgua.com
    - SMTP_PASS=hamgua
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=plain
    - IMAP_ENABLED=false
  volumes:
    - /home/data/gitlab/data:/home/git/data:Z

初始化(機器A)

cd /home/data
docker-compose create gitlab

啟動(機器A)

cd /home/data
docker-compose start gitlab

清除緩存

#登錄gitlab容器
docker exec -ti data_gitlab_1 bash
#清除緩存
sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production

七、登錄驗證

登錄驗證,確保數(shù)據(jù)遷移完整誤和版本升級完成。

八、git高可用方案

gitlab:inotify+unison雙向文件同步,實現(xiàn)git提交倉庫自動同步到另一臺git服務器。參考:http://leanote.com/blog/post/591d50b4ab64412be900163d
postgresql:主從流復制。參考:http://www.itdecent.cn/p/2d07339774c0

總結(jié):

1.gitlab遷移必須要跟原版本保持一致,否則備份恢復會提醒版本不兼容。
2.遷移完畢,需要先簡單驗證數(shù)據(jù),然后再進行升級,防止數(shù)據(jù)丟失。
3.高可用方案機器A、B都需要double部署。
4.萬事小心,想好遷移回滾方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容