前回のおさらい
前回は、KUSANAGI for VagrantでRuby用の環境を作成し、GitlLabのインストールまで終わりました。
今回は、GitLabの設定を行い、KUSANAGIで提供するpostgresql+pgpoo lIと、NGINXを使用するようにしてみたいと思います。
Postgresql の設定確認
現在、KUSANAGIで提供しているPostgreqlのバージョンは9.6です。これをpgpool-II-pg10 と組み合わせてコネクションプーリング(コネクション確率のオーバヘッドの減少)やデータリプリケーション、負荷分散、最大接続料制御、自動フェイルオーバーなどが可能になります。
前回実施した、kusanagi init で pgsqlを指定しているため、その際に指定したDB設定でpgpool-IIを意識することなくpostgresql DBへ接続可能です。
source export.txt
export PGPASSWORD=$DBROOTPASS
$ psql -h localhost -Upostgres
psql (9.6.14)
"help" でヘルプを表示します.
postgres=#
GitLabへの設定
KUSANAGIとGitlabには、共通するモジュールとしてNGINX/Postgresql/Ruby+Rails などがあります。いろいろ検証した結果、NGINX/Postgreql はKUSANAGIのものを試用し、Railsその他サービスをGitLabのものを使用することにします。
gitlabへの設定は、/etc/gitlab/gitlab.rb への追記で行います。Gitlabの設定マニュアル(英語)を基に以下のように/etc/gitlab/gitlab.rb の末尾に追記します。これにより、GitlabのNGINXとPostgresqlを無効にし、GitlabがKUSANAGIのPostgresqlを使用するようになります。
$ source export.txt
$ cat <<EOT | sudo tee -a /etc/gitlab/gitlab.rb > /dev/null
nginx['enable'] = false
gitlab_rails['internal_api_url'] = '$SITE_DOMAIN'
web_server['external_users'] = ['httpd']
gitlab_rails['internal_api_url'] = 'http://$SITE_DOMAIN'
postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'postgres'
gitlab_rails['db_password'] = '$DBROOTPASS'
gitlab_rails['auto_migrate'] = false
EOT
上記設定を行ったあと、root権限でgitlab-ctl reconfigure
を実行します。
NGINXの設定
最初はKUSANAGIでRails環境をprovisionしてPassengerを使用するつもりでした。しかし、GitLabに含まれるRubyとメジャーバージョンが異なり、Passengerが対応していないバージョンでした。そのため、KUSANAGIが提供する Ruby+Passenger を諦め、Gitlabのunicorn socketを利用することにしました。
nginx.conf の設定
/etc/nginx/nginx.conf の、include conf.d/*.conf
以下を削除し、以下の設定を追加しました。
$ cat nginx.tmpl
proxy_cache_path /var/cache/nginx/gitlab keys_zone=gitlab:10m max_size=1g levels=1:2;
proxy_cache gitlab;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Remove private_token from the request URI
# In: /foo?private_token=unfiltered&authenticity_token=unfiltered&rss_token=unfiltered&...
# Out: /foo?private_token=[FILTERED]&authenticity_token=unfiltered&rss_token=unfiltered&...
map $request_uri $temp_request_uri_1 {
default $request_uri;
~(?i)^(?<start>.*)(?<temp>[\?&]private[\-_]token)=[^&]*(?<rest>.*)$ "$start$temp=[FILTERED]$rest";
}
# Remove authenticity_token from the request URI
# In: /foo?private_token=[FILTERED]&authenticity_token=unfiltered&rss_token=unfiltered&...
# Out: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=unfiltered&...
map $temp_request_uri_1 $temp_request_uri_2 {
default $temp_request_uri_1;
~(?i)^(?<start>.*)(?<temp>[\?&]authenticity[\-_]token)=[^&]*(?<rest>.*)$ "$start$temp=[FILTERED]$rest";
}
# Remove rss_token from the request URI
# In: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=unfiltered&...
# Out: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=[FILTERED]&...
map $temp_request_uri_2 $filtered_request_uri {
default $temp_request_uri_2;
~(?i)^(?<start>.*)(?<temp>[\?&]rss[\-_]token)=[^&]*(?<rest>.*)$ "$start$temp=[FILTERED]$rest";
}
# A version of the referer without the query string
map $http_referer $filtered_http_referer {
default $http_referer;
~^(?<temp>.*)\? $temp;
}
upstream gitlab-unicorn {
server unix:///var/opt/gitlab/gitlab-rails/sockets/gitlab.socket;
}
include /etc/nginx/conf.d/*.conf;
}
gitlab_*.confの設定
/etc/nginx/conf.d/gitlab_http.confおよびgitlab_ssl.conf のroot
文以下を削除し、以下の設定を追加しました。gitlabの推奨設定に手を加えてあります。
$ cat gitlab_nginx.tmpl
location = /favicon.ico {
log_not_found off;
access_log off;
}
location ~* /\.well-known {
allow all;
}
location ~* /\. {
deny all;
}
location ~* \.(jpg|jpeg|gif|png|css|js|swf|ico|pdf|svg|eot|ttf|woff)$ {
expires 60d;
access_log off;
}
## https://github.com/gitlabhq/gitlabhq/issues/694
## Some requests take more than 30 seconds.
proxy_read_timeout 3600;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
location ~ (.git/git-receive-pack$|.git/info/refs?service=git-receive-pack$|.git/gitlab-lfs/objects|.git/info/lfs/objects/batch$) {
proxy_cache off;
proxy_pass http://gitlab-unicorn;
proxy_request_buffering off;
}
location /-/grafana/ {
add_header X-Signature KUSANAGI;
proxy_pass http://localhost:3000/;
}
location / {
add_header X-Signature KUSANAGI;
proxy_cache off;
proxy_pass http://gitlab-unicorn;
}
location /assets {
add_header X-Signature KUSANAGI;
proxy_cache gitlab;
proxy_pass http://gitlab-unicorn;
}
error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
location ~ ^/(404|500|502)(-custom)?\.html$ {
root /opt/gitlab/embedded/service/gitlab-rails/public;
internal;
}
}
この後、root権限でnginx -t
を実行し、問題ないことを確認します。
gitlab 画面の表示
/etc/hostsにgitlab.localdomain を追記し、ブラウザを開くと以下の画面が表示されます。
あとは、管理者権限のパスワードを打ってgitlabの作業を始めましょう。
まとめ
上記の作業をVagrantfileで実施可能です。nginxへの設定ファイルをコピーすることで省力化しています。
前回との違いは、Railsを使う必要がなくなったので、kusanagi provision で lamp環境を作成していることです。
$ cat Vagrantfile
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "primestrategy/kusanagi"
config.vm.network "forwarded_port", guest: 22, host: 8022, id: "ssh"
config.vm.network "private_network", ip: "192.168.34.21"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
# vb.gui = true
# Customize the amount of memory on the VM:
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--usb", "off"]
vb.customize ["modifyvm", :id, "--usbehci", "off"]
vb.customize ["modifyvm", :id, "--audio", "none"]
vb.customize ['modifyvm', :id, '--cableconnected1', 'on']
vb.memory = "4096"
end
config.vm.provision "file", source: "./gitlab_nginx.tmpl", destination: "/tmp/gitlab_nginx.tmpl"
config.vm.provision "file", source: "./nginx.tmpl", destination: "/tmp/nginx.tmpl"
config.vm.provision "shell", inline: <<-SHELL
cat /tmp/id_edcsa.pub >> /home/vagrant/.ssh/authorized_keys
rm /tmp/id_edcsa.pub
KUSANAGI_PASSWORD=$(mkpasswd -l 20)
DBROOTPASS=$(mkpasswd -s 0 -l 20)
SITE_DOMAIN=gitlab.localdomain
DBNAME=a$(mkpasswd -s 0 -l 10 -C 0)
DBUSER=a$(mkpasswd -s 0 -l 10 -C 0)
DBPASS=$(mkpasswd -s 0 -l 20)
cat <<EOT > export.txt
export TERM=xterm
export KUSANAGO_PASSWORD=\"$KUSANAGI_PASSWORD\"
export DBROOTPASS=\"$DBROOTPASS\"
export SITE_DOMAIN=$SITE_DOMAIN
export DBNAME=$DBNAME
export DBUSER=$DBUSER
export DBPASS="\$DBPASS\"
export EMAILOPTION=--no-email
export PROFILE=gitlab
EOT
set -x
source export.txt
sudo yum clean all
sudo yum update -y
sudo yum install -y jq
yes 1 | sudo kusanagi init --tz tokyo --lang en --keyboard en --passwd "$KUSANAGI_PASSWORD" --no-phrase --dbrootpass "$DBROOTPASS" --php7 --nginx --ruby24 --dbsystem psql
sudo kusanagi provision --lamp --fqdn $SITE_DOMAIN $EMAILOPTION --dbname $DBNAME --dbuser $DBUSER --dbpass "$DBPASS" $PROFILE
sudo yum install -y postgresql96-contrib
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://$SITE_DOMAIN" yum install -y gitlab-ce
echo "
nginx['enable'] = false
gitlab_rails['internal_api_url'] = '$SITE_DOMAIN'
web_server['external_users'] = ['httpd']
gitlab_rails['internal_api_url'] = 'http://$SITE_DOMAIN'
postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'postgres'
gitlab_rails['db_password'] = '$DBROOTPASS'
gitlab_rails['auto_migrate'] = false
" | sudo tee -a /etc/gitlab/gitlab.rb > /dev/null
sudo mkdir -m700 /var/cache/nginx/gitlab
sudo chmod httpd /var/cache/nginx/gitlab
cd /tmp
sudo sed -i -e '/root/,\$d' -e '/client_max_body_size/r ./gitlab_nginx.tmpl' /etc/nginx/conf.d/${PROFILE}_http.conf
sudo sed -i -e '/root/,\$d' -e '/client_max_body_size/r ./gitlab_nginx.tmpl' /etc/nginx/conf.d/${PROFILE}_ssl.conf
sudo sed -i -e '59,62d' /etc/nginx/nginx.conf
cat nginx.tmpl | sudo tee -a /etc/nginx/nginx.conf >/dev/null
sudo gitlab-ctl reconfigure || true
sudo rm -rf /opt/gitlab/embedded/postgresql/*
export PATH=/opt/gitlab/bin:/opt/gitlab/embedded/:$PATH
yes yes | sudo /opt/gitlab/bin/gitlab-rake gitlab:setup
rm /tmp/gitlab_nginx.tmpl /tmp/nginx.tmpl
sudo reboot
SHELL
end
このVagrantfile、nginx.tmpl 、gitlab_nginx.tmpl を使用して、自動的にKUSANAGI+Gitlabの環境を作成することができました。
正直、Gitlabのnginxは少し古いバージョンなので、NGINXの新しいバージョンが良ければこの構成で良いと思います。ただ、手間はかかるのでGitlabを使いたい人はDockerなどでGitlabを構築するほうが楽だと思います。
では、次回をお楽しみに。