2017年06月21日

Ubuntu サーバの設定 git サーバーのセットアップ

git サーバーを構築する。

ユーザー数は、~10数人程度の規模で運用するぐらいを想定する。
要は手動でアクセスユーザーを追加しても、かかる手間は知れている程度の規模と仮定する。
ユーザー側ではSSH接続が可能であるとしておく。



git については、ここで簡単に触れた。


インストール


クライアント用途で使う場合と同じ。
端末で実行する。

$ sudo apt-get install git


確認してみる。
$ git --version
git version 2.7.4







アクセスユーザーの作成


git サーバーへアクセス可能なユーザーを設定する。
SSH接続できるようにLinuxユーザーを作成する。

git サーバーへのアクセス専用ユーザーとして1つ準備する。
プロジェクトメンバー全員にアクセス権を与えるのが正しいのかもしれないが、ユーザー追加のたびに作業が増えるので、プロジェクトメンバー全員が使う共通ユーザーとして作ることにする。

ユーザー作成にあたり、目的はSSH接続のためだが、git 以外の操作は制限したい。
そこで、git に関する作業しかできない制限付きシェル "git-shell" が git に付属しているので、これをユーザーのログインシェルに指定する。

$ sudo useradd gituser -s /usr/bin/git-shell


パスワードも設定する。

$ sudo passwd gituser

新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: パスワードは正しく更新されました



"gituser" グループができるので、サーバー管理者も参加させておく。

$ sudo gpasswd -a <admin> gituser




git 用のディレクトリを作成する。
"gituser"のホームディレクトリを作成し、そこをgit用に使う。
所有者とパーミッションも合わせて、"gituser" に変更する.

$ sudo mkdir /home/gituser/
$ cd /home/
$ sudo chown gituser:gituser ./gituser/
$ sudo chmod 755 ./gituser/







ユーザー側でのSSH接続準備


SSHで接続する際に使われる設定ファイルを使ってアクセスを効率化しておく。
"~/.ssh/config" に設定する(configファイルが無ければ作成する)
Host "任意の接続名"
  HostName ホスト名 or IPアドレス
  User ユーザー名
  Port ポート番号
  IdentityFile "秘密鍵のPATH"


今は、ポート番号は22番のまま、公開鍵認証も使わないので、
例えば、このようにする。
Host gitserver
  HostName 192.168.1.120
  User gituser






リモートリポジトリの作成


次に、リモートリポジトリを準備する。

サーバー側での対応


サーバー側ではリモートリポジトリを入れるディレクトリを準備する。

各プロジェクトのリポジトリを格納する場所を、"~/git/" 以下とし、所有者とパーミッションを設定しておく。

$ cd /home/gituser/
$ sudo mkdir git/
$ sudo chown gituser:gituser ./git/
$ sudo chmod 770 ./git/



この中にプロジェクト単位でリポジトリを用意していく。
プロジェクト単位で " *.git " ディレクトリを作成し、その中にリモートリポジトリ(ベアリポジトリ)を作成する。

$ cd git/
$ mkdir ./project1.git/
$ cd ./project1.git/
$ git init --bare

Initialized empty Git repository in /home/gituser/git/project1.git/

ベアリポジトリとは、作業ツリーを持たずに更新情報のみ管理する場所。
実際の作業は、ユーザー側のローカルリポジトリで行い、サーバー側のリモートリポジトリでは各ローカルリポジトリからの更新情報を格納するのみの場所として提供する。


所有者を変更しておく。忘れずに、"-R" オプションをつけて実行。

$ cd /home/gituser/git/
$ sudo chown -R :gituser ./project1.git/


これで、サーバー管理者とgitユーザーがリモートリポジトリを触れる。

このような構造で、各プロジェクトごとでリモートリポジトリを管理していく。

└ gituser
└ git/
├ project1.git
│ ├ HEAD
│ ├ branches
│ ├ config
│ ├ description
│ ├ hooks
│ ├ info
│ ├ objects
│ └ refs

├ project2.git
├ project3.git
├ project4.git
├ project5.git
・・・・・







ユーザー側での対応


ユーザー側では、まずリモートリポジトリからローカルリポジトリへ複製する(クローン)。

作業用ディレクトリとして、"~/git/" 以下の階層を使うことにした。
クローンする場所を準備したら、その場所へ移動しておく。

$ mkdir ~/git/
$ cd ~/git/



リモートリポジトリの場所は、"~/git/project1.git"

$ git clone gitserver:~/git/project1.git

Cloning into 'project1'...
gituser@192.168.1.120's password:
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

ローカル環境へ、"project1" ディレクトリが複製された。

└ git/
└ project1/
└ .git/
├ HEAD
├ branches/
├ config
├ description
├ hooks/
├ info/
├ objects/
└ refs/
このローカルリポジトリを使って、プロジェクトを進めることができる。


試しに、新たなファイル(index.html)を準備し、プロジェクトへ追加してみる。

$ git add index.html
$ git commit

$ git log
commit 83e4e2160daaa9051b7a67424fc69905f4f0e87f
Author: hoge hogehoge <hoge@email.com>
Date: Mon Jun 19 21:00:00 2017 +0900

    Add new file.



ローカルリポジトリを更新したので、リモートリポジトリへ反映してみる。

$ git push

warning: push.default is unset; its implicit value has changed in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the traditional behavior, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple

When push.default is set to 'matching', git will push local branches
to the remote branches that already exist with the same name.

Since Git 2.0, Git defaults to the more conservative 'simple'
behavior, which only pushes the current branch to the corresponding
remote branch that 'git pull' uses to update the current branch.

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

gituser@192.168.1.120's password:
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 363 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitserver:~/project1/.git
* [new branch] master -> master


なにやら警告が出たが、リモートリポジトリへは反映できた。
警告については、また別の機会に触れる。




SSH公開鍵接続


SSH接続をパスワード認証のパターンで説明してきたが、実際の運用では接続ポート番号も変えるだろうし、公開鍵認証にすると思う。
なので、SSH接続を公開鍵認証にしておく。


ユーザー側で公開鍵、秘密鍵ペアの作成


各ユーザーは、"~/.ssh/" へ移動し、それぞれ作成する。

$ cd ~/.ssh/
$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/********/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/********/.ssh/id_rsa.
Your public key has been saved in /home/********/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7Lf/RDXF/fIL28lOwH1sHSPd+3l/+Xsh3NtrIkjLhBs ********
The key's randomart image is:
+---[RSA 2048]----+
 ・・・・・・・・
+----[SHA256]-----+


作成した公開鍵(id_rsa.pub)は、SSHサーバー側にUSBメモリを使うなど何でも良いので渡す。
渡す際は、サーバー管理者が複数ユーザーから公開鍵を受け取った場合に混乱しないよう、ユーザー名をつけるなどリネーム(id_rsa_user1.pub)しておくとよい。



サーバー側で公開鍵を配置


SSHサーバーでの公開鍵の保存先は、"/home/gituser/.ssh"
存在していなければ作成し、所有者の変更と仮パーミッションに変更しておく。

$ cd /home/gituser/
$ mkdir /home/gituser/.ssh/
$ sudo chown gituser:gituser /home/gituser/.ssh/
$ sudo chmod 770 /home/gituser/.ssh/



".ssh" へ移動。"authorized_keys" ファイルを変更する。
既に "authorized_keys" が存在していれば、サーバー管理者ではパーミッションが無いので、
一旦、変更できるようにする。

$ cd /home/gituser/.ssh/
$ sudo chmod 660 authorized_keys



新規であれば、このタイミングで "authorized_keys" ファイルが作成。
統合後、SSH接続可能なように所有者とパーミッションを変更しておく。
公開鍵ファイルは不要なので削除する。

$ cat id_rsa_user1.pub >> authorized_keys
$ sudo chown gituser:gituser authorized_keys
$ sudo chmod 600 authorized_keys
$ rm id_rsa_user1.pub



".ssh/" ディレクトリのパーミッションをSSH接続可能な設定にしておく。

$ cd /home/gituser/
$ sudo chmod 700 .ssh/



"git" ユーザーは、"git" 以外の操作を制限したので、サーバーに通常にログインすることができず、"git"以外の操作が不便だ。
パーミッションが制限されたファイルを触るためには、パーミッションを変更してファイル操作して、またパーミッションを戻してと。ユーザー追加時に多少の手間がかかる。
プロジェクトメンバーで秘密鍵を共有するという手もある。サーバー管理者は楽になるが、あまり推奨はされないだろう。



ユーザー側で秘密鍵を配置


サーバー側で設定されたら、公開鍵は破棄しておく。
秘密鍵のパーミッションを変更する。

$ cd ~/.ssh/
$ rm id_rsa_user1.pub
$ sudo chmod 600 id_rsa



SSHで接続する際に使われる設定ファイルを変更。秘密鍵のPATHを追加。
例えば、このようにする。
Host gitserver
  HostName 192.168.1.120
  User gituser
  Port 22
  IdentityFile ~/.ssh/id_rsa





まとめ


ざっと、git サーバーを立てるときの流れを書いた。
git の使い方をかなり端折っているが、git サーバーを立ててしまえば、あとは実際の使う側での作業。
クライアントユーザーとしての git の使い方は別途まとめていきたい。


Ubuntu インストールしたらやること:gitをインストール
git ブランチについて
git 変更を一時的に退避 stash
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください