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


前回のおさらい

前回は、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を構築するほうが楽だと思います。

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


Post Author: 宮﨑悟

Avatar
国立函館高専を卒業後、NEC協力会社に入社。UNIX・Windowsアプリケーション開発、Solaris/Linuxでのシステム構築に20年以上従事した。SolarisとLinuxを専門とし、OSおよび仮想化技術を得意とする。日本OpenSolarisユーザグループのメンバとして、OSCなど勉強会での登壇多数。 ○得意分野 言語: C、C++、Perl、Python、PowerShell OS: Solaris、Linux 過去の発表資料:OSCおよびhbstudyなどでの登壇経験あり。 https://www.slideshare.net/satorumiyazaki 過去の執筆記事: https://www.cloudn-service.com/magazine/member/satoru_miyazaki.html