Di chuyển và nâng cấp một máy chủ GitLab-ce

Mỗi 5 năm một lần, cùng một bài hát và điệu nhảy. Phiên bản LTS của Debian sắp hết hạn, và đã đến lúc cập nhật máy chủ. Đây cũng là thời điểm thích hợp để nâng cấp lên máy mới để tận dụng hiệu suất cải thiện.
Nếu chúng ta có ổ cứng SATA, thì tốt nhất là nên bắt đầu với ổ đĩa mới bất kể, vì tuổi thọ của chúng có hạn.

Vì vậy, chúng ta sẽ tiến hành một loạt sao lưu trên máy chủ cũ, chuyển chúng sang máy mới, và cài đặt lại mọi thứ như cũ.

Trong trường hợp của chúng ta, chúng ta đang sử dụng Debian 8, hỗ trợ GitLab 13.3.9.
Chúng ta chuyển máy sang Debian 10, hỗ trợ GitLab 14.x.x

Cài đặt GitLab-ce dễ dàng, miễn là chúng ta không cần di chuyển bất kỳ kho lưu trữ nào. Sự phức tạp đến từ việc đảm bảo chúng ta không mất bất cứ thứ gì từ phiên bản cũ. Tại partITech, chúng ta có hơn 100 kho lưu trữ với tổng cộng khoảng 20 GB lưu trữ.

Các bản lưu trữ không tương thích giữa các phiên bản. Do đó, nếu chúng ta có một bản lưu trữ được tạo ra với phiên bản 13.3.9, chúng ta sẽ cần cài đặt phiên bản đó và nhập nó. Bước cuối cùng sẽ liên quan đến việc chuyển đổi từ 13.3.9 sang phiên bản 14.x mới nhất
Nhưng để tiến hành nâng cấp phiên bản chính, điều quan trọng là phải cài đặt phiên bản mới nhất của loạt 13.x, đó là 13.12.0

Cài đặt các gói cơ bản

apt-get install vim curl backup-manager mlocate libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev libpcre2-dev build-essential git-core graphicsmagick libimage-exiftool-perl htop

Chúng ta cài đặt vim và vô hiệu hóa chuột.

vi ~/.vimrc
#on ajoute set mouse-=a

Chúng ta bỏ chú thích các bí danh.

vi ~/.bashrc
.   ~/.bashrc

Trên máy chủ cũ

Dịch vụ được dừng lại.

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq

Tạo một bản sao lưu.

sudo gitlab-rake gitlab:backup:create

Chúng ta chuẩn bị một thư mục để đặt tất cả các tệp của chúng ta cần được chuyển.

mkdir ~/gitlab-old

Chúng ta sao chép các tệp cấu hình của mình từ thư mục của chúng ta. /etc/gitlab (gitlab.rb và gitlab-secrets.json) cũng như thư mục /etc/gitlab/ssl

sudo cp /etc/gitlab/gitlab.rb ~/gitlab-old
sudo cp /etc/gitlab/gitlab-secrets.json ~/gitlab-old
sudo cp -R /etc/gitlab/ssl ~/gitlab-old
sudo cp /etc/backup-manager.conf ~/gitlab-old/
sudo cp /etc/backup-manager.sh ~/gitlab-old/

Trên máy chủ mới

Chúng ta cài đặt nguồn apt của GitLab.

curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |  bash

Chúng ta cài đặt GitLab chính xác cùng phiên bản như cái cũ để tránh vấn đề cài đặt. Sau đó chúng ta sẽ cập nhật lên phiên bản mới nhất.

sudo apt-get install gitlab-ce=13.3.9-ce.0

Chúng ta cài đặt các tệp cấu hình của mình từ phiên bản cũ của chúng ta.

sudo mv /etc/gitlab/gitlab.rb /etc/gitlab/_gitlab.rb
sudo cp gitlab-old/gitlab* /etc/gitLab

Chúng ta sao chép thư mục SSL từ phiên bản cũ của chúng ta.

cp -R gitlab-old/ssl /etc/gitlab/

Chúng ta bắt đầu cấu hình lại GitLab.

sudo gitlab-ctl reconfigure

Chúng ta dừng các dịch vụ.

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq

Chúng ta đặt bản sao lưu đầu tiên của mình vào thư mục sao lưu mặc định của GitLab (chúng ta đã sửa đổi thư mục mặc định của mình).

sudo cp gitlab-old/1624870826_2021_06_28_13.3.9_gitlab_backup.tar ~/gitlab-backups

Và chúng ta nhập nó.

sudo gitlab-rake gitlab:backup:restore BACKUP=1624870826_2021_06_28_13.3.9

Chúng ta thiết lập quyền.

  sudo find /data/gitlab-storage -type f -exec chmod 0644 {} \;
  sudo find /data/gitlab-storage/uploads -type d -not -path /data/gitlab-storage/uploads -exec chmod 0700 {} \;

Chúng ta chuyển đổi kho lưu trữ của mình thành mã băm nếu cần thiết.

gitlab-rake gitlab:storage:migrate_to_hashed

Chúng ta mở cổng 80 và 443 trong tường lửa nếu cần.

iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Giao diện giờ đây sẽ phản hồi bình thường trên máy chủ mới của chúng ta.

Nâng cấp phiên bản

Bây giờ chúng ta cần cập nhật GitLab.
Bước đầu tiên, chúng ta chuyển sang phiên bản 13.5.0

apt-get install gitlab-ce=13.5.0-ce.0

Và tại đó chúng ta gặp lỗi sau: PG::DuplicateTable: ERROR: relation "postgres_indexes" đã tồn tại

Selection_865

Để cho script chạy, chúng ta sẽ cần chỉnh sửa quy trình nâng cấp để thêm việc xóa chỉ mục trong file: /opt/gitlab/embedded/service/gitlab-rails/db/migrate/20200922093004_add_postgres_index_view.rb

# frozen_string_literal: true

class AddPostgresIndexView < ActiveRecord::Migration[6.0]
  DOWNTIME = false

  def up
    execute(<<~SQL)
       DROP VIEW IF EXISTS postgres_indexes;
        CREATE VIEW postgres_indexes AS
      SELECT
        pg_namespace.nspname || '.' || pg_class.relname as identifier,
        pg_index.indexrelid,
        pg_namespace.nspname as schema,
        pg_class.relname as name,
        pg_index.indisunique as unique,
        pg_index.indisvalid as valid_index,
        pg_class.relispartition as partitioned,
        pg_index.indisexclusion as exclusion,
        pg_indexes.indexdef as definition,
        pg_relation_size(pg_class.oid) as ondisk_size_bytes
      FROM pg_index
      INNER JOIN pg_class ON pg_class.oid = pg_index.indexrelid
      INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
      INNER JOIN pg_indexes ON pg_class.relname = pg_indexes.indexname
      WHERE pg_namespace.nspname <> 'pg_catalog'
    SQL
  end

  def down
    execute(<<~SQL)
      DROP VIEW postgres_indexes
    SQL
  end
end

Một khi script di cư được chỉnh sửa, chúng ta khởi động lại cấu hình.

gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Selection_866

Bây giờ chúng ta có thể tiếp tục nâng cấp. Nâng cấp lên phiên bản 13.6.0 và tăng cài đặt lên đến phiên bản 13.12.0

apt-get install gitlab-ce=13.6.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.7.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.8.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.9.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.10.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.11.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.12.5-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure

Đối với phiên bản 13.7.0, script di cư sẽ cần được sửa chữa.

/opt/gitlab/embedded/service/gitlab-rails/db/migrate/20201127170848_add_index_bloat_estimate_view.rb

# frozen_string_literal: true

class AddIndexBloatEstimateView < ActiveRecord::Migration[6.0]
  DOWNTIME = false

  def up
    execute(<<~SQL)
      DROP VIEW IF EXISTS postgres_index_bloat_estimates;
      CREATE VIEW postgres_index_bloat_estimates AS
      -- Originally from: https://github.com/ioguix/pgsql-bloat-estimation/blob/master/btree/btree_bloat.sql
      -- WARNING: executed with a non-superuser role, the query inspect only index on tables you are granted to read.
      -- WARNING: rows with is_na = 't' are known to have bad statistics ("name" type is not supported).
      -- This query is compatible with PostgreSQL 8.2 and after
      SELECT nspname || '.' || idxname as identifier,
        CASE WHEN relpages > est_pages_ff
          THEN bs*(relpages-est_pages_ff)
          ELSE 0
        END::bigint AS bloat_size_bytes
      FROM (
        SELECT
            coalesce(1 +
              ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4+nulldatahdrwidth)::float))), 0
            ) AS est_pages_ff,
            bs, nspname, tblname, idxname, relpages, is_na
        FROM (
            SELECT maxalign, bs, nspname, tblname, idxname, reltuples, relpages, idxoid, fillfactor,
                  ( index_tuple_hdr_bm +
                      maxalign - CASE -- Add padding to the index tuple header to align on MAXALIGN
                        WHEN index_tuple_hdr_bm%maxalign = 0 THEN maxalign
                        ELSE index_tuple_hdr_bm%maxalign
                      END
                    + nulldatawidth + maxalign - CASE -- Add padding to the data to align on MAXALIGN
                        WHEN nulldatawidth = 0 THEN 0
                        WHEN nulldatawidth::integer%maxalign = 0 THEN maxalign
                        ELSE nulldatawidth::integer%maxalign
                      END
                  )::numeric AS nulldatahdrwidth, pagehdr, pageopqdata, is_na
            FROM (
       

Bây giờ chúng ta cài đặt phiên bản 14.0.0.

apt-get install gitlab-ce=13.12.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure

Kể từ phiên bản 14, việc sử dụng hệ thống tệp băm là bắt buộc. Việc cài đặt sẽ hiển thị cảnh báo và dừng quá trình.

root@git-partitech-sd-47766:/opt/gitlab# apt-get install gitlab-ce=14.0.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  gitlab-ce
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/923 MB of archives.
After this operation, 14.5 MB of additional disk space will be used.
Reading changelogs... Done
(Reading database ... 119998 files and directories currently installed.)
Preparing to unpack .../gitlab-ce_14.0.0-ce.0_amd64.deb ...
gitlab preinstall: Checking for unmigrated data on legacy storage
gitlab preinstall: 
gitlab preinstall: Legacy storage is no longer supported. Please migrate your data to hashed storage.
gitlab preinstall: Check https://docs.gitlab.com/ee/administration/raketasks/storage.html#migrate-to-hashed-storage for details.
gitlab preinstall: 
gitlab preinstall: If you want to skip this check, run the following command and try again:
gitlab preinstall: 
gitlab preinstall:  sudo touch /etc/gitlab/skip-unmigrated-data-check
gitlab preinstall: 
dpkg: error processing archive /var/cache/apt/archives/gitlab-ce_14.0.0-ce.0_amd64.deb (--unpack):
 new gitlab-ce package pre-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 /var/cache/apt/archives/gitlab-ce_14.0.0-ce.0_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Vì vậy, bạn sẽ cần chuyển đổi kho lưu trữ của mình nếu chưa làm.

gitlab-rake gitlab:storage:migrate_to_hashed

Và sau đó khởi động cài đặt với chỉ thị không hiển thị cảnh báo nữa.

sudo touch /etc/gitlab/skip-unmigrated-data-check
apt-get install gitlab-ce=14.0.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Selection_871

Bước quan trọng nhất đã qua. Giờ đây chúng ta có thể cập nhật lên phiên bản mới nhất. Về phía chúng ta, đó là phiên bản 14.0.1

apt-get upgrade

Hoạt động cuối cùng. Nếu như chúng ta, bạn sử dụng thông báo Slack, bạn sẽ cần di chuyển cấu hình. Các mẫu dịch vụ đã được gỡ bỏ kể từ phiên bản 14.x.x

Bạn có thể tích hợp lại thông báo cho từng dự án, hoặc như chúng ta, thiết lập nó trên toàn cầu.
Để làm điều này, bạn sẽ cần vào Khu vực Quản trị >> Móc Hệ thống

Selection_874