GitHubのプライベートリポジトリをLolipopサーバーにcloneするまで

#LolipopサーバーとGitHubの連携
作ったアプリやAPIをサーバーにデプロイする際、GitHubからpullできると便利ですよね。

GitHubを経由することで一々変更したファイル選んでアップロードとかしなくても、「ローカル側でpush → サーバー側でpull」するだけでデプロイ出来ちゃいます。
更に、GitHub Actionsを使えばpushするだけで、自動でデプロイまでしてくれるみたいです。

私もそういった方法で作ったアプリをデプロイしたくて、LolipopサーバーでGitHubとの連携を試みたのですが、鍵を作成し登録しようとした時に

```
$ ssh-add ~/.ssh/id_rsa
-bash: ssh-add: コマンドが見つかりません
```

こうなり詰みました。


そこで、色々調べていたところ、`"コマンドが見つかりません"`に対する直接の解決策ではありませんが、
セキュリティ面も考慮したサーバーとGitHubの連携方法を見つけて、無事GitHubからレポジトリをcloneまですることが出来たので、
今回はその方法を記事にしたいと思います。

##概要
これからやろうとしていることは以下の通り
1. 鍵を作成
2. ssh-agentに鍵を登録
3. GitHubにも鍵を登録
4. サーバーとGitHub繋がる！`git clone`, `git pull`ができる⤴︎
###そもそもssh-agentとは
鍵を預かってくれる仕組みのこと。GitHubとssh-agentが同じ鍵を持ってることで、お互いで情報のやり取りができるようになります。`ssh-add`というコマンドでssh-agentに鍵を登録できます。
###サーバー上のssh-agentに鍵を持たすのは危険！！
GitHubとサーバーを連携させるためにサーバーのssh-agentに鍵を置いておくのはセキュリティ上あまりよろしくないそうです。サーバーは２４時間誰からのリクエストにも応えるために動いているので、そんなところに鍵を保管しておくのは確かに危険ですね^^;

ではどうするか？その答えが「**エージェント転送機能**」です。
この機能を使えば、鍵はローカルで保管し、ローカルからその鍵を使ってGitHubとサーバーで情報のやり取りをさせることができます。

このやり方は下記の記事を参考にしました。
https://blog.wackwack.net/entry/2016/11/13/215529

##手順
それでは具体的な手順です。

- ロリポップのユーザー管理画面からsshを有効にする
- ローカルでの作業
 - 鍵の作成
 - ssh-agentに秘密鍵を登録
 - サーバーに公開鍵をコピー
 - .ssh/configにhost追加
- GitHubに公開鍵を登録
- サーバーでの作業
 - ~/.ssh/configにGitHubをhostとして追加
 - gitコマンドが叩けるか確認
 - お好みの場所に欲しいレポジトリをclone

##ロリポップのユーザー管理画面からsshを有効にする

ロリポップサーバー管理画面の「サーバーの管理・設定」からSSHを選択
以下の画面が出たら`SSHを有効にする`ボタンをクリック
![obj_ssh_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/91a6f542-2e1a-3c2f-8e73-b4149a33a217.gif)

SSHの有効が完了すると以下のような画面が表示されます
![obj_ssh_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/595fbbd2-bb06-b222-6271-cb5b4d2522c0.gif)

ローカルのターミナルから次のコマンドでサーバーにログインできるか確かめてみましょう

```
$ ssh アカウント@サーバー -p接続ポート
```

`アカウント` `サーバー` `接続ポート`はSSH有効化完了の画面に表示されているものを使ってください

パスワードを聞かれるので、SSH有効化完了画面のパスワードを入力して以下のような表示になったらログイン成功です
![ssh_loged_in.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/0c5b4ca8-449f-8b3b-c12f-7b2895d33e95.png)
次はローカルで作業するので`exit`コマンドで一旦ログアウトしましょう。

##ローカルでの作業

###1. 鍵の作成
ローカルに戻り`ssh-keygen`コマンドで鍵を作ります

```
$ ssh-keygen
Generating public/private rsa key pair.

# 鍵の保管場所を聞かれます。デフォルトで/root/.ssh/id_rsa
Enter file in which to save the key (/root/.ssh/id_rsa):

# パスフレーズの設定を聞かれます。未設定のままでもOK。
Enter passphrase (empty for no passphrase):
Enter same passphrase again: # パスフレーズ再確認

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@xxx.xxx.xxx.xxx.ZZZ
The key s randomart image is:
+---[RSA 2048]----+
| ..o             |
|. + oo . .       |
| = *+ o . .      |
|o B..+.   .o     |
|　キラキラしたやつ  |
|. +o+oo ..=+     |
| oo=o+   =  .    |
|..o.o.  . .      |
|++oo.            |
+----[SHA256]-----+
```
次のコマンドで鍵を確認

```
$ ls -al ~/.ssh
total 8
-rw-------   1 xxxxxxxx  staff  2622 Dec  8 21:57 id_rsa
-rw-r--r--   1 xxxxxxxx  staff   585 Dec  8 21:57 id_rsa.pub
```
###2. ssh-agentに秘密鍵を登録
今現在ssh-agentで管理している秘密鍵があるか確認します。

```
$ ssh-add -l
The agent has no identities
```
無ければ次のコマンドでssh-agentに秘密鍵を登録

```
ssh-add ~/.ssh/id_rsa
```
もう一度確認してみると

```
$ ssh-add -l
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
これで、ssh-agentに秘密鍵が登録されてることが確認できました。


###3. サーバーに公開鍵をコピー

```
$ ssh-copy-id -i ~/.ssh/id_rsa.pub アカウント@サーバー -p接続ポート
```

`アカウント` `サーバー` `接続ポート`はサーバーにログインする時と同じものです。
パスワードも聞かれるので同じものを入力しましょう。

###4. .ssh/configにlolipopをhostとして追加
.ssh/configを開きます。

```
$ vi .ssh/config
```
次の設定を入力します。

```
Host lolipop
  HostName     <サーバー>
  Port         <接続ポート>
  User         <アカウント>
  IdentityFile ~/.ssh/id_rsa
```
このホストの設定が完了すると、`ssh lolipop`だけでパスワードなしでサーバーにログインできます。

##GitHubに公開鍵を登録
先ほど作った公開鍵を開きます

```
$ vi ~/.ssh/id_rsa.pub
```

次のような文字列が表示されるので`ssh-rsa ~`から`~ xx=`までをコピーします。

**ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=** xxxxxxx@xxxxxxx
~                                                                

GitHubのページから次の画像の順番でSSHの登録画面まで行き先ほどコピーした文字列をペーストしてください。

１. 右上のメニューから`Settings`を選択
![github_ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/2b1ff753-3721-d776-d551-661f43e376a3.png)

２. 左のメニューから`SSH and GPG kyes`を選択
![github_ssh2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/33dec9eb-f97b-5e7d-0a06-a174421fa187.png)

３. `New SSH key`を選択
![github_ssh3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/5654e213-fbac-8946-fdab-b9a11f4413c3.png)

４. タイトルは自分がわかる名前をつけましょう。Keyの欄に先ほどコピーした鍵をペーストして`Add SSH key`を押せば登録完了
![Screen Shot 2021-02-18 at 0.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005560/8bcf206c-20a1-a9f9-5f2d-2023d6ade6b0.png)


##サーバーでの作業
次にサーバー側の設定です。
###~/.ssh/configにGitHubをhostとして追加

```
$ vi ~/.ssh/config
```
configを開いたら、以下を入力

```
Host github
  HostName github.com
  Port 22
  User git
  ForwardAgent yes
```

この`ForwardAgent yes`が**エージェント転送機能**を有効にしてます。
一度ログアウトして`ssh -A lolipop`でログインするとエージェント転送機能でGitHubとの連携ができています。

後は
###お好みの場所に欲しいレポジトリをcloneしましょう