GitlabCEをUbuntuサーバーにインストールしたときの備忘録。
テスト的なので、サーバーの少ないメモリ/CPUで動かした時の記録です。
今回、カゴヤ・ジャパンのVPSに入れました。
GitLabCEとは
GitLabCEとは、たくさんの人が無料でも使える、GitHubの機能を、ローカルなサーバー、もしくは、クラウド上のサーバーに独自に設定できるもので、容量も気にしないで、使いたい放題。セキュリティーも設定次第、無償で使えるという、非常に魅力的なパッケージです。
Ubuntu 18.04 初期設定
# cat /etc/os-release NAME="Ubuntu" VERSION="18.04.3 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.3 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic
↑Ubuntu 18.04のバージョンに入れます。
# apt update Hit:1 http://jp.archive.ubuntu.com/ubuntu bionic InRelease Hit:2 http://jp.archive.ubuntu.com/ubuntu bionic-updates InRelease Hit:3 http://jp.archive.ubuntu.com/ubuntu bionic-backports InRelease Hit:4 http://security.ubuntu.com/ubuntu bionic-security InRelease Reading package lists... Done Building dependency tree Reading state information... Done 195 packages can be upgraded. Run 'apt list --upgradable' to see them.
↑パッケージのアップデート情報を取得します。
# apt upgrade Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following NEW packages will be installed: (略) 195 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. Need to get 248 MB of archives. After this operation, 377 MB of additional disk space will be used. Do you want to continue? [Y/n] (略) /etc/kernel/postinst.d/zz-update-grub: Sourcing file `/etc/default/grub' Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.15.0-134-generic Found initrd image: /boot/initrd.img-4.15.0-134-generic Found linux image: /boot/vmlinuz-4.15.0-74-generic Found initrd image: /boot/initrd.img-4.15.0-74-generic Found linux image: /boot/vmlinuz-4.4.0-171-generic Found initrd image: /boot/initrd.img-4.4.0-171-generic done Processing triggers for ca-certificates (20201027ubuntu0.18.04.1) ... Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done.
↑パッケージを実際にアップデートします。
# cat /etc/os-release NAME="Ubuntu" VERSION="18.04.5 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.5 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic
↑アップデートされました。
GitlabCE インストール
基本ソフトを入れていきます
# apt install ca-certificates curl openssh-server postfix Reading package lists... Done Building dependency tree Reading state information... Done ca-certificates is already the newest version (20201027ubuntu0.18.04.1). curl is already the newest version (7.58.0-2ubuntu3.12). openssh-server is already the newest version (1:7.6p1-4ubuntu0.3). The following packages were automatically installed and are no longer required: linux-image-4.4.0-171-generic linux-modules-4.4.0-171-generic linux-modules-extra-4.4.0-171-generic Use 'apt autoremove' to remove them. The following additional packages will be installed: ssl-cert (略)
↑Postfixの設定を指定します。
After modifying main.cf, be sure to run 'service postfix reload'. Running newaliases Processing triggers for ureadahead (0.100.0-21) ... Processing triggers for systemd (237-3ubuntu10.44) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for rsyslog (8.32.0-1ubuntu4) ... Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ... Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
↑基本的なソフトが入りました。
# cd /tmp # curl -LO https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5933 100 5933 0 0 12623 0 --:--:-- --:--:-- --:--:-- 12623 # ls -al script.deb.sh -rw-r--r-- 1 root root 5933 Jan XX XX:XX script.deb.sh # bash script.deb.sh Detected operating system as Ubuntu/bionic. Checking for curl... Detected curl... Checking for gpg... Detected gpg... Running apt-get update... done. Installing apt-transport-https... done. Installing /etc/apt/sources.list.d/gitlab_gitlab-ce.list...done. Importing packagecloud gpg key... done. Running apt-get update... done. The repository is setup! You can now install packages.
↑リポジトリの設定が完了しました。
# apt install gitlab-ce Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: linux-image-4.4.0-171-generic linux-modules-4.4.0-171-generic linux-modules-extra-4.4.0-171-generic Use 'apt autoremove' to remove them. The following NEW packages will be installed: gitlab-ce 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. (略) Setting up gitlab-ce (13.8.1-ce.0) ... It looks like GitLab has not been configured yet; skipping the upgrade script. *. *. *** *** ***** ***** .****** ******* ******** ******** ,,,,,,,,,***********,,,,,,,,, ,,,,,,,,,,,*********,,,,,,,,,,, .,,,,,,,,,,,*******,,,,,,,,,,,, ,,,,,,,,,*****,,,,,,,,,. ,,,,,,,****,,,,,, .,,,***,,,, ,*,. _______ __ __ __ / ____(_) /_/ / ____ _/ /_ / / __/ / __/ / / __ `/ __ \ / /_/ / / /_/ /___/ /_/ / /_/ / \____/_/\__/_____/\__,_/_.___/ Thank you for installing GitLab! GitLab was unable to detect a valid hostname for your instance. Please configure a URL for your GitLab instance by setting `external_url` configuration in /etc/gitlab/gitlab.rb file. Then, you can start your GitLab instance by running the following command: sudo gitlab-ctl reconfigure
↑GitLabCEが入りました。
GitLabCE 設定、メモリエラー
# vi /etc/gitlab/gitlab.rb external_url 'https://gitlab.example.com' ↓ external_url 'http://(FQDN)'
↑初期設定をします。
# gitlab-ctl reconfigure
↑GitlabCEで、構成を変える場合、gtlab-ctlで、変更をします。
また、gitlabの状態は、↓以下のコマンドで、確認をします。
# gitlab-ctl status # gitlab-ctl tail
System Info: ------------ chef_version=15.14.0 platform=ubuntu platform_version=18.04 ruby=ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] program_name=/opt/gitlab/embedded/bin/chef-client executable=/opt/gitlab/embedded/bin/chef-client Running handlers: There was an error running gitlab-ctl reconfigure: Cannot allocate memory - fork(2) Running handlers complete Chef Infra Client failed. 0 resources updated in 06 seconds
↑「gitlab-ctl reconfigure」をしたところ、エラー!
サーバーの実メモリが少なくエラーとなりました。
Running handlers: There was an error running gitlab-ctl reconfigure: Multiple failures occurred: * Chef::Exceptions::MultipleFailures occurred in Chef Infra Client run: Multiple failures occurred: * Errno::ENOMEM occurred in delayed notification: ruby_block[reload_log_service] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/runit/libraries/provider_runit_service.rb line 73) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: ruby_block[restart_log_service] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/runit/libraries/provider_runit_service.rb line 65) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: execute[clear the gitlab-rails cache] (gitlab::gitlab-rails line 440) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[gitaly] (gitaly::enable line 101) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: execute[reload all sysctl conf] (package::sysctl line 18) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[gitlab-workhorse] (gitlab::gitlab-workhorse line 61) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[node-exporter] (monitoring::node-exporter line 52) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[gitlab-exporter] (monitoring::gitlab-exporter line 65) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[redis-exporter] (monitoring::redis-exporter line 41) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2) * Errno::ENOMEM occurred in delayed notification: runit_service[prometheus] (monitoring::prometheus line 87) had an error: Errno::ENOMEM: Cannot allocate memory - fork(2)
↑上記も、サーバーの実メモリが少なくエラーとなっています。
↑2Gのメモリでは、初期設定自体も難しい・・・
コンソールでの作業も、反応が遅い・・・
3Gにスケールアップして、作業をします。
GitLabCE 設定、メモリアップ後、設定
# gitlab-ctl reconfigure Recipe: nginx::enable * runit_service[nginx] action restart (up to date) (略) Running handlers: Running handlers complete Chef Infra Client finished, 9/790 resources updated in 15 seconds gitlab Reconfigured!
↑3Gであれば、設定関係はエラーにならない
http://(FQDN)/
↑ブラウザでサイトにアクセスします。
↑初期設定、パスワードの設定から行います。
↑パスワードが設定されました
「root」と設定したパスワードで入ります。
↓日本語環境にします。
↑画面右上のメニューから、「Settings」を選びます。
↑「Preferences」を選びます。
↑日本語にします。
↑日本語になりました。
↓ユーザ名の変更をします。
↑rootというユーザ名を変更する場合、ここで、変更をします。
セキュリティ上、変更をしておいたほうがいいかもしれません。
ubuntu firewall設定
# ufw status Status: inactive
↑firewallが動いていません
# ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
↑firewallを稼働させます
ufw allow http ufw allow https ufw allow OpenSSH # ufw allow http Rule added Rule added (v6) # ufw allow https Rule added Rule added (v6) # ufw allow OpenSSH Rule added Rule added (v6)
↑80,443,ssh のポートを空けます。
# ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere OpenSSH ALLOW Anywhere 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) OpenSSH (v6) ALLOW Anywhere (v6)
↑firewallの設定ができました。
SSL nginxなどの設定
gitlab-ceは、基本、nginxで稼働しますが、nginxの設定ファイルを直接変更すると、
「gitlab-ctl reconfigure」と、設定更新をしたときに、元に戻ります。
Gitlabceは、Chef で環境を設定しているので、
基本的に、
/etc/gitlab/gitlab.rb
を変更して
「gitlab-ctl reconfigure」
すると、nginxの設定も変更されます。
vi /etc/gitlab/gitlab.rb external_url 'http://(FQDN)' ↓ external_url 'https://(FQDN)'
↑SSLにします。
# nginx['enable'] = true # nginx['client_max_body_size'] = '250m' # nginx['redirect_http_to_https'] = false # nginx['redirect_http_to_https_port'] = 80 ↓ nginx['enable'] = true nginx['client_max_body_size'] = '250m' nginx['redirect_http_to_https'] = true nginx['redirect_http_to_https_port'] = 80
↑Nginxの設定をします。
# nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt" # nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key" ↓ nginx['ssl_certificate'] = "/etc/gitlab/ssl/(FQDN).crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/(FQDN).key"
↑Let’s Certificateの設定をします。
# letsencrypt['enable'] = nil # letsencrypt['contact_emails'] = [] # This should be an array of email addresses to add as contacts ↓ letsencrypt['enable'] = true letsencrypt['contact_emails'] = ['(メールアドレス)']
↑Let’s Certificateの通知メールアドレスを設定します。
# letsencrypt['auto_renew'] = true # letsencrypt['auto_renew_hour'] = 0 # letsencrypt['auto_renew_minute'] = nil # Should be a number or cron expression, if specified. # letsencrypt['auto_renew_day_of_month'] = "*/4" ↓ letsencrypt['auto_renew'] = true letsencrypt['auto_renew_hour'] = 0 letsencrypt['auto_renew_minute'] = 30 # Should be a number or cron expression, if specified. letsencrypt['auto_renew_day_of_month'] = "*/4"
↑Let’s Certificateの更新間隔を設定します。
# gitlab-ctl reconfigure (略) Recipe: crond::enable * runit_service[crond] action restart (up to date) Running handlers: Running handlers complete Chef Infra Client finished, 87/985 resources updated in 01 minutes 09 seconds gitlab Reconfigured!
↑更新されて、
https://(FQDN)/
と、SSL(https)でアクセスができるようになりました。
GitLabCE、メモリ/CPU節約
画面上で操作をしていると、メモリが足りなくなってきて、操作が重くなります。
デフォルトのGitlabCE では、大規模管理を想定していて、最低4G程度のメモリを必要とするようです。
今回、3Gでも、(テスト的な動作であれば)快適に動くように設定をします。
vi /etc/gitlab/gitlab.rb # gitlab_rails['db_prepared_statements'] = false ↓ gitlab_rails['db_prepared_statements'] = false # unicorn['worker_processes'] = 2 ↓ unicorn['worker_processes'] = 3 ↑サーバーのコア数に合わせます # postgresql['shared_buffers'] = "256MB" ↓ postgresql['shared_buffers'] = "256MB"
puma のメモリ食い
# ps aux --sort rss |grep puma root 1708 0.0 0.0 4404 680 ? Ss Jan27 0:00 runsv puma root 1742 0.0 0.0 4548 700 ? S Jan27 0:00 svlogd -tt /var/log/gitlab/puma git 30735 2.5 22.5 1146792 692408 ? Ssl 11:44 0:41 puma 5.1.1 (unix:///var/opt/gitlab/gitlab-rails/sockets/gitlab.socket,tcp://127.0.0.1:8080) [gitlabpuma-worker] git 30838 1.1 25.0 1347920 769948 ? Sl 11:45 0:17 puma: cluster worker 0: 30735 [gitlab-puma-worker] git 30840 1.2 25.6 1404496 787416 ? Sl 11:45 0:19 puma: cluster worker 1: 30735 [gitlab-puma-worker]
↑puma 関係が、たくさんのメモリを使っているようです・・・
puma は、Unicorn から置き換わったサービス。メモリを食いますが・・・
3Gメモリ、仮想CPU3コアでは、画面上の切り替えがもたつく(遅い)場合があります。
# puma['enable'] = true # puma['ha'] = false # puma['worker_timeout'] = 60 # puma['worker_processes'] = 2 # puma['min_threads'] = 4 # puma['max_threads'] = 4 ↓ puma['enable'] = true puma['ha'] = false puma['worker_timeout'] = 60 puma['worker_processes'] = 1 puma['min_threads'] = 2 puma['max_threads'] = 2
↑の小さな構成にしてみます・・・・
「worker_processes」が「1」です。
大規模なgitlabサービスには、不向きでしょう。
「worker_processes」は、
2
もしくは
cpu コア数 – 1
の多い方。という指針がありますので、「1」は、逸脱しています(汗)。
prometheusの停止
gitlabは、prometheusが利用できるモニタリング情報を提供している。
「http://サーバー:9090」と、直接アクセスするか
https://grafana.com/
などの外部ツールを利用することができます。
# ps aux --sort rss|grep prometheus root 16236 0.0 0.0 4404 780 ? Ss 09:41 0:00 runsv prometheus root 16237 0.0 0.0 4548 788 ? S 09:41 0:00 svlogd -tt /var/log/gitlab/prometheus git 1786 0.0 0.8 2180092 24828 ? Ssl Jan27 0:25 /opt/gitlab/embedded/bin/gitlab-workhorse -listenNetwork unix -listenUmask 0 -listenAddr /var/opt/gitlab/gitlab-workhorse/sockets/socket -authBackend http://localhost:8080 -authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket -documentRoot /opt/gitlab/embedded/service/gitlab-rails/public -pprofListenAddr -prometheusListenAddr localhost:9229 -secretPath /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret -logFormat json -config config.toml gitlab-+ 16238 2.0 5.8 1663788 179428 ? Ssl 09:41 0:07 /opt/gitlab/embedded/bin/prometheus --web.listen-address=localhost:9090 --storage.tsdb.path=/var/opt/gitlab/prometheus/data --config.file=/var/opt/gitlab/prometheus/prometheus.yml
↑起動中のプロセス。メモリ 5.8%。CPU 2.0%。今回「prometheus」を停止してみます。
#prometheus_monitoring['enable'] = false ↓ prometheus_monitoring['enable'] = false
とします。
# ps aux --sort rss|grep prometheus root 26360 0.0 0.0 14172 1024 pts/0 S+ 11:10 0:00 grep --color=auto prometheus git 1786 0.0 0.7 2180092 22164 ? Ssl Jan27 0:29 /opt/gitlab/embedded/bin/gitlab-workhorse -listenNetwork unix -listenUmask 0 -listenAddr /var/opt/gitlab/gitlab-workhorse/sockets/socket -authBackend http://localhost:8080 -authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket -documentRoot /opt/gitlab/embedded/service/gitlab-rails/public -pprofListenAddr -prometheusListenAddr localhost:9229 -secretPath /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret -logFormat json -config config.toml
↑prometheus が停止されました。
「runsv prometheus」というプロセスが無くなりました。
sidekiq
# sidekiq['max_concurrency'] = 50 # sidekiq['min_concurrency'] = nil ↓ sidekiq['max_concurrency'] = 10 sidekiq['min_concurrency'] = 1
↑sidekiqは、並列に処理してくれるツールですが、この最大値を低くしておきます。
CPU節約の推移
↑上は、メモリの推移です。様々な設定をすると、確実にCPUの消費量が減って来ています。
上記は、カゴヤ・ジャパン のコントロールパネルのCPU使用の推移グラフです。
GitlabCEまとめ 最小限のサーバーで・・・
これで、カゴヤ・ジャパン の仮想3core/3ギガで、pull/pushなどが、なんとかできる感じです。
本格的に利用するには、4ギガ以上のメモリが必要でしょう。