KUSANAGI で GitLabを動かしてみよう(2)(宮崎悟氏)

宮﨑悟

前回、KUSANAGI for VagrantでRuby用の環境を作り、GitLabをインストールした記事の続きで、今回はGitLabとKUSANAGIの設定を行いました。具体的には、GitLabの設定を通じて、GitLabがKUSANAGIのPostgresqlを使うようにしました。また、NGINXとPostgresqlはKUSANAGIのものを使い、Railsとその他のサービスはGitLabのものを使用することにしました。さらに、Vagrantfile、nginx.tmpl、gitlab_nginx.tmplを使って、KUSANAGI+Gitlabの環境を自動的に作成することもできた内容を紹介しています。

前回のおさらい

前回は、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初期画面

あとは、管理者権限のパスワードを打って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を構築するほうが楽だと思います。

では、次回をお楽しみに。

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解