静的ウェブサイトを運営しているなら、多くの場合はサーバ側にツールチェーンを入れず、まずWindows上でビルドしてからアップロードするのが便利です。そうなると、ファイルの同期方法を考える必要があります。
最初に試したのは scp です。コマンドも簡単でよく使われます:
|
|
でも正直、ぼくは scp はおすすめしません。理由は二つあります。まず、毎回全量コピーしかできず、不要になったファイルは削除されません。つまり、真の同期にはなりません。
次に、権限の扱いがちょっと微妙です。多分クロスプラットフォームので、こんな感じになります:
|
|
他のユーザーにも読み権限が付いてしまうから、動かないことはないですが、推奨される状態ではありません。一般的には、専用のユーザーでウェブサイトファイルを管理し、そのユーザーには読み書き権限を付与、ウェブサーバ側ユーザー(nginxなら www-data)には読み取りのみ、他のユーザーはアクセスなし、という権限管理が望ましいです。
このような設定を実現するにはLinuxの rsync が便利です。Windowsから使う場合は cwRsync か WSL (Windows Subsystem for Linux) を使うのが一般的です。
サーバ側の権限設定
ウェブ管理ユーザーが web、ウェブサーバユーザーが www-data の場合、まず web を www-data グループに追加しておきます。そうしないとグループ権限で問題が出ます。
|
|
次にサイトディレクトリの所有者とモードを設定します:
|
|
g+s(setgid)は、新しく作られるファイルやディレクトリが親ディレクトリのグループを継承するようにするものです。必須ではありませんが、推奨です。
設定が完了したら、Windows側に戻ります。
cwRsync
cwRsync は Windows 上で使える rsync の実装で、アルゴリズムは通常の rsync と同じです。
GitHubからダウンロードして解凍すればすぐ使えます。同期スクリプトの例:
|
|
環境変数には通常すでに OpenSSH の ssh.exe が含まれているため、ここでは cwRsync のパスを環境変数に追加せず、絶対パスで呼び出しています。何らかの理由で -e オプションで使用するsshを明示し、パスは //?/ を付けないとホスト名として誤認される場合があります。
--deleteは余分なファイルを削除、--chmodはディレクトリやファイルの権限を明示的に指定します。ディレクトリの2はsetgidです。
WSL
WSL を使うとさらに簡単です。必要であればインストールも簡単です。
同期コマンドの例:
|
|
ネイティブではないので、AI翻訳を使いました。