gitサーバ
gitサーバ
概要
ソフトウェアのバージョン管理の事実上の標準となっているgit。
GitHubなどのサービスがが無料で使えるので
わざわざ自前でgitサーバを立てることも無いのですが、
例えばサーバの設定ファイルなどの変更履歴を
マシン内でこじんまりと管理しておきたいなんて用途もあります。
ということでgitサーバの作成・運用についての備忘録を。
ここでは便宜上"gitサーバ"、"gitクライアント"と呼ぶことにしますが、
実際には狭義の"サーバ"でも"クライアント"でもなかったりします。
なお以下ではUbuntu 18.04での作業を想定しています。
localプロトコル
1つのマシン内だけで使用する場合はlocalプロトコルで運用するのが簡単です。
最初にgitをインストールします。
# apt install git
gitを使う上での設定を以下のように行います。
$ git config --global user.name "<ユーザの名前>"
$ git config --global user.email "<ユーザのメールアドレス>"
$ git config --global core.editor vi
以下でサーバ環境(リポジトリ)を作成します。ここでリポジトリ名は"test"です。
$ mkdir -p /opt/git/test.git
$ cd /opt/git/test.git
$ git init --bare --shared
以下でクライアント環境でリポジトリを取得します。
$ cd ~
$ mkdir git
$ cd git
$ git clone /opt/git/test.git
これで"test"ディレクトリができておりこれが空のリポジトリになっているので、
ここにファイルを登録するなどすることになります。
"git push"すればサーバ環境を更新できます。
gitプロトコル
ネットワーク越しに使いたい場合はgitプロトコルで運用するのが楽です。
ただしセキュリティ的に問題があるのでLAN内だけの使用に限定すべきでしょう。
なおすでに前回の作業を行い、サーバ側クライアント側共に
localプロトコルでは 使用可能であることを前提とします。
まずはサーバ側で以下を実行します。
server$ cd /opt/git/test.git
server$ touch git-daemon-export-ok
server$ git daemon --base-path=/opt/git /opt/git
続いてクライアント側で以下を実行します。
client$ cd ~
client$ mkdir git
client$ cd git
client$ git clone git://<サーバの名前やIPアドレス>/test.git
これで"test"ディレクトリができており、これが空のリポジトリになっているので、
ここにファイルを登録するなどすることになります。
ネット越しなのに認証なしでアクセスできますが、
標準では"git push"できないのでセキュリティは担保できます。
読み込み専用ということですね。
ただしpushは以下で有効にはできます。
server$ cd /opt/git/test.git
server$ git config daemon.receivepack true
用途に合わせて設定すればいいでしょう。
なお、このままだとサーバ側の"git daemon"を止めると
gitプロトコルでのアクセスができなくなります。
これはサービス化する方法が用意されています。
まず以下で起動スクリプトをインストールします。
# apt install git-daemon-sysvinit
スクリプト"/etc/init.d/git-daemon"ができているので
少なくとも以下のような設定になるよう修正します。
GIT_DAEMON_ENABLE=true
GIT_DAEMON_BASE_PATH=/opt/git
GIT_DAEMON_DIRECTORY=/opt/git
最後に以下を実行して完了です。
# update-rc.d git-daemon defaults
httpプロトコル
httpプロトコルならインターネット上でも十分実用になります。
https化や好みの認証に対応するなど自由度が高まります。
なおすでに前回の作業を行い、サーバ側クライアント側共に
local/gitプロトコルでは 使用可能であることを前提とします。
ウェブサーバとしてApache2が導入済みとします。
認証なしの非常にシンプルな構成についてのみの記述となりますので
必要に応じてカスタマイズしてください。
まずはサーバ側のApacheの設定。以下を実行します。
server# a2enmod cgi
設定ファイル"/etc/apache2/sites-enabled/000-default.conf"の
VirtualHostディレクティブ内に以下を追加します。
SetEnv GIT_PROJECT_ROOT /opt/git
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<Directory /usr/lib/git-core>
Require all granted
</Directory>
最後に以下を実行します。
server# /etc/init.d/apache2 reload
続いてクライアント側で以下を実行します。
client$ cd ~
client$ mkdir git
client$ cd git
client$ git clone http://<サーバの名前やIPアドレス>/git/test.git
これで"test"ディレクトリができており、これが空のリポジトリになっているので、
ここにファイルを登録するなどすることになります。
ただしこのままではpushはできません。以下で有効にはできます。
server$ cd /opt/git/test.git
server$ git config http.receivepack true
server$ su
server# cd ..
server# chown -R www-data:www-data test.git/
server# chmod -R 777 test.git/
ファイルの所有者を"www-data"に変えてしまうと
local/gitプロトコルではpushできなくなってしまうため、
その対応のためにパーミッションを変えています。
多分これが大きな問題にはならないと思いますが、
そこまでして全対応することもないかと思います。
sshプロトコル
色んな意味でsshを使うのが標準でしょう。
ただsshだと匿名アクセスができないという問題がありますが。
なおすでに前回の作業を行い、サーバ側クライアント側共に
local/git/httpプロトコルでは 使用可能であることを前提とします。
sshプロトコルでgitを使うと言っても、
単にsshでトンネリングするだけです。
もし既にsshサーバがあってクライアントから
client$ ssh -p 2222 yamada@main.example.com
でアクセス可能で、サーバ側の"/opt/git/test/git"にリポジトリが存在しているなら、
client$ git clone ssh://yamada@main.example.com:2222/opt/git/test.git
でリポジトリを取得できます。
これをいじってpushすればOKです。
予め
eval "$(ssh-agent)"
ssh-add ~/.ssh/id_rsa
でパスフレーズを入力しておけば、
push等の実行時にいちいちパスフレーズを入力するのを省けます。
多人数で触るのなら、サーバ側に複数のアカウントを切って
それらが任意のグループに属するよう設定し、
サーバ側のリポジトリ本体の所有グループを
それにすることで特に問題なく使用できるはずです。
ただ公式サイトのリファレンスをみると
サーバ側に専用の"git"アカウントを作ってそこに多数のssh公開鍵を登録し、
多数のユーザがsshで"git"アカウントとしてログインできるようにし、
ただしログインしてもgit以外のコマンドが
実行できないようにする方法が書かれています。
そのサーバをgit以外で触らせたくなく、
多数のアカウントを切るのに不都合があるのなら
この方法がいいのでしょう。
実際githubはこのようにしていると推察できます。
ただ不正ログインされたときのログの確認なんかはやりにくいと思われ、
無理にそうする必要はないと考えています。
まあ運用に都合よくすればいいだけなのでそこは自由に。
Discussion