t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

GitHubの代替手段、GitBucketをラズパイ3b+に導入して秘匿したいコードを宅サバで管理

GitHubは素晴らしい。
MSが買収して以来Privateリポジトリも無償で使える。

しかしそれでもセキュリティに関するコードや設定ファイル類をネットに公開するには一抹の不安が残る。
いくらPrivateとはいえ、少なくともマイクロソフトがその気になれば、あるいはうっかり流出させるなんてことも無いとは言い切れないのだ。

ということで自宅ネットワーク内にサーバーを建てられないか色々調べていたらGitBucketというツールが良さげだったので導入することにした。普通のgitリモートリポジトリでも良いんだけどGitHubの便利さに慣れてしまうとどうしてもWebUIが欲しくなる。GitLabも自宅サーバーへ導入できるらしいんだけど設定が複雑かつラズパイだと4じゃないとダメみたいなので、2でも3でも導入できそうなGitBucketを選択した。

GitBucketとは

Scala言語で記述されたGit Web プラットフォーム。
gitbucket.github.io

warファイルをダウンロードしてjava vmで動かすだけなのでかなり手軽に導入できる。

導入方法

以下のコマンドを順次実行していく。

#パッケージ一覧を更新しJava8の実行環境をインストール。
sudo apt update
sudo apt install openjdk-8-jre

#実行ユーザーの準備
sudo useradd gitbucket
sudo mkdir /home/gitbucket
sudo chown gitbucket:gitbucket /home/gitbucket

#ダウンロード (記事執筆時点の最新版URLで実行した)
cd /home/gitbucket
sudo wget -O gitbucket.war https://github.com/gitbucket/gitbucket/releases/download/4.38.4/gitbucket.war

#ユーザーを切り替えてテスト実行
sudo su gitbucket
java -jar /home/gitbucket/gitbucket.war --gitbucket.home=/home/gitbucket/

実行してしばらくするとhttp://サーバーip:8080ポートで接続できるようになる。
URL例) http://192.168.1.182:8080/
初期ユーザーはrootでパスワードもroot。
危険なのでAdministratorタイプのユーザーを別で作ったあとはrootを無効化しておこう。
新規ユーザーにAdministratorタイプを指定し忘れてrootを消してしまうと詰むので注意。
その他基本的な使い方は後述。

テスト実行はCtrl+Cで終了させ、次回から自動起動するようにDaemon化する。

以下のように別ポートも指定できる。ただしLinuxセキュリティによって80番での起動はroot権限が必要となっており、ハマリどころなのでおススメしない。

java -jar /home/gitbucket/gitbucket.war --port=3000 --gitbucket.home=/home/gitbucket/

※80番ポートでアクセスしたい場合、後述のiptablesによるNAT機能で80番を8080に転送する方法がおススメ。

Daemon化

# 好きなエディタでサービス用の設定ファイルを作成
sudo vi /etc/systemd/system/gitbucket.service

gitbucket.serviceは新規ファイルの為、以下を記述して保存

[Unit]
Description=GitBucket daemon

[Service]
ExecStart=/bin/su - gitbucket -c "java -jar /home/gitbucket/gitbucket.war --gitbucket.home=/home/gitbucket/"
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

書き終わったら起動する。

#サービスファイル読み込み、有効化、起動。
sudo systemctl daemon-reload
sudo systemctl enable gitbucket
systemctl start gitbucket

以上でとりあえず、サーバー再起動してもhttp://サーバーip:8080/でアクセスできるようになる。

その他の手段としてはtomcat等を使って稼働させるのが良いんだろうけどデプロイは出来てもうまく稼働してこず、私はtomcatでの使用は諦めた。

80番ポートアクセス

Linuxのセキュリティでアプリを80番ポートで起動するにはroot権限が必要となる。しかしなんでもできるrootアカウントなんかで起動するのはセキュリティ的に良くない。
80番ポートそのものは有効なのでiptablesコマンドで80番ポートにきた通信を8080番ポートにリダイレクトすればhttp://サーバーip/でアクセスできた。

#リダイレクト指定
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

iptablesはシステムアップデートで影響を受けやすく、アップデート後にサーバーがリブートされていないとエラーが出る場合があるため、エラーが出るときはサーバーのリブート後に再度試してみる。こんなことで小一時間ハマったので要注意。

これでhttp://サーバーip/でアクセスできることを確認する。

次にiptables設定は再起動するとリセットされるので、そうならないようにするパッケージを導入。

#
sudo apt install iptables-persistent
#インストール中に、「保存しますか」的なことを英語で聞かれるので全部Yesで良い。


80番ポートを利用する他の手段としてはcapabilitiesという機能を使って部分的にrootの権能を譲り受けるという手段が用意されているのだが、私はこれで3時間くらいハマった挙句失敗に終わった。
Java仮想マシンにcapabilitiesで権限を与えてみたらポートは利用できたたんだけど別のことが出来なくなったようで、アプリが起動しなくなった。
元に戻すべく色々試したけど結局できなくてOS再インストールする羽目になったので知識がない場合はおススメしない。

後はサーバーリブート後にhttp://サーバーip/でアクセス出来たら導入完了。

使い方

ユーザー作成

まずは右上でサインイン。初期ユーザーはroot、パスワードもroot。

次に以下のように辿ってユーザーを作成する。

このとき、最初に作るユーザーのUser Typeは必ずAdministratorを選択する。
そうしないと脆弱な初期ユーザーであるrootを無効化できない。(すると詰む)

作成できたら右上アイコンからサインアウトし、作ったユーザーで入り直す。
同様にUser Managementからrootをeditしてdisableしておく。

リポジトリ作成

右上のプラスボタンからNew Repositoryで作成できる。
私は作成方法として「Initialize this repository with an empty commit」を選択して作成している。

あとはここでURLをコピーして、ローカルでcloneするだけ。

Pull Request方法

例えばローカルでdevブランチを切って、git push origin devでリモートのdevブランチを更新すると、リポジトリのbranchesメニューから開いた画面でPull Requestを作成できる。

その後のマージ等は大体GitHubと似たような感じ。

画面構成が違うので最初は戸惑うが、基本的に今触ってるページに関連するナビゲーションが左のメニューとして表示されると考えておけばOK。

参考サイト

インストール
qiita.com

Daemon化
blog.k-san.info

iptablesの設定
serverfault.com

iptablesの設定永続化
akira-arets.blogspot.com

※使い方に関してはGitHubに類似しているので特段参考サイト無し。
GitHubについては

今後の計画

ラズパイのストレージが劣化してソースコードが消失する未来を避けたいので、ストレージをRAID1でミラーリングしたい。
どうやらUSBメモリスティックを2本差してRAID化されている事例があるようなので、そちらを参考に色々と試してみたいと思う。

追記

USBメモリRAID計画は失敗に終わった。
1度目は成功したが、再起動後にRAIDをマウントできなかった。
色々と調査を進めたけど実力不足から時期尚早と感じたので大人しくSDカードで使おうと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。