AWSをいじり倒す(番外編.LightSailのredmineにgit設定)

LightSailで建てたRedmineの中にGitを入れ込むという設定。

別にLightSailがEC2(redmineの入ったAMI利用)であってもよい。設定は一緒。

これらの特徴はbitnamiのRedmineを利用するという点にある。

bitnami式Redmine色々制約があるので、大半のネット記事を鵜呑みにするとうまくいかず、死ぬほど紆余曲折したのでメモしておく。

最後は妥協しているので参考程度に。

bitmani式ではなくて自前で構築する場合は、この記事は逆に参考にならんので注意

 

環境は

Ubuntu 16.04.6

Bitnami Redmine 4.1.0-8 

 

 

gitのインストール

bitnami式redmineにgitは最初から入っているので不要。

f:id:Messerarche:20200524170851p:plain

 

リポジトリ を準備。

作業ディレクトリは適当に以下とした。

/home/bitnami/git/repos

 

リポジトリ を作成

mkdir test.git
cd test.git
git init --bare
git update-server-info

なお、pushするたびにupdate-server-infoしないといけないらしいので

それを回避する設定もいれておく

mv hooks/post-update.sample hooks/post-update

実行権限も付与

cd ../
chmod -R o+w test.git

 

 

 

 

bitnamiで建てたRedmineの、Apacheやwww-なんとかみたいなユーザ相当はdaemon。

chown -R bitnami:daemon .

それはこのサイトをみて知った。

Amazon Lightsailの諸々ファイル置場 | It works for me

 他にもログの場所など有益な情報がまとまっていてありがたい

 

gitでやり取りする時に、必ずユーザとパスワードを要求したいので、その準備。

htpasswd -c -b /home/bitnami/git/.htpasswd ユーザ名 パスワード

 -bをつけて1ラインで登録してしまわないとバグるみたいな記載をみたので念の為書いておく

 

Apache用コンフィグの作成

bitnami式redmineの裏で動いているのはApache

主にこのディレクトリ 配下にいろんなconfigが入っている

/opt/bitnami/apache2/conf/

この配下で作業を行っていく

 

git.confを新たに作成。

まずは最小構成の内容をgit.confに記載する。

Alias /git /home/bitnami/git/repos

<Location /git>
    AuthType basic
    AuthName "Git"
    AuthUserFile /home/bitnami/git/.htpasswd
    Require valid-user
</Location>

 

 

このgit.confを読み込んでもらうために、同一ディレクトリにあるhttpd.confの最終行に

Include "/opt/bitnami/apache2/conf/git.conf"

を追加

 

これで最小構成が完成。システムのリスタートを行う。

bitnami式redmineのリスタートコマンドは以下。

sudo sh /opt/bitnami/ctlscript.sh restart

 

いったんここまででテスト。

ローカル環境にて、cloneを試す。

git clone https://example.com/git/test.git

ユーザ名入力

パスワード入力

Cloning into 'test'...

warning: You appear to have cloned an empty repository.

この返答がくればOK

 

ちなみに、まだcloneはできてもpushはできない。

touch testfile
git add testfile
git commit -m "first commit" 

 [master 452f009] first commit

1 file changed, 0 insertions(+), 0 deletions(-)

create mode 100644 testfile

git remote set-url origin https://example.com/git/test.git 
git push -u origin master

 error: Cannot access URL https://example.com/git/test.git/, return code 22

fatal: git-http-push failed

error: failed to push some refs to 'https://example.com/git/test.git'

 

pushするための設定

pushを行うためには、git.confに追加の設定が必要でそのやり方は2通りある

1.git-http-backendを使う

2.WebDavを使う

のどちらかを行う必要がある。

なお、SSHは使わずにhttpでなんとかしたい、というのが前提。

(鍵管理したくないので) 

 

さて、git-http-backendを有効化する手順は巷にたくさん書いてあるが、

それをそのまま入れると失敗するのが最大のハマりポイント。

 

具体的にはこういうやつだ

SetENV GIT_PROJECT_ROOT /home/bitnami/git/repos
SetENV GIT_HTTP_EXPORT_ALL
ScriptAlias /git "/usr/lib/git-core/git-http-backend"

Alias /git /home/bitnami/git/repos

<Location /git>
    AuthType basic
    AuthName "Git"
    AuthUserFile /home/bitnami/git/.htpasswd
    Require valid-user
</Location>

上3行を追加し、取り消し線のところを削除

他にもなんだか装飾されたコンフィグが公開されているが、最低限これだけでいい。

 

リスタートしてconfファイルを読み込む

sudo sh /opt/bitnami/ctlscript.sh restart

 

すると、ローカルで実行した結果がこうなる

git push -u origin master

 fatal: repository 'https://example.com/git/test.git/' not found

ちなみに、cloneも失敗するようになる。

これが何故なのかわからず死ぬほど時間を使った。

 

 

結論はbitnami式redmine環境特有のものだった。

自分なりに調べた結果を言葉にすると

bitnami式は動作するための最小限のモジュールしかインストールしていない

かつ、通常インストールされる場所とは別のディレクトリにモジュールを置いているのでapt-get等で追加インストールしてもそれだけでは反映されない。

 

なので、普通に動かないし、追加でpkgインストールしても動かないという二重苦。

ちなみに2番目のDAVの設定にも手を出してみたがこれまた沼が深そうで諦めた。

また、手探りでa2enmod cgiコマンド打ったあと再起動したらredmineが立ち上がらなくなり、ubuntuのデフォルトページが表示されるようになってしまった。クソ焦って慌てて復旧させたが、configのいかんところが書き変わってしまったんだろうか・・・。若干トラウマ

 

 

さて、試行錯誤を経てたどり着いたのがこのブログ

bitnami redmine と同じホストで git 連携する - criticablog

完全ではないが、動くところまではもっていくことができた。

以下にコピペな部分もあるが手順を書いておく。

 

fcgiwrapインストール

sudo apt-get install fcgiwrap

  ユーザグループ設定

vi /etc/default/fcgiwrap
FCGI_USER=daemon
FCGI_GROUP=bitnami
FCGI_SOCKET_OWNER=daemon
FCGI_SOCKET_GROUP=daemon

  

 

git.confを大改造。Subversionとかは使わないので自分用に多少アレンジ

<IfModule !perl_module>
LoadModule perl_module modules/mod_perl.so
</IfModule>
<IfModule !env_module>
LoadModule env_module modules/mod_env.so
</IfModule>
PerlLoadModule Apache::Authn::Redmine

# Gitの設定
<IfModule !proxy_module>
LoadModule proxy_module modules/mod_proxy.so
</IfModule>
<IfModule !proxy_fcgi_module>
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
</IfModule>

LogLevel trace2

AliasMatch "/git/(.+)" "/opt/bitnami/git/libexec/git-core/git-http-backend/$1"
<Location /git>
    SetHandler "proxy:balancer://fcgi59618workaround"

    SetEnv GIT_HTTP_EXPORT_ALL ""
    SetEnv GIT_PROJECT_ROOT "/home/bitnami/git/repos"

    AuthType Basic
    AuthName "Git"
AuthUserFile /home/bitnami/git/.htpasswd Require valid-user </Location> <Proxy "balancer://fcgi59618workaround"> BalancerMember "unix:/run/fcgiwrap.socket|fcgi://." </Proxy>

 

モジュールの配置

mkdir -p /opt/bitnami/perl/lib/site_perl/5.16.3/Apache/Authn
ln -sv /opt/bitnami/apps/redmine/htdocs/extra/svn/Redmine.pm /opt/bitnami/perl/lib/site_perl/5.16.3/Apache/Authn/Redmine.pm

そして

sudo sh /opt/bitnami/ctlscript.sh restart

すると、無事clone/pushどちらも動いた。

先人の知恵さまさま・・・!

 

これで、http通信+password要求でgitが使える環境が完成。

https設定ができていればhttpsでも問題なく動いた。

 

redmineとgitの連携は

RedmineでGitを連携させる - Qiita

あたりをみながら設定してなんなく動いた。

 

 

 

ここからはうまくいっていなのでただの参考記事

どうもredmineで作ったID/PASSをgitの認証に使うことができるとのこと

これは便利と思って試そうとして死んだ。

 

先人様のサイトにあるこのconfigをgit.confに追加でぶちこむ。

    # Redmine プロジェクトのメンバー管理と連動したアクセス制御。
    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler
    # /opt/bitnami/apps/redmine/htdocs/config/database.yml と同じ値にする。
    RedmineDSN "DBI:mysql:database=bitnami_redmine;host=localhost;mysql_socket=/opt/bitnami/mysql/tmp/mysql.sock"
    RedmineDbUser "bitnami"
    RedmineDbPass "****"

なお、DbPassは

/opt/bitnami/apps/redmine/htdocs/config/database.yml

に書いてある。

 

これでclone実行するとこんな感じのエラー

git clone https://example.com/git/test.git

Cloning into 'test'...

fatal: unable to access 'https://example.com/git/test.git/': The requested URL returned error: 500

 

 

/opt/bitnami/apache2/logs/error_logをみるとこんなことが書いてある

[Mon May 25 14:36:04.034645 2020] [perl:error] [pid 21399:tid 139890079483648] [client 118.2.90.3:54909] install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /opt/bitnami/git/lib/site_perl/5.16.3 /opt/bitnami/perl/lib/5.16.3/x86_64-linux-thread-multi /opt/bitnami/perl/lib/5.16.3 /opt/bitnami/perl/lib/site_perl/5.16.3/x86_64-linux-thread-multi /opt/bitnami/perl/lib/site_perl/5.16.3 /opt/bitnami/perl/lib/5.16.3/x86_64-linux-thread-multi /opt/bitnami/perl/lib/site_perl/5.16.3/x86_64-linux-thread-multi /bitnami/ruby25stack-linux-x64/output/perl/lib/site_perl/5.16.3/x86_64-linux-thread-multi /bitnami/ruby25stack-linux-x64/output/perl/lib/site_perl/5.16.3 /bitnami/ruby25stack-linux-x64/output/perl/lib/5.16.3/x86_64-linux-thread-multi /bitnami/ruby25stack-linux-x64/output/perl/lib/5.16.3 . /opt/bitnami/apache2) at (eval 6) line 3.\nPerhaps the DBD::mysql perl module hasn't been fully installed,\nor perhaps the capitalisation of 'mysql' isn't right.\nAvailable drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge.\n at /opt/bitnami/perl/lib/site_perl/5.16.3/Apache/Authn/Redmine.pm line 557.\n

太字のところに着目

DBD/mysql.pmが見つからねーよ、と。

これが先に説明したbitnami特有のモジュール足りてないアレ。

 

これについて戦っている記事を2つ見つけた。

git - install_driver(mysql) failed: Can't locate DBD/mysql.pm - Stack Overflow

なんでこのエラーがでるかの仕組みがしっかりと書いてあるが、

悲しいかなこのサイトの結論は

「サポートに繰り返し言ってくしかないね!」

 

こっちは気合で解決しましたと書いてある

Subversion login - install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC - Redmine - Bitnami Community

過去サーバから設定ファイルをコピーしてきて、config書き換えたらうまくいったんだと。

試しにファイルをいくつかそれっぽいコピーしてみたけど、

そこまで知識がないので泥沼化して諦めた。つら。

 

どうも昔のredmineにはちゃんと入ってたモジュールっぽいんだよなぁ。

現時点の最新(4.1.0-8)には含まれてないのは謎