Reactやvueアプリをサーバーにアップロードする場合rsyncというLinuxコマンドを使用して手軽に更新できる。
しかし、Windowsからだと情報も少なく様々なエラーでなかなかうまくいかない箇所が多かった。
そこで恐らく多くの人が遭遇するトラブルを解決しながら一通りの手順を解説する。
サーバー側のディレクトリにローカルのファイルを同期するlinuxコマンド。
これの良いところはgitのようにリモートとローカルの「差」を検知してそれに応じてデータ通信をするので、巨大なアプリであっても変更されたファイルだけ送受信すれば良いところ
gatsbyのような大量のファイルを扱うアプリでは非常に重宝する。
サーバーがrsyncに対応している必要があるので注意。
今回この記事はConoHa Wingを使用している(rsync対応サーバ)
この手の記事を検索すると、殆どがGithub Actionsを経由してrsyncを実行している。
恐らく上で書いたようにWindowsから作業するとエラーが多く使用感が悪いためだと思われる。
ただGithub Actionsを利用するとなるとgit側にビルド後のファイルをアップロードする必要がありコミット時等に重要なファイルの更新履歴などが見にくくなってしまう。
そこでこの記事ではWindowsから直接webサーバーと同期できる方法を記す。
この記事ではSSHのターミナルとしてCygwinを使用することとする。
そもそもWindowsにはrsyncの機能がないがCygwinはインストール時にこの機能を追加できる。
この記事では誰でも分かるレベルのインストール手順は省略する。
ただSelect Local Package Directoryの画面でパッケージを保存するディレクトリの初期値がWindowsのTempフォルダになってしまっているため、勝手に削除されてしまう恐れがある。
ここだけ変更することをおすすめする。
私は上のようにCygwinと同じディレクトリに作成した。
インストール時にパッケージを選択する箇所があるが、ここでrsyncなどの機能を追加する必要がある。
次の2つをチェックして次へ(検索を利用すると楽)
初めてインストールする場合、その他の余計なものは極力インストールしないほうが良い。
インストールに関しては次の記事が大変参考になる。
Cygwinを起動して自分のサーバーへSSHログインを試しておく。
この時私は秘密鍵ファイルを使ってログインしたのだが次のエラーに悩まされた
Warning: Identity file [ファイル名].pem not accessible: No such file or directory.ファイルが無いと言われる。
これはCygwin本体がアプリ配下のディレクトリ以外に直接アクセスできないようになっているからだ。
この場合はディレクトリパスの頭に/cygdrive/をつけてやれば良い。
つまり/cygdrive/c/users/~のようになる。
実際に動作したSSHコマンドは次のようになった。
ssh [ユーザ名]@[サーバ名] -p 8022 -i /cygdrive/c/user/.ssh/[ファイル名].pem8022はサーバーによって違うポート番号
[Cygwinのインストールディレクトリ]/etc/fstabファイルをメモ帳で開いて編集する。
none~から始まっている行にnoaclとnotexecを追加する
変更後例
none /cygdrive cygdrive binary,posix=0,user,noacl,notexec 0 0
次の記事が大変参考になる。
rsyncする時にLinux側のファイルのパーミッション設定が変になってアクセスできなくなるため。
rsyncはデフォルトでWindows側のセキュリティ設定をLinux側のパーミッションに変換して設定してしまう。
そもそもLinuxとWindowsは別物なのでこれをnoaclにしておかないと自動的にすべてのファイルがアクセス不可能になってしまう。
Cygwinにて次のコマンドで完全に成功した。
rsync -ahvz --delete --info=progress2 -e "/cygdrive/C/cygwin64/bin/ssh -p 8022 -i /cygdrive/C/Users/[ユーザ名]/.ssh/[キー名]" /cygdrive/C/Users/[ユーザ名]/Documents/[なんやらかんやら]/ [ID]@[サーバ.com]:./public_html/ultra-noob.com/それぞれ何をやっているのかメモする
言うまでもなくrsyncを呼び出すコマンド
オプション。
これに関しては-aが最も重要かと思う。
-aはフォルダを再帰的にコピーしたり、タイムスタンプを継承したりと、おおよそ必要なものがセットになったオプション。
他は割と適当でもなんとかなりそう。わからなければこれをそのまま使えば概ね良いのではないだろうか。
コマンドは次のサイトが大変参考になった。
元フォルダ存在せず、コピー先フォルダに存在した場合、コピー先のファイルを「削除」する。
gatsby.jsの場合は同じページのデータでもビルドするたびにファイル名が変わる。
つまり、このオプションがないとコピー先にごみが溜まり続けてしまう。
コピーの進行状況を見やすくするオプション。
このオプションを指定した次にSSHのログインコマンドを指定する重要オプション。
これに続くコードをダブルクォーテーションで囲ってSSHにログインする。
"/cygdrive/C/cygwin64/bin/ssh -p 8022 -i /cygdrive/C/Users/[ユーザ名]/.ssh/[キー名]"この中の/cygdrive/C/cygwin64/bin/ssh
ここがなぜsshではなく/cygdrive/C/cygwin64/bin/sshになっているのかというとCygwinではなくWindows側のコマンドプロンプトからsshだけで呼び出した時にWindows内蔵のsshが優先的に呼ばれてしまうため。
これを追加しないとバッチファイル化して起動するときにエラーで接続できない。
Cygwinの中でコマンドを打つだけなら必要ないのだが、後の項でバッチファイル化して簡単に起動する方法を記載するため、始めからこのようにしている。
もちろんこのフルパスをCygwinで打ち込んでも正常動作する。
フルパスでSSHを呼び出す件に関しては次の記事が大変参考になる。
最後にコピー元、コピー先のパスを指定している。
/cygdrive/C/Users/[ユーザ名]/Documents/[なんやらかんやら]/ [ID]@[サーバ.com]:./public_html/ultra-noob.com/ここで最初にコピー元、次にコピー先のパスを指定する。
このときコピー元の最後のスラッシュが重要であることを覚えておく
ここにスラッシュをつけない場合、出力結果は./public_html/ultra-noob.com/[なんやらかんやら]/[ファイルたち]というようなディレクトリ構造になる。
スラッシュを付けた場合は、コピー元のディレクトリを「展開して」その中身をコピーという動きになる。
つまり./public_html/ultra-noob.com/[ファイルたち]のようになる。
コピー先の頭が./から始まっているがConoHa Wingのサーバーで実行する場合このドットが抜けるとエラーで動かない。
上までの例で既に正常に動作するのだが、ダブルクリックorコマンドラインから簡単に呼び出せるようにしたい。
そこで次のバッチファイルを作成した。
@echo off
rem バッチファイルのファイル名をrsyncにするとエラーになるので注意
SETLOCAL
SET PATH=C:\cygwin64\bin;%PATH%
SET PORT_NO=8022
SET KEY_PATH=/cygdrive/C/Users/[ユーザ名]/.ssh/[キー名]
SET SSH_USER=[ID]@[サーバ.com]
SET PATH_SOURCE=/cygdrive/C/[なんやらかんやら]/
SET PATH_DIST=%SSH_USER%:./public_html/ultra-noob.com/
rsync -ahvz --delete --info=progress2 -e "/cygdrive/C/cygwin64/bin/ssh -p 8022 -i %KEY_PATH%" %PATH_SOURCE% %PATH_DIST%
pauseSET PATHでCygwin本体のパスを入れることでその配下のrsyncコマンドをバッチファイルから呼び出せるようにしている。
また、上でも述べたがここで-eに続くsshコマンドはcygwin64/bin/のなかにあるものを直接呼び出さないとWindows側のSSHが使用されてしまいエラーとなる。
更にこのバッチファイルをコマンドラインから呼び出す場合はcallコマンドを使う。
既に上で一度紹介しているが、こちらも次の記事を参考にさせていただいた。
今回多数のWEBサイトを参考にさせていただきました。
この場をかりて感謝します。素晴らしい記事をありがとうございます。
