前回までMicrosoft製のプログラミングエディタであるVisual Studio Code (VS Code)の紹介をしてきました。
今回はこのつながりもあるにはあるのですが、久々にSynologyのNASがらみの記事にしたいと思います。
ちなみに前回のSynology DiskStation DS220jの記事は下記になります。
Gitについて
Gitは主にソフトウェアの開発で用いられる分散型のバージョン管理システムです。
フリーであり、かつ、非常に柔軟なソースコード管理システムであることから、多くのプロジェクトで採用されています。
Gitは分散型のバージョン管理システムですが、ご本尊となるソースコードを格納しておくサーバが必要になります。
ローカルで開発する場合はサーバレスでも利用できるのですが、複数の開発者が居る場合や、一人でも複数の環境を利用する場合は、Gitのサーバを用意するのが一般的です。
このGitのサーバ機能を提供するクラウドサービスとして有名なのがGitHubです。
GitHubを利用するとGitサーバを自前で用意せずに、Gitを利用したソースコード管理を行うことができます。
GitHubを利用するにはアカウントの作成が必要ですが、無料で利用できる「Freeプラン」が用意されています。
SynologyのNASをGitサーバにする
公式サイトの説明は下記になります。
上述のようにGitHubのFreeプランで無料のGitサーバを用意することができます。
しかし、Gitを勉強したいなどの動機で、わざわざGitHubを使うほどのことでもないということもあると思います。
以前はGitHubのFreeプランではプライベートレポジトリは作成できなかったので、時前でGitサーバを用意するメリットはありました。
しかし、GitHubのFreeプランでプライベートレポジトリが利用できる今となっては、あまりメリットがないかもしれません。
そこでSynologyのNASをGitサーバにしてみたいと思います。NASをGitサーバにすれば、データサイズの制限は気にする必要がない(NASの容量次第)ですし、データを外部に送信する必要もなく安心です。
SynologyのNASをGitサーバにする際に、「GitユーザにSSH接続を許可するために管理者権限を付与する必要がある」という情報もありましたが、私が試した限りではGitユーザにNASの管理者権限は不要でした。
しかし、Gitレポジトリを作成する際には、NASの管理者権限アカウントでSSH接続して作業をする必要があります。
共有フォルダを作成する
gitのデータを格納するためのフォルダを用意しましょう。
DiskStation Manager(DSM)に管理者アカウントでアクセスし、「コントロールパネル」→「共有フォルダ」から「作成」を選択します。
フォルダ名は何でも良いですが、Git用であることがわかりやすい方が良いでしょう。ここでは「GitData」としました。
また、「『マイネットワーク』に表示しない」と「無許可のユーザーにサブフォルダとファイルを見せない」をチェックしておきましょう。
暗号化は不要なので、そのまま「次へ」を選択します。
設定の確認して問題なければ「次へ」を選択します。
これでフォルダが作成され、続いてアクセス権の設定になります。
この画面では「ローカルユーザー」で、Gitの利用を許可したいユーザの権限を「読み取り/書き込み」にしておきます。
これで共有フォルダの作成は完了です。
Gitをインストールと設定
SynologyのNASにGitをインストールするためには、DiskStation Manager(DSM)に管理者アカウントでアクセスし、パッケージセンターでGitを探します。
このアイコンを選択すると、ここのパッケージの詳細情報が表示されます。導入されるGitのバージョンは2.33.0です。
あとは「インストール」を選択するとSynologyのNASにGitが導入されます。
続いて導入したGitの設定を行います。
SynologyのNASに入れるGit Serverは設定項目は非常に少なく、アカウントの設定だけです。
Git Serverをインストールすると、パッケージセンターの表示が「開く」に変わるのでこれを選択します。
これでGit Serverへのアクセスを許可するアカウントを選択できます。
ここではGit用の共有フォルダの読み書きを許可したアカウントに対して、Git Serverへのアクセスを許可しておきます。
SSH接続して設定する
次に作成した共有フォルダ(GitData)をGitで使えるようにします。やることは2つです。
- アクセスしやすいようにシンボリックリンクを作成する
- レポジトリを作成する
1のシンボリックリンクは必須ではありませんが、いろいろ入力が楽になるのでオススメです。
これらの作業はSynologyのNASにSSHで接続して行います。
まずDSMのコントロールパネルで「端末とSNMP」を選択し、「SSHサービスを有効化する」をチェックします。
また、必要に応じてポート番号を変えておきます。
続いて適当なSSHクライアントを利用して、SynologyのNASに接続します。このとき、SSH接続に使用するアカウントはNASの管理者権限を有したアカウントになります。
PuTTyを利用する場合は、ホスト名にNASのIPアドレス、ポートに設定したポート番号、接続タイプでSSHを選択して「開く」とすればOKです。
初回接続時は次のようなセキュリティ警告が出ますが、「受け入れる」を選択してOKです。
SSHで接続すると、ログインするユーザアカウントとパスワードを聞かれます。ここではNASの管理者権限を持ったアカウントの情報を入力します(Gitを利用するアカウントではありません)。
ログインに成功すると次のようになります。
ここからコマンドラインの操作になります。管理者権限があるのでミスると致命傷になりかねないので慎重に操作しましょう。
シンボリックリンクを作成する
Git用の共有フォルダは/volume1/GitDataになりますが、毎回入力するのも面倒なのでシンボリックリンク作っておきましょう。
$ cd / $ sudo ln –s /volume1/GitData /git
sudoコマンドに利用時にはパスワードを要求されるので、ログイン中の管理者権限アカウントのパスワードを入力しましょう。
レポジトリを作成する
今回はgit_testという名前でレポジトリを作成します。
$ cd /git $ git init --bare git_test.git
「Initialized empty Git repository in /volume1/GitData/git_test.git/.git/」と表示されればOKです。
このSSHクライアント(PuTTY)は後ほど利用しますので、クローズをせずにそのまましておきます。
Gitを利用するユーザがSSH公開鍵認証を利用できるようにする
ここまでの設定でSynologyのNASに設置したGitサーバは使えるようになっています。
しかし、Gitサーバにアクセスする度にパスワードを入力しなければならず、少々不便です。
VS CodeでこのGitサーバを利用する場合、VS Codeでパスワードを入力する手段がないため(私は見つけられませんでした)、非常に不便になります。
そこでGitサーバへのアクセスを許可したユーザに対して公開鍵認証の設定をしましょう。
これがなかなか大変でした。手順としては
- SynologyのNASでユーザホームディレクトリを有効にする
- VS Code等を動かすPC(Gitクライアント側)で公開鍵・秘密鍵のペアを作成する
- 作成した公開鍵をSynologyのNASにコピーし、Gitを利用するユーザのauthrized_keysファイルに追加する
- Gitクライアント側で公開鍵認証を利用する設定をする
- SSHの接続テストを行う
となります。
操作がSynologyのNASと、Gitクライアント側のPCの両方になるので、注意してください。
ユーザホームディレクトリを有効にする
SSHの公開鍵をSynologyのNASに保管する際に、ユーザホームディレクトリが必要になります。
DSMのコントロールパネルで「ユーザーとグループ」→「詳細」で「ユーザーホームサービスを有効にする」をチェックしておきます。
これでこの設定は完了です。
公開鍵・秘密鍵のペアを作成する
この操作はGitを利用するPC側(クライアント側)で行います。WindowsであればPowerShell(Windows Terminal)を利用して行います。
このときPowerShellを管理者権限で実行してはいけません。
PowerShellでは次のコマンドを入力します。
ssh-keygen
すると、鍵ファイルの名前やパスフレーズが聞かれますが、とりあえずリターンキーを押しておきます。
本来はパスフレーズを設定した方が良いですが、パスフレーズを設定しない方が運用が楽なので、今回はリターンキーのみを押してパスフレーズは設定しません。
実行した様子はこのようになります。
これで次のようなファイルが作成されます。
- 公開鍵: c:\Users\Windowsのユーザ名\.ssh\id_rsa.pub
- 秘密鍵: c:\Users\Windowsのユーザ名\.ssh\id_rsa
これらのファイルは以降の作業で利用します。
authrized_keysファイルに追加
この手順が一番面倒になります。
まず先ほど作成した公開鍵ファイル(c:\Users\Windowのユーザ名\.ssh\id_rsa.pub)をSynologyのNASに転送します。
この転送はSynologyのNASが提供する方法(Windowsの共有フォルダ・DSMのFile Stationなど)のいずれを使ってもかまいません。
転送先はGitを利用するユーザのホームディレクトリとしておきます。
次に「SSH接続して設定する」で説明した手順で、NAS上の管理者権限のアカウントでSynologyのNASにSSH接続をします。
Gitを利用するユーザではなく、管理者権限アカウントなので注意してください。
そして次のコマンドを実行します。
$ cd /var/services/homes/Gitを利用するユーザ名 $ sudo –u Gitを利用するNAS上のユーザ名 mkdir –p .ssh $ sudo –u Gitを利用するNAS上のユーザ名 touch .ssh/authorized_keys $ sudo –u Gitを利用するNAS上のユーザ名 cat id_rsa.pub >> .ssh/authorized_keys $ sudo –u Gitを利用するNAS上のユーザ名 chmod 600 .ssh/authorized_keys $ sudo –u Gitを利用するNAS上のユーザ名 chmod 700 .ssh
Gitを利用するユーザのための設定なのですが、このユーザはNASにSSH接続できないため、管理者権限アカウントでSSH接続してsudoコマンドでユーザを切り替えてコマンドを実行しています。
これでクライアント側で作成した公開鍵ファイルが、SynologyのNAS上で、Gitを利用するユーザのauthorized_keysファイルに追加できました。
SSHのconfigファイルの作成
SSHの接続時の入力を楽にするために、SSHのconfigファイルを作成します。
Gitを利用するPCのホームディレクトリ(Windowsであればc:\Users\Windowsのユーザ名)の.sshディレクトリにconfigというファイル名(拡張子は不要です)のファイルを新規作成します。
このファイルの内容は次のようにします。
Host git-server HostName SynologyのNASのIPアドレス User Gitを利用するNAS上のユーザ名 Port SSHのポート番号 IdentityFile "C:\Users\Windowsのユーザ名\.ssh\id_rsa"
「Host」の行で指定した「git-server」という部分は、接続先(SSHサーバ)を識別するためのニックネームなので、任意の名前として大丈夫です。
「IdentityFile」で指定するのは、SynologyのNASのauthorized_keysファイルに追加した公開鍵に対応した秘密鍵ファイルです。通常はこの例で示した位置に保存されていますが、別の場所にある秘密鍵ファイルを移動して、そのパスを指定してもOKです。
公開鍵認証でのSSH接続を確認する
最後に公開鍵認証でSynologyのNASにSSH接続できることを確認します。
この操作もGitを利用するPC側(クライアント側)で行います。WindowsであればPowerShell(Windows Terminal)を利用して行います。
このときPowerShellを管理者権限で実行してはいけません。
PowerShellでは次のコマンドを入力します。
ssh git-server
「git-server」の部分は、SSHのconfigファイルの「Host」の行に指定したものになります。
ここで確認するのは「パスワードが聞かれないこと」と、次のようなメッセージが出ることです。
「fatal: git package does not support interactive shell」とエラーが出てSSHの接続が自動的に終了してしまいますが、これで問題ありません。
SynologyのNASではGitサーバへのアクセスを許可された一般ユーザは、SSHで接続するとgit-shellというプログラムがシェルとなり、Gitコマンドの実行しかできません。
そのため通常のSSHクライアントから接続すると、SSH接続が即終了してしまいます。
Visual Studio Codeから接続する
SynologyのNASでGitサーバが用意できたら、Visual Studio Codeから使ってみます。
ユーザの名前とメールアドレスの設定
gitを使うにはgitにユーザの名前とメールアドレスを教えておく必要があります。
この設定をVS Codeのメニューでやろうと思ったのですが、やり方が見つけられなかったので、「ターミナル」→「新しいターミナル」を開いてコマンドを入力します。
git config --global user.name "ユーザー名" git config --global user.email "メールアドレス"
特にエラーが出なければOKです。終了したらターミナルは閉じてOKです。
gitレポジトリをクローンする
SynologyのNASの方で既にレポジトリ(git_test.git)を作成しているので、これをクローンしましょう。
左端のソース管理のアイコンから「レポジトリのクローン」を選択します。
これでレポジトリのURLを入力するエリアが表示されます。
ここでSynologyのNASに作成したレポジトリを指定します。入力するURLは次のようになります。
ssh://git-server/git/git_test.git
「git-server」の部分は、SSHのconfigファイルのHostで指定した名前です
するとフォルダの選択が要求されるので適当なフォルダを指定しましょう。私はユーザのフォルダに「Projects」というフォルダを作成し、これを選択しました。
正常にクローンできると画面右下に「クローンしたリポジトリを開きますか?」と表示されるので「開く」を選択します。
これで左下に「master」と表示されれば、レポジトリを開けたことになります。
ファイルの作成
何かファイルを作成してGitで管理してみましょう。
VS CodeのエクスプローラでGIT_TESTにマウスを持って行くと「新しいファイル」のアイコンが現れますのでこれを選択し「ReadMe.md」というファイルを作成しましょう。
またファイルの内容も適当に記載して保存しておきます。
このフォルダ(git_testフォルダ)はGitのレポジトリなので、通常のフォルダにファイルを新規作成したときとは下記の点が異なっています。
- VS Codeのエクスプローラでファイル名の右側に「U」が付く
- 左側のソース管理のアイコンに「1」が付く
- 左下の「master」が「master*」になる
作成したファイルのコミット
まず先ほど作成したReadMe.mdをローカルのレポジトリにコミットします。
左側のソース管理アイコンを選択すると、「変更」の下に「ReadMe.md」が表示されているはずですので「+」を選択して「変更をステージ」します。
これで「ReadMe.md」が「ステージされている変更」に移動します。
そしてメッセージのエリアにコメント(ここでは「初期ファイルを用意」)を入力したあと、チェックマークを選択してコミットしましょう。
「ステージされている変更」の表示がきえればコミット完了です。
また、ソース管理アイコンについていた「1」がなくなったことや、左下の「master*」が「master」に戻ったこともわかると思います。
Gitサーバにプッシュ
最後にローカルで行った変更をGitサーバに反映します。
左側のソース管理アイコンを選択すると、「ソース管理」の横ある「・・・」でメニューを表示させ、「プル、プッシュ」→「プッシュ」を選択します。
これでSynologyのNASに設置したGitサーバと通信を行い、これまでの変更を反映します。
左下のmasterの右横にある同期のアイコンを選択すると、Gitサーバとの同期ができますが、なぜか私が試したときには1回目はエラーになりました。
ここで紹介した様にメニューからプッシュを実行すると、それ以降は同期アイコンで同期がとれるようになりました。
まとめ
今回はSynologyのNASをGitサーバにして、Visual Studio Codeから利用してみました。
VS CodeでSSHを利用したgit接続は、公開鍵認証が前提(?)のため、最初の設定はなかなか大変です。しかし、設定さえ終えれば簡単にGitを利用することができます。
ただ、リモートレポジトリを作るためには、NASの管理者権限アカウントでSSH接続してコマンドを打つ必要があるのは少々面倒かもしれません。
次回はWSL2 + VS Codeの環境でC++を利用してみたいと思います。
コメント
【質問】
分かりやすい投稿をありがとうございます!!
本投稿の「公開鍵・秘密鍵のペアを作成する」にて、
「PowerShellを管理者権限で実行してはいけない」とありますが、
理由について伺えましたらと思います。
コメントありがとうございます。
回答が遅くなり申し訳ありません。
かなり前なのですっかり忘れてしまいましたが、管理者権限のPowerShellで公開鍵・秘密鍵・公開鍵ペアを作成したときに、生成されるファイルの場所を気にしていたのだと思います。
が、いま試してみたところ、管理者権限でも大丈夫そうでした(問題なく「c:\Users\Windowsのユーザ名\.ssh\」の下に作られました)。
なので特に気にしなくても良いかもしれません。
分かりやすい投稿ありがとうございます。
参考にさせて頂いています。
本投稿の「公開鍵認証でのSSH接続を確認する」で「パスワードが聞かれないこと」とあるのですが、何度やり直してもパスワードを聞かれてしまいます。
何処に問題がありそうか、アドバイス頂けませんでしょうか。
コメントありがとうございます。
SSH接続でパスワードを聞かれるとすると、公開鍵認証になっていないか、鍵ファイルにパスフレーズを設定したからではないでしょうか。
ありがとうございます。
再度上から実施し、正常にパスワードなしでアクセスすることが出来ました。
フォルダの権限設定に不備があったようです。
お騒がせ致しました。