Перед началом небольшого изложения по данной теме, сразу хочу внести ясность, что здесь будет по большей части переписывание оф. документации с моими комментариями и пояснениями, с какими проблемами я столкнулся по ходу дела.
Всё началось с того, что в моё поле зрения попал сервер Gitlab, который не имел бэкапы на внешних серверах, а только локально. Но это пол беды. Большая проблема была в том, что рейд, где крутился данный сервер, начал потихоньку сыпаться и была поставлена задача по срочной миграции всех данных на новый сервер.
Так как я не имел до этого вообще опыта работы по установке\переносу Gitlab, было решено разобраться и для себя написать данный материал, который может кому-то пригодится в похожих случаях.
Итак, мною было обнаружено, что локальный бэкап есть – он выполняется по крону командой
/opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
А сами бэкапы лежат по дефолтному пути
ls -lh /var/opt/gitlab/backups/
-rw------- 1 git git 1,1G авг 8 21:03 1565287382_2019_08_08_10.7.3_gitlab_backup.tar
-rw------- 1 git git 1,1G авг 9 21:03 1565373792_2019_08_09_10.7.3_gitlab_backup.tar
-rw------- 1 git git 1,1G авг 10 21:03 1565460163_2019_08_10_10.7.3_gitlab_backup.tar
-rw------- 1 git git 1,1G авг 11 21:02 1565546553_2019_08_11_10.7.3_gitlab_backup.tar
-rw------- 1 git git 1,1G авг 12 21:04 1565633008_2019_08_12_10.7.3_gitlab_backup.tar
-rw------- 1 git git 1,1G авг 14 21:44 1565808092_2019_08_14_10.7.3_gitlab_backup.tar
Оставалось надеяться, что архивы не с битыми данными. Далее я их быстро перенёс на новый ресурс, где не спеша уже начал развёртывание нового Gitlab.
Для восстановления из копии, предварительно нужна чистая установка аналогичной версии, которую надо восстановить из бэкапа. В моём случае это был Gitlab CE v10.7.3
Установка на Centos 7 1806
Далее всё стандартно и описано в оф. документации. Ставятся зависимости:
yum install -y curl policycoreutils-python postfix
Репозиторий:
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
Указание домена и всё в одном пакете нужной версии, как в бэкапе (примерно около 1 гб объемом):
EXTERNAL_URL="http://gitlab.domain.ru" yum install gitlab-ce-10.7.3
А далее уже в браузере открыть и проверять, что морда открылась и просит пароль рута.
TLS-соединение в моём случае будет терминироваться на отдельном прокси-сервере, конфигурационный файл сделал такой, с редиректом на https:
server {
server_name gitlab.domain.ru;
listen 80;
return 301 https://$server_name$request_uri;
}
server {
server_name gitlab.domain.ru;
ssl_certificate "/etc/nginx/ssl/cert_ru.crtca";
ssl_certificate_key "/etc/nginx/ssl/cert.ru.key";
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
access_log /var/log/nginx/gitlab.domain.ru.access.log;
error_log /var/log/nginx/gitlab.domain.ru.error.log;
listen 443 ssl http2;
location / {
proxy_pass http://10.10.4.17:8081;
proxy_redirect off;
proxy_read_timeout 300;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
В процессе установки столкнулся с проблемой: изначально по ошибке установил gitlab-ee, а не gitlab-ce, причём последней версии. Удалил и продолжил установку нужной мне версии, но в конце ничего не стартовало, и я сломал голову, что же было не так.
Не буду описывать ошибки, т.к. их лучше и проще избежать – перед установкой нужно убедиться, что до этого старые версии или кривые установки отсутствовали или же выпилить лишние директории, которые остаются после удаления пакетов старых версий:
rm -rf /opt/gitlab
rm -rf /var/opt/gitlab
После этого успешно отработало перечитывание конфигурации gitlab командой
gitlab-ctl reconfigure
а после всё успешно стартовало (за искл. пары сервисов, их в счёт не берем, т.к. они не используются)
gitlab-ctl start
gitlab-ctl status
down: alertmanager: 1s, normally up, want up; run: log: (pid 3944) 7789s
run: gitaly: (pid 22584) 5552s; run: log: (pid 3928) 7789s
run: gitlab-monitor: (pid 22594) 5552s; run: log: (pid 3936) 7789s
run: gitlab-workhorse: (pid 22606) 5552s; run: log: (pid 3932) 7789s
down: grafana: 1s, normally up, want up; run: log: (pid 3952) 7789s
run: logrotate: (pid 4123) 1950s; run: log: (pid 3934) 7789s
run: nginx: (pid 22703) 5549s; run: log: (pid 3950) 7789s
run: node-exporter: (pid 22710) 5549s; run: log: (pid 3955) 7789s
run: postgres-exporter: (pid 22716) 5549s; run: log: (pid 3940) 7789s
run: postgresql: (pid 22726) 5548s; run: log: (pid 3946) 7789s
run: prometheus: (pid 22735) 5547s; run: log: (pid 3938) 7789s
run: redis: (pid 22744) 5547s; run: log: (pid 3926) 7789s
run: redis-exporter: (pid 22749) 5547s; run: log: (pid 3942) 7789s
run: sidekiq: (pid 22755) 5546s; run: log: (pid 3948) 7789s
run: unicorn: (pid 22763) 5546s; run: log: (pid 3930) 7789s
Также в процессе решения проблем с запуском reconfigure я совсем забыл про firewalld, где нужно разрешить трафик для порта nginx, на котором он слушает (указан в /etc/gitlab/gitlab.rb).
На этом чистая установка завершена.
Развёртывание из резервной копии
Ещё раз напишу, что восстановление происходит строго на ту версию, которая была в бэкапе – в данном случае 10.7.3.
Общее восстановление происходит в автоматическом режиме, за исключением следующих файлов, которые нужно вручную скопировать со старого сервера на новый:
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb
/var/opt/gitlab/backups/1565808092_2019_08_14_10.7.3_gitlab_backup.tar # тут будет ваш бэкап
После того, как все архивные файлы на месте, нужно выполнить остановку сервисов Gitlab и убедиться в этом, что всё корректно остановилось:
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# Проверка
gitlab-ctl status
И запуск восстановления из архива, где в имени отсекается часть “_gitlab_backup.tar”:
gitlab-rake gitlab:backup:restore BACKUP=1565808092_2019_08_14_10.7.3
После успешного восстановления, проверка и запуск:
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-rake gitlab:check SANITIZE=true
На этом восстановление из резервной копии Gitlab завершено.