Migración y actualización de un servidor GitLab-ce

Cada 5 años, es la misma historia y rutina. La versión LTS de Debian expira y es momento de actualizar el servidor. También es una oportunidad ideal para cambiar a una máquina más nueva y beneficiarse de un rendimiento mejorado.
Si tenemos un disco duro SATA, es mejor empezar con discos nuevos de todos modos, ya que su vida útil es limitada.

Así que procederemos con una serie de copias de seguridad en el servidor antiguo, las transferiremos al nuevo y reinstalaremos todo como estaba.

En nuestro caso, estábamos usando Debian 8, que soporta GitLab 13.3.9.
Estamos cambiando de máquina a Debian 10, que soporta GitLab 14.x.x

Instalar GitLab-ce es fácil, siempre y cuando no tengamos que migrar repositorios. La complicación surge al asegurarnos de no perder nada de la instancia antigua. En partITech tenemos más de 100 repositorios que suman alrededor de 20 GB de archivos.

Los archivos no son compatibles entre versiones. Por lo tanto, si tenemos un archivo creado con la versión 13.3.9, necesitaríamos instalar esa misma versión e importarlo. El último paso será migrar de la 13.3.9 a la última versión 14.x
Pero para proceder con esta actualización de versión mayor, es imperativo instalar la última versión de la serie 13.x, que es la 13.12.0

Instalación de los paquetes base

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

Instalamos vim y desactivamos el mouse.

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

Descomentamos los alias.

vi ~/.bashrc
.   ~/.bashrc

En el servidor antiguo

Los servicios se detienen.

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

Se crea una copia de seguridad.

sudo gitlab-rake gitlab:backup:create

Preparamos un directorio para poner todos nuestros archivos a ser transferidos.

mkdir ~/gitlab-old

Copiamos nuestros archivos de configuración de nuestro directorio. /etc/gitlab (gitlab.rb y gitlab-secrets.json) así como el directorio /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/

En el servidor nuevo

Instalamos la fuente apt de GitLab.

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

Instalamos GitLab en exactamente la misma versión que la antigua para evitar problemas de instalación. Luego actualizaremos a la versión más reciente.

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

Instalamos nuestros archivos de configuración de nuestra instancia antigua.

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

Copiamos el directorio SSL de nuestra instancia antigua.

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

Iniciamos la reconfiguración de GitLab.

sudo gitlab-ctl reconfigure

Detenemos los servicios.

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

Colocamos nuestra primera copia de seguridad en el directorio por defecto de copias de seguridad de GitLab (hemos modificado nuestro directorio por defecto).

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

Y la importamos.

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

Ajustamos los permisos.

  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 {} \;

Convertimos nuestros repositorios a hashes si es necesario.

gitlab-rake gitlab:storage:migrate_to_hashed

Abrimos los puertos 80 y 443 en el cortafuegos si es necesario.

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

La interfaz ahora debería responder normalmente en nuestro nuevo servidor.

Actualización de versiones

Ahora necesitamos actualizar GitLab.
Primer paso, cambiamos a la versión 13.5.0

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

Y nos encontramos con el siguiente error: PG::DuplicateTable: ERROR: la relación "postgres_indexes" ya existe

Selection_865

Para conseguir que el script se ejecute, necesitaremos modificar el procedimiento de actualización para agregar una eliminación de los índices en el archivo: /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

Una vez modificado el script de migración, relanzamos la reconfiguración.

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

Ahora podemos proceder a la siguiente actualización. Actualizamos a la versión 13.6.0 e incrementamos las instalaciones hasta la versió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

Para la versión 13.7.0, será necesario corregir el script de migración.

/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 (
       

Ahora instalamos la versió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

Desde la versión 14, es imperativo usar el sistema de archivos hash. La instalación mostrará una advertencia y detendrá el proceso.

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)

Por lo tanto, tendrás que convertir tus repositorios si aún no lo has hecho.

gitlab-rake gitlab:storage:migrate_to_hashed

Y luego iniciar la instalación especificando no mostrar más la alerta.

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

El paso más crítico ha quedado atrás. Ahora podemos actualizar a la versión más reciente. De nuestra parte, es la versión 14.0.1

apt-get upgrade

Última operación. Si, como nosotros, usabas notificaciones de Slack, necesitarás migrar la configuración. Las plantillas de servicios se han eliminado desde la versión 14.x.x

Puedes reintegrar las notificaciones proyecto por proyecto, o como nosotros, configurarlas a nivel global.
Para ello, necesitarás ir a Área de Administración >> System Hooks

Selection_874