Migration de Gitlab

Il y a un peu plus de deux ans, j'ai migré mon instance Gitlab sous Docker. J'avais alors rédigé un brouillon du présent article, sans jamais le publier. A l'occasion d'une migration vers un nouveau serveur dédié, j'en profite pour le reprendre et le mettre à jour.

Migration de Gitlab

A propos : Il s'agit d'une migration serveur, de l'instance Gitlab Docker vers une autre mais le processus est exactement le même qu'une migration d'une instance installée depuis le dépôt de paquets vers Docker. Enjoie.

Prérequis

  • Avoir une instance Gitlab (12.2 et supérieure), sous docker ou non
  • Connaitre les bases de Docker / Docker-compose et les avoir installé
  • Avoir installé Rsync (à défaut, scp)

Sauvegarde

Comme je vous le disais en préambule, le processus est le même que ce soit sous Docker ou non. Il ne s'agit pas de dupliquer les répertoires du Git, mais bien de faire une sauvegarde à l'aide de gitlab-backup, sauvegarde que nous restaurerons sur le nouveau serveur.
Nous commençons par effectuer une sauvegarde de Gitlab :

Dans un container vous utiliserez celle-ci (précisez son nom) :

docker exec -t <container> gitlab-backup create

Si vous n'utilisez pas (encore) Docker, vous taperez :

sudo gitlab-backup create

Et on patiente.. Cela peut prendre plus ou moins de temps, selon le nombres de repos, de commits, etc. A la fin du processus, vous obtiendrez un fichier de sauvegarde.

Par défaut, la sauvegarde est exportée dans /var/opt/gitlab/backup sur une instance sans docker. Avec docker, vous retrouverez comme moi cette sauvegarde là ou j'ai monté mon volume persistent, dans /srv/gitlab/data/backups/.

Le fichier obtenu se baptise dans mon cas 1615134559_2021_03_07_13.9.2_gitlab_backup.tar


On sauvegarde également deux fichiers primordiaux : gitlab-secrets.json et gitlab.rb qui se trouvent par défaut dans /etc/gitlab/. Pour ma part en docker, je les avais placé (volume) dans /srv/gitlab/config.

Migration

Plusieurs méthodes s'offrent à vous, pour ma part j'ai choisi d'utiliser Rsync pour transférer ma sauvegarde Gitlab d'un serveur vers un autre :

sudo rsync -a /srv/gitlab/data/backups1615134559_2021_03_07_13.9.2_gitlab_backup.tar <user>@<host>:/<choosen>/<path>/

Songez également à transférer vos fichiers de configuration :

sudo rsync -a /srv/gitlab/config/gitlab-secrets.json /srv/gitlab/config/gitlab.rb <user>@<host>:/<choosen>/<path>/

Nouvelle instance en Docker

Je ne vais pas détailler ici le déploiement et la configuration de Gitlab en Docker, pour cela reportez-vous à la documentation dédiée. Il vous faudra adapter celui-ci à vos besoins.

Cependant pour votre nouvelle instance, assurez-vous de la démarrer en spécifiant les fichiers gitlab-secrets.json et gitlab.rb en les montant en volume.

Je précise que je rends accessible le frontend de Gitlab grâce à un container linuxserver/SWAG que je vous recommande.

Ceci dit, je partage avec vous mon fichier de docker-compose.yml pour plus de transparence :

version: '3'

services:
   gitlab:
     image: 'gitlab/gitlab-ce:latest'
     container_name: gitlab
     restart: always
     stdin_open: true
     tty: true
     hostname: 'git.domain.tld'
     environment:
       GITLAB_OMNIBUS_CONFIG: |
         external_url 'https://git.domain.tld'

         ## Nginx
         #nginx['enable'] = true
         #nginx['listen_port'] = 80
         nginx['listen_https'] = true
         #nginx['redirect_http_to_https'] = true

         gitlab_rails['gitlab_shell_ssh_port'] = 2201
         gitlab_rails['packages_enabled'] = true

         letsencrypt['enable'] = false
         prometheus['enable'] = false

         ## Mail / SMTP       
         gitlab_rails['smtp_enable'] = true
         gitlab_rails['smtp_address'] = "mail.domain.tld"
         gitlab_rails['smtp_port'] = 587
         gitlab_rails['smtp_user_name'] = "contact@domain.tld"
         gitlab_rails['smtp_password'] = "password"
         gitlab_rails['smtp_domain'] = "mail.domain.tld"
         gitlab_rails['smtp_authentication'] = "login"
         #gitlab_rails['smtp_enable_starttls_auto'] = true
         gitlab_rails['smtp_tls'] = true
         gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
         gitlab_rails['gitlab_email_from'] = 'contact@domain.tld'
         gitlab_rails['gitlab_email_reply_to'] = 'noreply@domain.tld'

         gitlab_rails['backup_keep_time'] = 604800

         ## Redis
         redis['port'] = 6379
         redis['bind'] = '127.0.0.1'

         ## Registry
         registry['enable'] = true
         gitlab_rails['registry_enabled'] = true
         registry_nginx['enable'] = true
         gitlab_rails['registry_host'] = "https://registry.domain.tld"
         registry_external_url 'https://registry.domain.tld'
         registry_nginx['listen_port'] = 5050
         registry_nginx['listen_https'] = true
         registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.pem"
         registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/privkey.pem"

     ports:
       - '2201:22'
       - '4443:443'
       - '5000:5000'
       - '5050:5050'
       - '8880:80'

     volumes:
       ## Current volumes
       - '/srv/gitlab/config:/etc/gitlab' # config
       - '/srv/gitlab/logs:/var/log/gitlab' # logs
       - '/srv/gitlab/data:/var/opt/gitlab' # data

       ## Certs and Cron
       - './cert/fullchain.pem:/etc/gitlab/ssl/fullchain.pem' # certs (registry) ln -s from SWAG
       - './cert/privkey.pem:/etc/gitlab/ssl/privkey.pem' # certs (registry) 
       - './cron/registry-garbage-collect:/etc/cron.d/registry-garbage-collect' # cron garbage-collector
       
       ## Backups
       - ./backups:/var/opt/gitlab/backups # all applications and backups
       - ./secret:/secret/gitlab/backups # secrets

     networks:
       - <network>

   runner:
     image: 'gitlab/gitlab-runner:latest'
     container_name: gitlab-runner
     restart: always
     stdin_open: true
     tty: true
     depends_on:
      - gitlab
     volumes:
       - '/srv/gitlab-runner/config:/etc/gitlab-runner'
       - '/var/run/docker.sock:/var/run/docker.sock'
     networks:
       - <network>

networks:
  <network>:
    external:
      name: <network>

Restauration

On arrête tous les processus qui sont actuellement connectés à la base de données:

  • On arrête unicorn :
docker exec -it <container> gitlab-ctl stop unicorn
  • On arrête puma :
docker exec -it <container> gitlab-ctl stop puma
  • On arrête sidekiq :
docker exec -it <container> gitlab-ctl stop sidekiq

Chaque commande devrait vous retourner un ok: down: <processus>: 0s, normally up

On s'assure que tous les processus sont bien arrêtés:

  • On vérifie leur status:
docker exec -it <container> gitlab-ctl status

Vous obtiendrez la liste des processus en cours et arrêtés (sidekiq, puma et unicorn)

Si tout est arrêté, on lance la restauration:

  • On restaure la sauvegarde en précisant le fichier (sans son extension _gitlab_backup.tar):
docker exec -it <container> gitlab-backup restore BACKUP=1615134559_2021_03_07_13.9.2

On patiente poliment, ça peut être également long..

  • Une fois terminé, on redémarre !
docker restart <container>
  • On vérifie le tout
docker exec -it <container> gitlab-rake gitlab:check SANITIZE=true

Et voilà ! Vous avez migré facilement et proprement votre Gitlab, félicitations !

Sources