Thank you for reading this post, don't forget to subscribe!
Оригинал статьи:
Имеется GitLab версии 7.4.1, установленную из исходников. Необходимо обновить его до актуальной версии с переносом всех данных.
План действия следующий:
- Установить на новый сервер GitLab той же версии, что стоит на старом сервере
- На старом сервере сделать бэкап данных средствами GitLab
- Развернуть бэкап на новом сервере
- Обновить GitLab до актуальной версии
Установить на новый сервер GitLab той же версии, что стоит на старом сервере
Добавляем репозиторий EPEL и обновляемся
1 2 |
[root@localhost]# yum -y install epel-release [root@localhost]# yum update |
Ставим софт
1 2 |
[root@localhost]# yum -y install curl openssh-server openssh-clients postfix policycoreutils-python [root@localhost]# yum -y install mc nano wget htop git rsync p7zip ntpdate |
Отключаем SeLinux
1 2 3 |
[root@localhost]# setenforce 0 [root@localhost]# nano /etc/selinux/config SELINUX=disabled |
На новом сервере ставим gitlab той же версии, что и на старом сервере
Архивы старых версий: https://about.gitlab.com/downloads/archives/
Скачиваем дистрибутив и устанавливаем его
1 2 3 |
[root@localhost]# cd /home [root@localhost]# wget https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.4.1_omnibus-1.el7.x86_64.rpm [root@localhost]# rpm -ivh gitlab-7.4.1_omnibus-1.el7.x86_64.rpm |
- i — Установить пакет
- v — показать отладочную информацию
- h — выводить хэш-меток при установке
Добавляем правила в firewall
1 2 3 |
[root@localhost]# firewall-cmd --permanent --add-service=http [root@localhost]# firewall-cmd --permanent --add-service=https [root@localhost]# firewall-cmd --reload |
Редактируем файл gitlab.rb для последующей генерации конфига gitlab
1 2 3 |
[root@localhost]# cd /etc/gitlab/ [root@localhost]# nano gitlab.rb external_url 'http://git.sitename.ru' |
Пример файла gitlab.rb, в котором подключена LDAP-авторизация и настроено подключение к почтовому серверу
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
[root@localhost]# cat gitlab.rb ## GitLab URL ##! URL on which GitLab will be reachable. ##! For more details on configuring external_url see: ##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab external_url 'http://git.sitename.ru' ### Email Settings gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'noreply@sitename.ru' gitlab_rails['gitlab_email_display_name'] = 'noreply' gitlab_rails['gitlab_email_reply_to'] = 'noreply@sitename.ru' # gitlab_rails['gitlab_email_subject_suffix'] = '' ### LDAP Settings ###! Docs: https://docs.gitlab.com/omnibus/settings/ldap.html ###! **Be careful not to break the indentation in the ldap_servers block. It is ###! in yaml format and the spaces must be retained. Using tabs will not work.** gitlab_rails['ldap_enabled'] = true ###! **remember to close this block with 'EOS' below** gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' main: # 'main' is the GitLab 'provider ID' of this LDAP server label: 'LDAP' host: '192.168.0.6' port: 389 uid: 'sAMAccountName' bind_dn: 'CN=Admin,CN=Users,DC=domain,DC=local' password: 'password' # timeout: 10 encryption: 'plain' # "start_tls" or "simple_tls" or "plain" # verify_certificates: true active_directory: true # allow_username_or_email_login: false # lowercase_usernames: false # block_auto_created_users: false base: 'OU=Users,OU=Office,DC=domain,DC=local' user_filter: '' # attributes: # username: ['uid', 'userid', 'sAMAccountName'] # email: ['mail', 'email', 'userPrincipalName'] # name: 'cn' # first_name: 'givenName' # last_name: 'sn' # ## EE only # group_base: '' # admin_group: '' # sync_ssh_keys: false # # secondary: # 'secondary' is the GitLab 'provider ID' of second LDAP server # label: 'LDAP' # host: '_your_ldap_server' # port: 389 # uid: 'sAMAccountName' # bind_dn: '_the_full_dn_of_the_user_you_will_bind_with' # password: '_the_password_of_the_bind_user' # encryption: 'plain' # "start_tls" or "simple_tls" or "plain" # verify_certificates: true # active_directory: true # allow_username_or_email_login: false # lowercase_usernames: false # block_auto_created_users: false # base: '' # user_filter: '' # ## EE only # group_base: '' # admin_group: '' # sync_ssh_keys: false EOS ### Backup Settings ###! Docs: https://docs.gitlab.com/omnibus/settings/backups.html #gitlab_rails['manage_backup_path'] = true #gitlab_rails['backup_path'] = "/mnt/nfs" ###! Docs: https://docs.gitlab.com/ce/raketasks/backup_restore.html#backup-archive-permissions # gitlab_rails['backup_archive_permissions'] = 0644 # gitlab_rails['backup_pg_schema'] = 'public' ###! The duration in seconds to keep backups before they are allowed to be deleted #gitlab_rails['backup_keep_time'] = 604800 # localhost # gitlab_rails['smtp_enable'] = true; # gitlab_rails['smtp_address'] = 'localhost'; # gitlab_rails['smtp_port'] = 25; ## gitlab_rails['smtp_user_name'] = "root" ## gitlab_rails['smtp_password'] = "password" # gitlab_rails['smtp_domain'] = 'localhost'; ## gitlab_rails['smtp_authentication'] = "login" # gitlab_rails['smtp_tls'] = false; # gitlab_rails['smtp_openssl_verify_mode'] = 'none' # gitlab_rails['smtp_enable_starttls_auto'] = false # gitlab_rails['smtp_ssl'] = false # gitlab_rails['smtp_force_ssl'] = false # mx.sitename.ru gitlab_rails['smtp_enable'] = true; gitlab_rails['smtp_address'] = 'mx.sitename.ru'; gitlab_rails['smtp_port'] = 587; gitlab_rails['smtp_user_name'] = 'noreply'; gitlab_rails['smtp_password'] = 'passwopd'; gitlab_rails['smtp_domain'] = 'sitename.ru'; gitlab_rails['smtp_authentication'] = 'login'; gitlab_rails['smtp_tls'] = false; gitlab_rails['smtp_enable_starttls_auto'] = true; gitlab_rails['smtp_openssl_verify_mode'] = 'none'; #gitlab_rails['smtp_ssl'] = true; #gitlab_rails['smtp_force_ssl'] = true; |
[/codesyntax]
Генерируем конфиг
1 |
[root@localhost]# sudo gitlab-ctl reconfigure |
Запускаем gitlab
1 |
[root@localhost]# sudo gitlab-ctl start |
Открываем браузер:
1 2 3 |
http://192.168.1.49 login: root password: 5iveL!fe |
Авторизуемся, меняем пароль
На старом сервере сделать бэкап данных средствами GitLab
У меня не делался бэкап, т.к. скрипту не нравилась версия psql, делаем линк на версию посвежее, которая была уже установлена на сервере
1 |
[root@localhost]# ln -s /usr/pgsql-9.3/bin/pg_dump /usr/bin/pg_dump --force |
Делаем бэкап
1 2 |
[root@localhost]# cd /home/git/gitlab [root@localhost]# bundle exec rake gitlab:backup:create RAILS_ENV=production; |
- Файлы бэкапа на старом сервере: /home/git/gitlab/tmp/backups
Переносим файл бэкапа со старого сервера на новый
- Файлы бэкапа на новом сервере: /var/opt/gitlab/backups
Развернуть бэкап на новом сервере
Останавливаем службы
1 2 3 |
[root@localhost]# sudo gitlab-ctl stop unicorn [root@localhost]# sudo gitlab-ctl stop sidekiq [root@localhost]# sudo gitlab-ctl status |
Развертывание резервной копии на новом сервере
1 |
[root@localhost]# sudo gitlab-rake gitlab:backup:restore BACKUP=1526552248 |
или
1 |
[root@localhost]# sudo gitlab-rake gitlab:backup:restore RAILS_ENV=production |
Запускаем службы
1 2 3 |
[root@localhost]# gitlab-ctl start unicorn [root@localhost]# gitlab-ctl start sidekiq [root@localhost]# gitlab-ctl status |
В процессе развертывания произошла ошибка. Из бэкапа не развернулись пустые проекты, по-этому вначале их надо удалить, потом делать бэкап.
Так же можно перенести вручную все то, что не перенеслось после:
1 |
[root@localhost]# git clone --mirror /var/opt/gitlab/backups/repositories/%username%/%project%.bundle /var/opt/gitlab/git-data/repositories/%username%/%project%.git |
Меняем владельца директории
1 |
[root@localhost]# chown -R git:git /var/opt/gitlab/git-data/repositories |
Пробуем сделать бэкап на новом сервере и развернуть его
Делаем бэкап
1 |
[root@localhost]# sudo gitlab-rake gitlab:backup:create |
Останавливаем службы
1 2 3 |
[root@localhost]# gitlab-ctl stop unicorn [root@localhost]# gitlab-ctl stop sidekiq [root@localhost]# gitlab-ctl status |
Разворачиваем бэкап
1 |
[root@localhost]# sudo gitlab-rake gitlab:backup:restore BACKUP=1526552248 |
Запускаем службы
1 2 3 |
[root@localhost]# gitlab-ctl start unicorn [root@localhost]# gitlab-ctl start sidekiq [root@localhost]# gitlab-ctl status |
Обновить GitLab до актуальной версии
Т.к. у нас версия довольно старая, обновляться будем по следующей цепочке:
7.4.1 -> 7.14.x -> 8.0.x -> 8.17.x -> 9.0 -> 9.5 -> 10.0 -> 10.7 -> 10.8.3
Скачиваем дистрибутив версии 7.14.2
1 |
[root@localhost]# wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-7.14.2-ce.1.el7.x86_64.rpm/download.rpm |
Обновляем
1 |
[root@localhost]# rpm -Uvh gitlab-ce-7.14.2-ce.1.el7.x86_64.rpm |
- U — обновить пакет
- v — показать отладочную информацию
- h — выводить хэш-меток при установке
Перезапускаем
1 |
[root@localhost]# sudo gitlab-ctl restart |
И так далее
Открываем доступ к GitLab снаружи
Т.к. у нас ограниченное количество внешних IP-адресов, и т.к. наш GitLab крутится на отдельном виртуальном сервере, настраиваем проброс портов, что бы у нас был доступ к GitLab снаружи
На сервере, где прописан внешний IP, надо перенастроить ssh, iptables, apache
Настраиваем ssh
1 2 3 |
[root@localhost]# cat /etc/ssh/sshd_config ListenAddress 192.168.1.38 [root@localhost]# service ssh restart |
теперь доступ к этому серверу по ssh только внутри сети
Настраиваем Настраиваем iptables, пробрасываем порт 22
1 2 3 4 5 |
[root@localhost]# iptables -A FORWARD -d 192.168.1.49 -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT [root@localhost]# iptables -t nat -A PREROUTING -d внешний_IP -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.1.49:22 [root@localhost]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE [root@localhost]# service iptables save [root@localhost]# service iptables reload |
Еще надо закомментировать одно правило, иначе проброс не сработает
1 |
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited |
Настраиваем apache, пробрасываем 80 и 443 порт:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[root@localhost]# cat /etc/httpd/virtual/git.sitename.ru.conf ServerName git.sitename.ru ServerSignature Off ProxyPreserveHost On Redirect / https://git.sitename.ru/ ServerName git.sitename.ru ServerSignature Off Order deny,allow Allow from all ProxyPassReverse http://192.168.1.49:80 ProxyPassReverse http://git.sitename.ru/ SSLEngine on SSLCertificateFile /etc/httpd/ssl/sitename.ru/certificate.crt SSLCertificateKeyFile /etc/httpd/ssl/sitename.ru/private.key SSLProxyEngine On SSLProxyCheckPeerCN on SSLProxyCheckPeerExpire on RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule .* http://192.168.1.49:80%{REQUEST_URI} [P,QSA] RequestHeader set X_FORWARDED_PROTO 'https' ErrorLog /var/www/vhosts/git.sitename.ru/logs/error_ssl.log CustomLog /var/www/vhosts/git.sitename.ru/logs/access_ssl.log combined |
[/codesyntax]
Перезапускаем apache
1 |
[root@localhost]# service httpd restart |