公開日: 2023年9月17日

Git 第6回: 自宅 LAN の NAS にリポジトリを作ろう

GitHub にわざわざ上げるほどもないんだけど、自宅 LAN でこぢんまりとバージョン管理できたらいいんだがなあというファイルはありがちだと思います。いろいろなやり方が考えられますが、私の場合はたまたまバックアップ目的で購入してあった DiskStation DS218Play という NAS 製品で Git を動かせることがわかりました。NAS 上にリポジトリを作り、同じ LAN 内のマシンから clone したり push したりできるようになった顛末を書き記したいと思います。

概要

  • 自宅 LAN の構成は下記の記事に掲載した図 1 のとおりですが、そこに NAS が加わります。
  • NAS は Synology 社の DiskStation DS218Play という製品を使用します。ただのストレージではなくコンピューターなので、DiskStation Manager (DSM) と呼ばれるオペレーティングシステムが動いており、アプリケーションをインストールして実行することもできます。
  • さまざまなアプリケーションがパッケージとして配布されています。Git もそこに含まれます。
  • 各 PC と NAS の IP アドレスは、ルーターの DHCP サーバーで割り当てます。ただし、常に同じ IP アドレスを割り当てるように設定するので、動的にというよりは半動的という感じでしょうか。
  • NAS 上に作ったリポジトリには SSH を使ってアクセスします。

DS218Play に常に同じ IP アドレスを割り当てる

わが家ではルーターの DHCP サーバーで IP アドレスを動的に割り当てていますが、DS218Play には常に同じ IP アドレスが割り当てられるようにしておくと、このあとの作業が楽です。私が使用している BUFFALO 社の製品では、「エアステーション設定ツール」を起動し、[LAN] > [DHCP リース] の画面 (図 1) で当該機器の [手動割当に変更] ボタンをクリックします。すると状態が [自動割当] から [手動割当] に変わるので、[修正] ボタンをクリックすることで任意の IP アドレスを指定できるようになります。

ちなみに、LAN につながっている機器の IP アドレスは、Windows なら arp -aコマンド、FreeBSD ならarp-scanコマンドで知ることができます (arp-scan は ports/packages からインストールが必要)。

図 1
図 1

DS218Play のセットアップ

※ ここでの作業は Windows で行っていますが、DSM はブラウザから操作できるので、基本的には FreeBSD でも可能な作業だと思われます。

DS218Play を LAN に接続して、同じ LAN の PC から Web ブラウザを使って特定の URL (または IP アドレスがわかっていれば IP アドレス) にアクセスすると、セットアップツールを操作できるようになります (詳しくはメーカーの製品マニュアル (ハードウェア・インストール・ガイド) を参照してください)。

その際に、DS218Play のマシン名と管理者アカウントを設定するステップがあるので、次の例のように入力します。このアカウントは、あとでリポジトリを作成するために SSH でアクセスするときに使用します。

  • サーバー名: nas1
  • ユーザー名: mijinco
  • パスワード

セットアップが完了すると、DSM へサインインすることができるようになります。ブラウザのアドレスバーに DS218Play の IP アドレスを入力して Enter を押すと、DSM へのサインイン画面が表示されるので、先ほど作った管理者アカウントでサインインしましょう。図 2 のようなデスクトップからさまざまな操作を行えるようになります。

図 2
図 2

/etc/hosts に NAS を登録する (FreeBSD の場合)

SSH でアクセスするときに毎回 IP アドレスを覚えておいて入力するのは、脳にも手にも負担がかかるので、/etc/hosts ファイルに次の 1 行を追記しておきます。これで、IP アドレスの代わりに NAS のホスト名を指定することができます。Windows の場合は (どういう仕組みなのかよくわかりませんが) この作業は不要です。

/etc/hosts
192.168.11.21 nas1

IP アドレスとホスト名はご自分の環境に置き換えてください。

SSH サービスを有効化する

リポジトリの作成や Git の操作はすべて SSH で行うので、SSH を有効にしておきます。DSM にサインインし、[コントロールパネル] > [端末と SNMP] をクリックし、[SSH サービスを有効化する] にチェックを入れます (図 3)。ポートはデフォルトの 22 にしておきます。

図 3
図 3

DSM に Git をインストールする

DSM 向けの Git がパッケージとして配布されているので、インストールします。デスクトップにある [パッケージセンター] のショートカットを開き、「git」をキーワードに検索すると Git Server がヒットします。それをインストールしてください (図 4)。

図 4
図 4

共有フォルダを作成する

リモートリポジトリを置くための共有フォルダを DSM で作成します。

  1. [コントロールパネル] > [共有フォルダ] > [作成] ボタンをクリックする。
  2. 共有フォルダの作成ウィザードが起動する。
    ステップ 1/4: 基本情報をセットアップ (図 5 (a))
    • 名前: リポジトリであることがわかりやすい名前をつける。
    • 説明: 任意入力。
    • 場所: ボリューム 1 (リポジトリのパスにこの情報が含まれるので、頭の片隅に入れておきましょう)
    • [「マイネットワーク」で~] と [無許可のユーザーに~] はデフォルトでは未チェックだが、一応チェックを入れておく
  3. ステップ 2/4: 追加的なセキュリティ対策を有効化 (同 (b))
    特に対策しないのでスキップを選択する。
  4. ステップ 3/4: 設定の確認 (同 (c))
    設定内容を確認し、[次へ] をクリックする。
  5. ステップ 4/4: ユーザー許可を構成 (同 (d))
    共有フォルダのアクセス権限を設定できるが、あとでもできるので、ここはそのまま [適用] をクリックする。

これでとりあえず共有フォルダを用意することができました。

図 5
図 5

リモートリポジトリを作成する

上で作った共有フォルダの中に、リモートリポジトリを作ります。ここでの作業は SSH で行います。
  1. PC の端末エミュレータを使って SSH で NAS にアクセスする。アカウント名、NAS サーバー名、SSH ポート番号は上で設定しておいたものを使う。
       % ssh mijinco@nas1 -p 22
       mijinco@nas1's password:
       ...
       mijinco@nas1:/$
    
  2. 先ほど作った共有フォルダに移動する。図 5 のように入力して作った場合のパスは /volume1/gitroot/ となる。
    mijinco@nas1:/$ cd /volume1/gitroot/
    
  3. ベアリポジトリを作成する。
       mijinco@nas1:/volume1/gitroot$ mkdir example.git
       mijinco@nas1:/volume1/gitroot$ cd example.git/
       mijinco@nas1:/volume1/gitroot/example.git$ git init --bare
       Initialized empty Git repository in /volume1/gitroot/example.git/
    

Git 専用のユーザーとグループを作成する

いまのところ、管理者アカウントしか作っていないので、DSM にはフルアクセスが可能な状態です。より権限を抑制した Git 専用のユーザーを作成しましょう。1 人でこぢんまりとやる分にはあまり気にしなくてもいいかもしれませんが、やっておけば不慮のミスの予防にもなります。

  1. [コントロールパネル] > [ユーザーとグループ] > [ユーザー] タブ > [作成] ボタン。
  2. ユーザー作成ウィザードが起動する。
    ステップ 1/7: ユーザー情報を入力 (図 6 (a))
    ユーザー名とパスワードを入力して [次へ] をクリックする。
  3. ステップ 2/7: グループの結合 (同 (b))
    グループは後から設定するので、とりあえずそのまま [次へ]。
  4. ステップ 3/7: 共有フォルダの権限を割り当てる (同 (c))
    共有フォルダへのアクセス権限を設定する。Git 用に作った共有フォルダのみ読み書き可能になるようにチェックを入れる。
  5. ステップ 4/7: ユーザークォータの割当 (同 (d))
    ユーザーに割り当てるストレージ容量を入力する。特に制限を設けないなら空欄にしておく。
  6. ステップ 5~7: そのまま次へ。
図 6
図 6

次に Git 専用グループも作ります。

  1. [コントロールパネル] > [ユーザーとグループ] > [グループ] タブ > [作成] ボタン。
  2. グループ作成ウィザードが起動する。
    ステップ 1/7: グループ情報を入力 (図 7 (a))
    グループ名を入力して [次へ] をクリックする。
  3. ステップ 2/7: メンバーを選択 (同 (b))
    グループに所属するユーザーを選択する。先ほど作ったユーザーにチェックを入れる。
  4. ステップ 3/7: 共有フォルダに権限を割り当てる (同 (c))
    共有フォルダへのアクセス権限を設定する。Git 用に作った共有フォルダのみ読み書き可能になるようにチェックを入れる。
  5. ステップ 4/7: グループクォータの割当 (同 (d))
    グループに割り当てるストレージ容量を入力する。特に制限を設けないなら空欄にしておく。
  6. ステップ 5~7: そのまま次へ。
図 7
図 7

最後に、Git Server へのアクセス権限を設定します。

  1. [パッケージセンター] > [インストール完了] > [Git Server] の [開く] ボタンをクリックする (図 8 (a))。
  2. Git 用に作成したユーザーのアクセス許可にチェックを入れ、[適用] ボタンをクリックする (図 8 (b))。
図 8 (a)
図 8 (a)
図 8 (b)
図 8 (b)

これで設定はひと通り終了です。clone のお時間がやってまいりました。

clone のお時間

それでは clone してみましょう。リポジトリの指定方法は「ssh://<ユーザー名>@<ホスト名>:/volume1/<共有フォルダ名>/<リポジトリ名>」です。

% git clone ssh://gituser@nas1:/volume1/gitroot/example.git ~/gitroot/example/
Cloning into '/home/mijinco/gitroot/example'...
The authenticity of host 'nas1 (192.168.11.21)' can't be established.
ED25519 key fingerprint is SHA256:fK42FkaYH5KbGFkEcj7Kmm+i0gGvQSccsJzONaTmd4g.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'nas1' (ED25519) to the list of known hosts.
gituser@nas1's password:
Could not chdir to home directory /var/services/homes/gituser: No such file or directory
warning: You appear to have cloned an empty repository.
% ls -a ~/gitroot/example
./      ../     .git/

初めて接続するホストの場合は本当に接続するか確認を求められたり、接続先にホームディレクトリがないよと警告されたりはしますが、それらを無視すれば空のリポジトリを clone することができました。origin も正しくセットされているようです。

% git remote -v
origin  ssh://gituser@nas1:/volume1/gitroot/example.git (fetch)
origin  ssh://gituser@nas1:/volume1/gitroot/example.git (push)

あとの操作は GitHub 等を利用するのと変わりません。家の中でのことですから、気楽にいろいろ試して、有効に活用しましょう。

% touch file1 file2
% git add .
% git status
% git commit -m "add two files"
[master (root-commit) 8101159] add two files
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
 create mode 100644 file2
% git log
commit 81011593276674a1de6e173b6c33a83341208fbc (HEAD -> master)
Author: mijinco <0106@retrotecture.jp>
Date:   Sat Sep 2 22:04:49 2023 +0900

    add two files
% git push origin master
gituser@nas1's password:
Could not chdir to home directory /var/services/homes/gituser: No such file or directory
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 212 bytes | 1024 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ssh://nas1:/volume1/gitroot/example.git
 * [new branch]      master -> master

これでおしまい

全 6 回にわたりやってきた Git の記事も、今回で一応最終回です。ネタがあればまた書くかもしれませんが、そのときは全 6 回の前提で書いた部分の修正が面倒なので「帰ってきた Git 第 1 回」みたいな形で新シリーズにしようと思います。