遷移 GitLab 資料到全新容器
本篇文章可以看做是全新搭建 GitLab 的教程使用。
我個人使用方式是使用虛擬機器軟體強制將 4核心4GB
的執行環境劃分給 GitLab
等同購買使用等配置的雲主機,這樣做可以避免和主機上其他軟體進行資源爭搶,影響執行效率。
從 13 年到現在,這已經是第3次遷移 GitLab 了,之前的遷移主要原因:
- 將低版本跨大版本升級至高版本
- 將裸機執行的軟體遷移至容器中
而這次的遷移主要原因:
- 更換了效能更好的新硬體
- 測試備份包是否能夠正常工作
- 減少磁碟碎片對於宿主機的資源浪費(實際使用20G以內,磁碟佔用已經100多G)
在開始搭建應用和遷移資料之前,我們需要做一些準備工作。
準備工作
雖然我在對外的網站上使用了最新的 Ubuntu 18.04
發行版,但是考慮最大程度的穩定性,我還是選擇了 16.04
,畢竟兩年多的使用,幾乎沒有遇到問題,而且和 docker-ce
相容性的問題,也解決了大半,省心省力。
配置作業系統
虛擬機器預設安裝完畢的作業系統,是無法使用 SSH
進行遠端訪問的。需要先安裝 openssh-server
以便開啟訪問服務。
apt update && apt install -y openssh-server
程式安裝完畢之後,就可以直接使用 SSH
連線並管理伺服器了。
我這裡為了後面的操作簡單,將新機器在本地 SSH CONFIG
中配置為了 gitlab-2018.lab.com
,然後做了 RSA KEY
授信免登陸。
ssh-copy-id -i SOME—KEY.pub [email protected]
清理一下無用的軟體源和註釋。
cat /etc/apt/sources.list | grep -v '#' | grep -v 'cdrom:' | sudo tee /etc/apt/sources.list
如果在國內,希望加速軟體下載,可以使用下面的命令。
cat /etc/apt/sources.list | sed -e "s/us\.archive\.ubuntu\.com/mirrors\.aliyun\.com/" | sed -e "s/security\.ubuntu\.com/mirrors\.aliyun\.com/" | sudo tee /etc/apt/sources.list
然後更新軟體包,下載一些基礎依賴和工具。
apt install -y apt-transport-https ca-certificates curl software-properties-common apt upgrade -y
當然,如果要安裝 docker-ce
,推薦使用官方源,可以參考之前的文章 。我這裡為了安裝快速,就先使用國內阿里雲的源了。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - apt-key fingerprint 0EBFCD88 add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" apt install -y docker-ce
這裡可以根據自己情況,考慮是否要鎖定當前的 GitLab
軟體版本。
apt-mark docker-ce
編排工具,使用官方出品的 compose
即可,簡單夠用。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
考慮到 GitLab
會佔用 22
埠,我們先行將系統的埠進行修改。
cat /etc/ssh/sshd_config | sed -e 's/#Port 22/Port 55555/' | sed -e 's/Port 22/Port 55555/' | sudo tee /etc/ssh/sshd_config service ssh restart
如果你也配置了 SSH CONFIG
, 需要一同修改裡面的埠記錄。
有指定 SHELL 習慣的童鞋,可以順手配置。
apt install -y zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
修改 Docker 配置
如果覺得國內下載 Docker
映象包比較慢,可以編輯 /etc/docker/daemon.json
加速資源下載。
如果你進行了配置修改,想要讓配置修改生效,必須重啟 docker
服務,可以參考下面的命令。
mkdir -p /etc/docker && touch /etc/docker/daemon.json cat <<EOF > /etc/docker/daemon.json { "registry-mirrors": [ "http://你的映象地址" ] } EOF service docker restart
搭建新的 GitLab 執行容器
下面提供一個簡單的檔案配置,各位看官可以按自己需求修改。
因為沒有用到太多特殊功能,我這裡將 compose
配置宣告為 v2
。
version: '2' services: gitlab: restart: always image: 'gitlab/gitlab-ce:11.2.3-ce.0' hostname: 'gitlab.lab.com' ports: - "80:80" - "443:443" - "22:22" - "9005:9999" # Nginx # 解決搜尋引擎搜尋不出小於3字元問題 # https://gitlab.com/gitlab-org/gitlab-ce/issues/40379 entrypoint: | bash -c 'sed -i "s/MIN_CHARS_FOR_PARTIAL_MATCHING = 3/MIN_CHARS_FOR_PARTIAL_MATCHING = 1/g" /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/sql/pattern.rb && /assets/wrapper' volumes: - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab' - './cert/lab.com.crt:/etc/gitlab/ssl/lab.com.crt:ro' - './cert/lab.com.key:/etc/gitlab/ssl/lab.com.key:ro' - './cert/lab.com.crt:/etc/gitlab/ssl/registry.gitlab.lab.com.crt:ro' - './cert/lab.com.key:/etc/gitlab/ssl/registry.gitlab.lab.com.key:ro' - './cert/lab.com.crt:/etc/gitlab/ssl/page.lab.com.crt:ro' - './cert/lab.com.key:/etc/gitlab/ssl/page.lab.com.key:ro' - './cert/lab.com.crt:/etc/gitlab/ssl/pages-nginx.crt:ro' - './cert/lab.com.key:/etc/gitlab/ssl/pages-nginx.key:ro' - './cert/lab.com.crt:/var/opt/gitlab/registry/certificate.crt:ro' - './embedded-logs:/opt/gitlab/embedded/logs/' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.lab.com' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_default_projects_features_issues'] = true gitlab_rails['gitlab_default_projects_features_merge_requests'] = true gitlab_rails['gitlab_default_projects_features_wiki'] = true gitlab_rails['gitlab_default_projects_features_snippets'] = true gitlab_rails['gitlab_default_projects_features_builds'] = true gitlab_rails['gitlab_default_projects_features_container_registry'] = false gitlab_rails['lfs_enabled'] = true gitlab_rails['registry_enabled'] = false prometheus_monitoring['enable'] = false node_exporter['enable'] = false redis_exporter['enable'] = false postgres_exporter['enable'] = false gitlab_monitor['enable'] = false registry['enable'] = false nginx['enable'] = true nginx['client_max_body_size'] = '250m' nginx['redirect_http_to_https'] = true nginx['redirect_http_to_https_port'] = 80 nginx['ssl_certificate'] = "/etc/gitlab/ssl/lab.com.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/lab.com.key" nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256" nginx['ssl_prefer_server_ciphers'] = "on" nginx['ssl_protocols'] = "TLSv1.2" pages_external_url "https://page.lab.com/" pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt" pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key" gitlab_pages['enable'] = true gitlab_pages['inplace_chroot'] = true gitlab_pages['redirect_http'] = false gitlab_pages['use_http2'] = true gitlab_pages['dir'] = "/var/opt/gitlab/gitlab-pages" gitlab_pages['log_directory'] = "/var/log/gitlab/gitlab-pages" gitlab_pages['artifacts_server'] = true gitlab_pages['artifacts_server_timeout'] = 10 nginx['http2_enabled'] = true nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "http", "CUSTOM_HEADER" => "VALUE" } nginx['status'] = { "listen_addresses" => ["127.0.0.1"], "fqdn" => "gitlab.lab.com", "port" => 9999, "options" => { "stub_status" => "on", # Turn on stats "access_log" => "on", # Disable logs for stats "allow" => "127.0.0.1", # Only allow access from localhost "deny" => "all" # Deny access to anyone else } }
將配置檔案儲存到新的伺服器上,執行 docker-compose up
後,程式便會自動下載映象檔案,然後自動啟動應用。
Creating network "gitlablabcom_default" with the default driver Pulling gitlab (gitlab/gitlab-ce:11.2.3-ce.0)... 11.2.3-ce.0: Pulling from gitlab/gitlab-ce 3b37166ec614: Pull complete 3b37166ec614: Pull complete ba077e1ddb3a: Pull complete 34c83d2bc656: Pull complete 84b69b6e4743: Pull complete 0f72e97e1f61: Pull complete 2d84d0050f56: Pull complete 3988829a97fa: Pull complete 9388ce60a1b5: Pull complete 3f38070b922c: Pull complete 2484a73c1218: Pull complete be305d229b7a: Pull complete Digest: sha256:b5927ed7ac79524251c3b717195c239023a33d169709c9f1d74f0a898975938f Status: Downloaded newer image for gitlab/gitlab-ce:11.2.3-ce.0 Creating gitlablabcom_gitlab_1 ... done Attaching to gitlablabcom_gitlab_1 gitlab_1 | Thank you for using GitLab Docker Image! gitlab_1 | Current version: gitlab-ce=11.2.3-ce.0 gitlab_1 | gitlab_1 | Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file gitlab_1 | And restart this container to reload settings. gitlab_1 | To do it use docker exec:
當你看到下面的請求記錄日誌後,你的應用便啟動完成了。
gitlab_1 | ==> /var/log/gitlab/sidekiq/current <== gitlab_1 | 2018-09-27_03:15:25.08874 2018-09-27T03:15:25.088Z 1013 TID-osuacsvzh PagesDomainVerificationCronWorker JID-f6d295ba87e7ea6c13f788d4 INFO: start gitlab_1 | 2018-09-27_03:15:25.09873 2018-09-27T03:15:25.098Z 1013 TID-osuacsw65 StuckImportJobsWorker JID-465eb7f9283897dd1d622dc1 INFO: start gitlab_1 | 2018-09-27_03:15:25.13306 2018-09-27T03:15:25.132Z 1013 TID-osuacsvzh PagesDomainVerificationCronWorker JID-f6d295ba87e7ea6c13f788d4 INFO: done: 0.044 sec gitlab_1 | 2018-09-27_03:15:25.14188 2018-09-27T03:15:25.141Z 1013 TID-osuacsw65 StuckImportJobsWorker JID-465eb7f9283897dd1d622dc1 INFO: done: 0.043 sec gitlab_1 | gitlab_1 | ==> /var/log/gitlab/gitlab-rails/production.log <== gitlab_1 | Started GET "/help" for 127.0.0.1 at 2018-09-27 03:15:50 +0000 gitlab_1 | Processing by HelpController#index as */* gitlab_1 | Completed 200 OK in 304ms (Views: 296.9ms | ActiveRecord: 3.0ms) gitlab_1 |
如果你是新使用者,那麼現在便可以結束文章瀏覽,訪問你的 GitLab
進行體驗了。
接下來我們開始老資料的備份,以及將資料遷移到新的 GitLab
應用中。
備份之前的 GitLab 資料
如果你也是使用容器化的方式執行 GitLab
,備份命令需要依賴 Docker
作為代理執行命令( gitlab_gitlab_1
為容器執行名稱)。
docker exec -t gitlab_gitlab_1 gitlab-rake gitlab:backup:create
如果是裸機執行,那麼直接執行下面的命令。
gitlab-rake gitlab:backup:create
命令順利執行完畢後,然後可以在應用的 /data/backups
中找到備份的資料檔案。
將資料檔案儲存/轉移到新的機器上之後,我們便可以開始正式的遷移工作。
遷移(還原)資料
先將備份檔案放置回新的應用的 /data/backups
資料夾中。
然後使用 docker ps
獲取執行容器的名稱。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3fba53e6c021 gitlab/gitlab-ce:11.2.3-ce.0 "bash -c 'sed -i \"s/…" 10 minutes ago Up 24 minutes (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9005->9999/tcp gitlablabcom_gitlab_1
然後執行 docker exec -t gitlablabcom_gitlab_1 gitlab-rake gitlab:backup:restore RAILS_ENV=production
即可開始恢復資料。
在執行過程中,程式會詢問你是否願意放棄當前應用的所有資料,開始恢復操作,請回復 yes
。
docker exec -t gitlablabcom_gitlab_1 gitlab-rake gitlab:backup:restore Unpacking backup ... done Before restoring the database, we will remove 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
經過漫長的等待(根據資料量而定)。
done Restoring uploads ... done Restoring builds ... done Restoring artifacts ... done Restoring pages ... done Restoring lfs objects ... done This will rebuild an authorized_keys file. You will lose any data stored in authorized_keys file. Do you want to continue (yes/no)? yes ....... Deleting tmp directories ... done done done done done done done done
最後重新啟動你的 GitLab
應用,遷移就完畢了。
最後
喜歡折騰的小夥伴可以掃二維碼新增好友(記得註明來源和目的,方便備註拉群)。
我計劃拉個小群,把喜歡折騰的朋友聚一起,在不發廣告的情況下,聊聊軟體、HomeLab、程式設計上的一些問題,來擴充套件和積累一些寫作素材。
—EOF