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

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

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

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
