Git
GitBucket
centos7
mysql5.7

GitBucket を CentOS7 + MySQL5.7 + HTTPS で構築してみる

追記: パスに /gitbucket/ が入っているとwebhookしたときJenkinsが以下のようなwarningを出すため修正しました

WARNING: Could not match URL ...
WARNING: Malformed repo url ...
WARNING: ... does not match expected repository name pattern

下記を参考にさせていただきました。
GitBucketをhttpsとPostgreSQLで構築してみた

▼ SELinuxを無効にする

# cp -p /etc/selinux/config /etc/selinux/config.orig
# sed -i -e 's|^SELINUX=.*|SELINUX=permissive|' /etc/selinux/config
# setenforce permissive

有効のままできないか頑張ったのですが、だめでした。。。
また時間があったときに再度試してみます。
あるいはどなたか、わかったらご教授ください。。。

なおSELinuxを有効にする場合、サービスの開始前に少なくとも下のコマンドは必要であるはずです。

# /sbin/restorecon -v /var/lib/tomcat/webapps/gitbucket.war
# /sbin/restorecon -v /etc/pki/tls/certs/public-key.crt
# /sbin/restorecon -v /etc/pki/tls/private/private-key.pem

▼ jdkをインストールする

● インストール

# yum list | grep openjdk
# yum install java-1.8.0-openjdk.x86_64

▼ tomcatをインストールする

● インストールと自動起動の設定

# yum install tomcat
# systemctl enable tomcat

● web.xmlの編集

AJP/1.3プロトコルを使用してapacheと連携

# cp -p /etc/tomcat/server.xml /etc/tomcat/server.xml.orig
# sed -i -e '71i \    <!--' /etc/tomcat/server.xml
# sed -i -e '75i \    -->' /etc/tomcat/server.xml
# sed -i -e '76i \    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />' /etc/tomcat/server.xml

おそらくこれで下のようなdiffになるはず

# diff /etc/tomcat/server.xml /etc/tomcat/server.xml.orig
diff
71d70
<     <!--
75,76d73
<     -->
<     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
/etc/tomcat/server.xml
+     <!--
      <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443" />
+     -->
+     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

▼ mod_sslをインストールする

● インストール

# yum install mod_ssl

● 自己署名証明書の作成

※自己署名証明書だと後々面倒なので、避けられるならば避けたほうが良いです。

下記を参考にさせていただきました。
RSA鍵、証明書のファイルフォーマットについて
( https://qiita.com/kunichiko/items/12cbccaadcbf41c72735 )

秘密鍵の作成

# openssl genrsa -aes256 -out private-key.pem 2048 

証明書署名要求の作成

# openssl req -new -key private-key.pem -sha256 -out my-request.csr

自己署名証明書(公開鍵)の作成

# openssl x509 -req -in my-request.csr -signkey private-key.pem -sha256 -out public-key.crt -days 36500

移動、パーミッションの変更

# mv -i private-key.pem /etc/pki/tls/private/
# mv -i public-key.crt /etc/pki/tls/certs/
# chmod 400 /etc/pki/tls/private/private-key.pem
# chmod 400 /etc/pki/tls/certs/public-key.crt

▼ httpdをインストールする

● 自動起動の設定

mod_sslの依存関係から既にhttpdはインストール済みであるはず

# systemctl enable httpd

● /etc/httpd/conf.d/ssl.confの編集

とりあえずコピーを取っといて編集

# mv -i /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.orig
# vi /etc/httpd/conf.d/ssl.conf
# vi /etc/httpd/conf.d/gitbucket.conf

最低限 ServerName は変更のこと
(DNSに設定していないのならばサーバのIPにしておく)

下記を参考にさせていただきました。
Mozilla SSL Configuration Generator

/etc/httpd/conf.d/ssl.conf
Listen 443

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-passphrase
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300

Mutex default ssl-cache

SSLCryptoDevice builtin

SSLRandomSeed connect builtin
SSLRandomSeed startup file:/dev/urandom 256

# modern configuration, tweak to your needs
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder     on
SSLCompression          off

# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling          on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)

/etc/httpd/conf.d/gitbucket.conf
<VirtualHost _default_:443>

 DocumentRoot "/var/lib/tomcat/webapps/gitbucket"
 ServerName gitbucket.example.com:443

 SSLEngine on
 SSLCertificateFile /etc/pki/tls/certs/public-key.crt
 SSLCertificateKeyFile /etc/pki/tls/private/private-key.pem

 # HSTS (mod_headers is required) (15768000 seconds = 6 months)
 Header always set Strict-Transport-Security "max-age=15768000"

 <Proxy *>
  Require ip 172.16.0.0/24
 </Proxy>

 ProxyPreserveHost on
 ProxyPass        / ajp://localhost:8009/gitbucket/
 ProxyPassReverse / ajp://localhost:8009/gitbucket/
 proxypassreversecookiepath /gitbucket /

</VirtualHost>

● httpd起動時のパスフレーズに応答するスクリプトを作成

下記を参考にさせていただきました。
SSL使用時にApacheの再起動時で必要なパスワードの入力を省略
( https://qiita.com/yoshizaki_kkgk/items/26b01edb577861fbcfe6 )

# cat << EOS > /usr/libexec/httpd-ssl-passphrase
> #!/bin/sh
> echo 'passphrase'
> EOS
/usr/libexec/httpd-ssl-passphrase
#!/bin/sh
echo 'passphrase'
# chmod 500 /usr/libexec/httpd-ssl-passphrase

● 設定が正しいか確認

# apachectl configtest

以下のような出力になると思われるが、
/var/lib/tomcat/webapps/gitbucket はwarファイルが展開されたら作成されるため無視してよい

AH00112: Warning: DocumentRoot [/var/lib/tomcat/webapps/gitbucket] does not exist
Syntax OK

● Firewallの設定

# firewall-cmd --add-service=https --permanent
# firewall-cmd --reload
# firewall-cmd --list-all

▼ MySQL5.7をインストールする

下記を参考にさせていただきました。
CentOS7.3 に MySQL5.7 をインストールした時のメモ
( https://qiita.com/prgseek/items/7c77d4b14d0afbf84f5c )

● MariaDBの削除

依存関係からpostfixもremoveされるため注意

# yum remove mariadb-libs
# rm -rf /var/lib/mysql/

● インストールと自動起動の設定

# yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# yum install mysql mysql-devel mysql-server mysql-utilities
# mysqld --user=mysql --initialize
# cat /var/log/mysqld.log | grep 'temporary password'

temporary password を控えておく

/var/log/mysqld.log
2017-11-15T09:02:58.865567Z 1 [Note] A temporary password is generated for root@localhost: ********

起動と初期設定を行う

# systemctl enable mysqld
# systemctl start mysqld
# mysql_secure_installation

● スキーマ『gitbucket』を作成する

# mysql -uroot -p
mysql> CREATE SCHEMA gitbucket;
mysql> ALTER DATABASE gitbucket CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> exit

▼ 最新のリリースをwgetする

下記から最新のリリースを確認
https://github.com/gitbucket/gitbucket/releases

# yum install wget
# wget -P /var/lib/tomcat/webapps/ https://github.com/gitbucket/gitbucket/releases/download/4.19.3/gitbucket.war

▼ warファイルの展開

# systemctl start tomcat
# tail -f /var/log/tomcat/catalina.2017-12-07.log
INFO: Deployment of web application archive /var/lib/tomcat/webapps/gitbucket.war has finished

上のようなログが出力されたら tail を抜ける。

# systemctl stop tomcat

● gitbucket.confの編集

# echo 'base_url=https\://gitbucket.example.com' > /usr/share/tomcat/.gitbucket/gitbucket.conf
# chown tomcat:tomcat /usr/share/tomcat/.gitbucket/gitbucket.conf

● database.confの編集

下記を参考に、設定ファイルを変更する
http://takezoe.hatenablog.com/entry/2016/07/16/025154

# cp -p /usr/share/tomcat/.gitbucket/database.conf /usr/share/tomcat/.gitbucket/database.conf.orig
# sed -i -e 's|url =.*|url = "jdbc:mysql://localhost/gitbucket\?useUnicode\=true\&characterEncoding\=utf8"|' /usr/share/tomcat/.gitbucket/database.conf
# sed -i -e 's|user = .*|user = "rhap"|' /usr/share/tomcat/.gitbucket/database.conf
# sed -i -e 's|password = .*|password = "P@ssw0rd"|' /usr/share/tomcat/.gitbucket/database.conf

おそらくこれで下のようなdiffになるはず

# diff /usr/share/tomcat/.gitbucket/database.conf /usr/share/tomcat/.gitbucket/database.conf.orig
diff
2,4c2,4
<   url = "jdbc:mysql://localhost/gitbucket?useUnicode=true&characterEncoding=utf8"
<   user = "rhap"
<   password = "P@ssw0rd"
---
>   url = "jdbc:h2:${DatabaseHome};MVCC=true"
>   user = "sa"
>   password = "sa"
/usr/share/tomcat/.gitbucket/database.conf
-   url = "jdbc:h2:${DatabaseHome};MVCC=true"
-   user = "sa"
-   password = "sa"
+   url = "jdbc:mysql://localhost/gitbucket?useUnicode=true&characterEncoding=utf8"
+   user = "rhap"
+   password = "P@ssw0rd"

▼ gitbucketの起動

● gitbucketの起動

# systemctl start tomcat
# systemctl start httpd

● ブラウザから確認

https://gitbucket.example.com/
初期ユーザ名、パスワードはroot

おわり!