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.
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
- Image docker de Gitlab-ce - https://hub.docker.com/r/gitlab/gitlab-ce/
- Documentation Docker de Omnibus - https://docs.gitlab.com/omnibus/docker/
- Article sur la migration d'une instance Gitlab - https://medium.com/gits-apps-insight/migrating-gitlab-to-another-server-990092c5179
- Documentation sur la restauration en docker de Gitlab - https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-docker-image-and-gitlab-helm-chart-installations