さよならFTPツール。VS Codeからファイルを即サーバー同期して作業効率アップ

## はじめに
令和という新しき時代の幕開けにもかかわらず、いまだに「FTPクライアントソフト」(FileZilla、WinSCPなど)でサーバーに手動ファイルアップ作業をしている人、いませんか？ 

**そんなあなたに朗報！**ちょっとした設定だけで、楽にファイルアップできる環境を整えられるんです。さあ、これからはFTPクライアントを立ち上げてちまちまアップする、そんなひと手間を減らしましょう！ (謎の通販番組調…)

まずは**VS Code(※)でコード編集が完了したら、即サーバーアップできるおすすめの方法**を紹介します。
**※** 正式名称：[Visual Studio Code](https://ja.wikipedia.org/wiki/Visual_Studio_Code)。Microsoft製の無料コードエディター

また、別の選択肢についても若干触れています。検討のうえ適した方法をチョイスしてみてください。

## 本記事対象
### 対象となる人
- Webの仕事でFTPクライアントを使用している、または使用せざるを得ない人
- 個人サイト含む比較的小規模案件で、もっとお手軽にサーバーへファイルアップ・同期したい人

※ 要するに**個人開発レベル + α** くらいです

### 対象外の人
- [CIツール](https://cloudbees.techmatrix.jp/devops/ci/)(JenkinsやCircleCIなど)で自動デプロイでき、FTP等を介さない環境メインの人
- ホスティングサービス(GitHubやBitbucket、GitLab)などからリモートサーバーへ自動アップする機構を有している人
- 複数人開発で、ある程度複雑なリリースフローを持っていたり、十全な検証・確認作業が必要だったりする中～大規模プロジェクトに携わる人

## 選択肢1 VS Code拡張機能「SFTP」でサーバーにファイルを即アップする設定と方法
VS Codeは機能豊富で使い勝手が良く、拡張性の高い無料コードエディターです。Webコーディングをする人でまだ使ったことがなければ、ぜひ一度**[試してみてください](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)**。

さて、エディター上からファイルを即サーバーアップするには、「**[SFTP](https://github.com/liximomo/vscode-sftp)**」という拡張機能をインストールして利用します。これによってVS CodeがFTPクライアントと同じ役割を果たし、わざわざテスクトップアプリを立ち上げてファイルアップする手間が軽減されます。

「FTPやSFTPって何だろう？」という人は良かったら以下参照記事をどうぞ。
-> [無料FTPソフト10種類を徹底比較！FTPの仕組みも一から教えます！](https://engineer-club.jp/ftp-soft)
-> [FTP/FTPS/SFTPとは！違いについて](https://www.nkshopping.biz/index.php?FTP%E3%81%A8%E3%81%AF)

### SFTP同期の設定方法
1. 拡張機能「SFTP」のインストール
① VS Codeを起動し、左サイドバーの「拡張機能」アイコンをクリック
② 「拡張機能」欄の入力バーに`sftp`と入力すると、候補の一番上に「SFTP」拡張機能が表示されるので「インストール」をクリックする。「インストール」表示が消えたら使用可能です
<img width="1124" alt="VS Codeのツール操作画面。SFTP拡張機能をインストールするための項目を赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/9b92d68b-6b0e-a03d-b49e-09b38fe72ab1.jpeg">

2. VS Code上で設定ファイル作成
① `Ctrl + Shift + P (macならCommand + Shift + P)`で「コマンドパレット」が出現します。
ここに`SFTP: Config`と入力実行します
<img width="897" alt="VS Codeのツール操作画面。コマンドパレットを赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/25d7cd32-5ccd-98e7-304d-e0dd2d5a7454.jpeg">
② すると、プロジェクトルートに.vscode/**sftp.json**が自動で作成されます。sftp.jsonに必要な設定は、のちほど工程4にて入力していきます
<img width="644" alt="VS Codeのツール操作画面。SFTP: Configコマンドによって生成された.vscodeフォルダおよびsftp.jsonファイルを赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/9dbe2d03-7c96-b0cf-253a-78a89de7d2b0.jpeg">

3. 利用サーバーのサーバーパネル(管理画面)でSSH認証キーを発行
筆者は個人で[エックスサーバー](https://www.xserver.ne.jp/)を利用しているため、これを例に解説を進めます。エックスサーバーを利用していない人は、各自のサーバー環境でのSSH設定方法やパスワードの確認をお願いします。
**必要なのはSFTP接続するためのSSH設定(秘密鍵の作成)です**。
　
① エックスサーバー「サーバーパネル ログイン」から管理画面にログイン
<img width="763" alt="エックスサーバー・サーバーパネルへのログイン画面スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/453e7c48-2de0-0450-11b6-1531d4f2788c.jpeg">
② 「SSH設定」を選択
<img width="387" alt="エックスサーバー・サーバーパネルのSSH設定ナビゲーションを赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/6dfd7ec9-2843-83a6-7981-32a39d2d4ef9.jpeg">
③ SSH設定で「ONにする」を選択
<img width="554" alt="エックスサーバー・サーバーパネルのSSH設定画面で「ONにする」項目を赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/0dadb954-0f74-6e38-02b5-aade6dc6ad7a.jpeg">
④ 次に「公開鍵認証用鍵ペアの生成」タブを選択。テキスト入力欄に適当なパスフレーズを入力します。パスフレーズはのちほど使うのでメモに控えておいてください。「確認画面へ進む」→(遷移)→「生成する」を選ぶと「**(サーバーID).key**」というファイルが、ブラウザからPCへ自動ダウンロードされます
<img width="558" alt="エックスサーバー・サーバーパネルの公開鍵認証用鍵ペア生成画面で操作必要箇所3箇所を赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/088ff661-029e-0ea2-b916-4dac34e67df7.jpeg">
<img width="559" alt="エックスサーバー・サーバーパネルの公開鍵認証用鍵ペア確認画面の生成するボタンを赤枠で明示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/2f382941-1163-5088-32e9-e055bdf96d96.jpeg">
⑤ 「**(サーバーID).key**」ファイルを自PCの任意の場所に保存し、保存場所のパスを控えてください。
・秘密鍵ファイル保存場所の例(Windows)：`/Users/(PCユーザーフォルダ名)/.ssh/(サーバーID名).key`　※ディレクトリ名`/ssh/`でもOK
　
設定したパスフレーズと「(サーバーID).key」ファイルの情報は、このあとsftp.jsonファイルに記載します

4. sftp.jsonファイルに必要情報を入力
VS Codeでの設定に戻ります。工程2で生成された.vscode/**sftp.json**ファイルに対して、サーバーへSFTP接続するための必要情報を入力します。sftp.jsonを開いて以下例をもとに個別情報を設定します
  
```json-doc:sftp.json
{
  "host": "(○○○○.xserver.jp)",  // サーバーのホスト名(サーバー情報から確認)
  "protocol": "sftp", // 接続形式
  "port": 10022,  // ポート番号(10022はエックスサーバーの指定番号。一般的に22)
  "username": "(サーバーID)", // サーバーID(ログインID)
  "remotePath": "/home/(サーバーID)/(ドメイン名)/public_html/", // ファイルをアップするリモートサーバーのディレクトリ(絶対パス)
  "privateKeyPath": "/Users/(PCユーザーフォルダ名)/.ssh/(サーバーID名).key", // サーバーパネル(管理画面)から発行された秘密鍵のPCローカル側での保存場所を指定(絶対パス)
  "passphrase": "(original passphrase)", // サーバーパネル(管理画面)設定で指定した適当なパスフレーズ
  "password": "(original password)", // サーバーパネルのログインパスワード
  "uploadOnSave": false, // VS Codeでファイル保存した際に、リモートサーバーと同期するか、しないか(しないに設定)
  "downloadOnOpen": false, // VS Code起動時にリモートサーバーからファイルダウンロードするか、しないか(しないに設定)
  "ignore": [ // 以下のディレクトリおよび配下ファイルをアップロード・同期から除外
    "**/.vscode/**",
    "**/.history/**",
    "**/.git/**",
    "**/.DS_Store"
  ]
}
```

### SFTPアップロード・同期の使用方法
#### ファイル同期
VS Codeの「コマンドパレット」からコマンド**`SFTP: Sync Local -> Remote`**を実行し、指定した全ファイルをリモートサーバーにアップ(同期)します　※「コマンドパレット」は`Ctrl(Command) + Shift + P`で使用

コマンド`SFTP: Sync Remote -> Local`で逆にリモートサーバーからファイルダウンロードも可能です。
<img width="658" alt="VS Codeツール操作画面のコマンドパレット。sftp: syncと入力するとコマンドサジェストが出る" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/96b76e48-3342-6e02-a5a0-6008c10d0d6c.jpeg">

ここまでで無事サーバーアップ・同期されたことを確認できたら設定は完了です。お疲れさまでした。

#### 個別選択したファイルのみをアップロード
VS Codeのエクスプローラー(`Ctrl(Command) + Shift + E`)の該当ファイルを右クリックするとメニュー表示されます。**「Upload」をクリックすると個別にファイルアップロード**できます。
<img width="621" alt="VS Codeツール操作画面のエクスプローラー。ファイルを選択して右クリックするとUploadなど個別操作が選択できる" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/368e4090-f478-2b15-968b-7f30e45b3cb9.jpeg">


#### 補足事項・注意点
sftp.jsonの設定を`uploadOnSave: "true"`と記述することで、ファイル保存と同時に自動でリモートサーバーと同期できます。しかし"ファイル更新→即保存"という形だと、十分検証されていない不完全なコードがアップされかねません。負荷やリスクも高いので「コマンドパレット」からコマンドを打って**選択的にファイルアップ・同期する**ようにしておくのが安全です。

ローカルサーバーもしくはテストサーバー(staging)で、十分な確認・検証をしたのちに本番公開サーバーへアップするようにしましょう。

### VS Code「SFTP」の基本機能

| 機能 | 使い方 |
|:-----------|:-----------|
| 同期 (ローカルからリモート) | コマンド　**SFTP: Sync Local -> Remote** |
| 同期 (リモートからローカル) | コマンド　**SFTP: Sync Remote -> Local** |
| 個別にファイルアップロード | 該当ファイルの右クリックメニュー「**Upload**」|
| ローカルとリモートファイルの差分表示 | 該当ファイルの右クリックメニュー「**Diff with Remote**」|
| 双方向の同期 (最新ファイルに統合)  | コマンド　**SFTP: Sync Both Directions** |

---

## 選択肢2 VS Code拡張機能「Deploy」を使用して複数のサーバー設定をする
複数サーバーの設定がしやすい「**[Deploy](https://github.com/mkloubert/vs-deploy)**」拡張機能もあります。**setting.json**から設定をし、「コマンドパレット」に各種`Deploy`コマンドを入力することで、複数サーバーへのデプロイが可能になります。

今回「Deploy」の詳細を扱いませんので、詳しくは以下記事を参照してください。
-> [VSCodeで複数サーバーに対して，ファイルをアップロードする](https://gokids.hatenablog.com/entry/2018/10/23/210000)
<img width="1118" alt="VS Codeのツール操作画面。Deploy拡張機能を選択表示している" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/50017903-f141-3536-c06d-d134bebda515.jpeg">

---

## 選択肢3 「git-ftp」を使ってGitコマンドでサーバーアップする
「[git-ftp](https://github.com/git-ftp/git-ftp)」はGitのバージョン管理と連携して、現在のコミット(前回との差分)をFTPでアップロードしてくれます。ファイルをGit管理していて、作業者がそれなりにGitコマンドを使える場合や使いこなしに自信がある場合は選択肢としてアリでしょう。

ブランチ切り替え忘れやコマンドミスがあったとき、それがそのままサーバーに直アップされると考えると少し怖いですが…。

FTPそのものは暗号化通信を行わないためセキュリティ的に脆弱です。できればSFTP設定しましょう。VS Codeを使用するという前提での手軽さでいうと「SFTP」や「Deploy」の利用が少しだけ勝っているように感じます。

今回、詳細は扱いませんので設定方法など以下を参考にしてみてください。
-> [git ftpを使えるようにする(Windows, Mac)](https://qiita.com/sayama0402/items/d3d11bbc6b09b9b78527)

---
## ファイルバックアップに有効な「Local History」拡張機能を導入
### バックアップ自動化
ローカルとリモートでファイルアップ・同期する場合、考えておきたいのがバックアップ対応です。万一のことが起きて、せっかく更新したファイルが先祖返り(古いものに戻る)したり、消えてしまったりすることがあるかもしれません。

「**[Local History](https://github.com/zabel-xyz/local-history)**」拡張機能はプロジェクトルートに**.history**ディレクトリを生成し、ファイル保存のタイミングでその配下に変更履歴ファイルを残します。ファイル間の差分表示もでき、履歴ファイルがバックアップの役割を果たします。

保存が頻繁、触るファイル数が多いなどだと、けっこう膨大な数の履歴ファイルが残るので、明らかにいらないものは手動での削除もしています。

### 作業PCにだけ過去履歴ファイルを残す
二重作業を防ぐため、**.history**ディレクトリはリモートサーバーへのアップ対象から除外し、ローカル保存に留めておくのが良いです。本記事では、上記工程4のsftp.jsonに**`ignore`指定を記述することでアップ・同期対象から除外**しています。

### カスタマイズ設定も可能
履歴ファイルの保存/破棄日数や除外ファイル指定などカスタマイズ設定も可能です。詳しくは以下記事を。
-> [VSCode (Visual Studio Code)で簡単に履歴・バックアップが取れる拡張機能「Local History」が便利 | 設定方法](https://www.karelie.net/vscode-backup-local-history/#vscode_visual_studio_codelocal_history-3)
<img width="880" alt="VS Codeのツール操作画面。Local History拡張機能を選択表示している。歯車アイコンから詳細設定が可能" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97066/3ff0b2a2-ab71-e5fc-4c1d-1c4da02de13a.jpeg">

---

## おわりに
レガシーでアナログだと感じる属人的作業は極力なくしていきたいものですね。
FTPクライアントソフトのみんな、今までありがとう、そしてさよなら。
現場からは以上です。