WSLでrsyncを使えるようになったので、デプロイ用のスクリプトを組んでアップロード作業をラクにしていきます。

1. deploy.shを作成

まずは、Hugoのプロジェクトルート(hugo.tomlがある場所)に、deploy.shを作成します。

実行権限を付与

chmod +x deploy.sh

権限付与は忘れがちだけど、これをしないと動かない。

deploy.sh

#!/usr/bin/env bash
set -e

echo "Building site..."
hugo --gc --minify --cleanDestinationDir

echo "Deploying to server..."
rsync -avz --delete public/ xs:yourdomain/public_html/

echo "Done!"

~/.ssh/configファイル

以前設定した、SSH接続の設定は以下の通り。
レンタルサーバー(エックスサーバー)へのSSH接続の例です。

Host xs
    HostName xxxxx.xsrv.jp
    User xxxxx
    Port 10022
    IdentityFile ~/.ssh/xserver.key

2. スクリプトの説明

!/usr/bin/env bashとは?

  • 「このスクリプトは bash で実行する」と宣言

set -eとは?

  • どこかのコマンドがエラー(終了コード≠0)を返したら、即スクリプトを中断する
  • ビルド失敗してるのに 空の public を rsync で –delete したらサーバーのファイルが消えるので、事故防止用のブレーキ

hugo --gcとは?

  • --gc : garbage collection(ゴミ掃除)

具体的には

  • 使われなくなった生成物を削除する
  • 特に影響するのは:
    • 画像処理キャッシュ
    • resources/_gen/ 配下
    • 古いビルド成果物

なぜ必要?

  • 記事を削除・リネームしたとき
  • 画像を差し替えたとき
  • shortcodes / pipes を使っているとき

前のビルドの残骸が public に混ざる事故を防ぐ

–delete との相性が良い

今のdeployはrsyncでこんな感じ。

rsync -avz --delete public/ ...

ここで --gc が無いと:

  • Hugoは「消すべき生成物」を残す
  • rsyncは「あるもの」を忠実に残す
  • 結果:消した記事がサーバーに残る

だから、--gc--delete はセットの方がいい。
要するに、サーバーとローカルの状態が一致するってこと。

hugo --minifyとは?

  • --minify : HTML / CSS / JS を圧縮

効果

  • ファイルサイズ削減
  • 転送量削減
  • 表示速度わずかに向上

注意点

  • デバッグ時は読みにくい
  • 生成結果を直接読むことがほぼないなら問題なし

hugo --cleanDestinationDirとは?

  • ビルドを開始する前に、public フォルダ内にある「今回のビルドで生成されないファイル」をすべて削除

3. rsyncコマンドの詳細

rsync -avz --deleteとは?

「ファイルやディレクトリを、送り先と全く同じ状態に同期する」 ための非常に強力で一般的なコマンド。
バックアップやサーバー間のデータ移行によく使われるみたい。

  • rsync : コマンド名
    • Remote Syncの略。差分だけを転送する効率的な同期ツール
  • -a : アーカイブ
    • 最も重要。 権限(パーミッション)、所有者、タイムスタンプ、シンボリックリンクなどを維持したままコピーします。
  • -v : ビュー(詳細)
    • 実行中に「今どのファイルをコピーしているか」を画面に表示
  • -z : 圧縮
    • 転送中にデータを圧縮して、ネットワークの帯域を節約
  • --delete : 削除同期
    • コピー元にないファイルがコピー先にあれば、それを削除

–delete オプションの重要性

このオプションがあるかないかで、結果が大きく変わる。

  • –delete なし: コピー元に新しいファイルが増えればコピー先に追加されますが、コピー元で消したファイルは、コピー先に残り続ける。

  • –delete あり: コピー元で消したファイルは、コピー先からも消去される。
    これにより、両方のディレクトリが「鏡合わせ」のように完全に一致。

⚠️ 使用上のアドバイス

–delete は非常に強力で、パスを間違えるとコピー先のデータを一瞬で消し去ってしまうリスクがある。

初めて実行する際や、大事なデータを扱う際は、末尾に -n または --dry-run をつけて実行した方がいいらしい。
これをつけると「実際には何もコピー・削除せず、実行したらどうなるか」の結果だけを表示される。

4. .htaccessどうする?

私は、staticディレクトリに、レンタルサーバーの.htaccessをコピーして置いているから、rsyncは簡潔にしている。

もし、サーバー側に「Hugoとは無関係に置いておきたいファイル(例:認証用ファイルや別システムのディレクトリ)」があれば、以下のように rsync コマンドに除外設定を加えるといいかも。

# 例:サーバー上の .htpasswd や特定ディレクトリを削除対象から外す
rsync -avz --delete \
    --exclude '.ht*' \
    --exclude 'other_system/' \
    public/ xs:yourdomain/public_html/

rsyncは便利だけど、油断すると全部持っていくから。

rsync、てめー、盗みやがったなーーー。
ってならないためにもね。

5. Neovimからスクリプトを実行

:!./deploy.sh

これだけ。
これだけで、hugoのビルドからrsyncまで自動でやってくれる。
らくちん。
この瞬間、WindowsからWSLに移行して良かった、と実感できる。

そもそも、Windowsでrsyncが使えたら、
こんな面倒な設定しなくてもいいんだけど、
今回は、目をつむってやることにする。

6. 上手くいかないときは

  • SSHの設定ミス
  • deploy.shに実行権限がない
  • カレントディレクトリがちがう

動かない原因は、大体がこの3つのうちのどれか。

asyncはSSH接続

asyncはレンタルサーバーにSSH接続する設定にしてるので、
SSHの設定が上手くいってないと、エラーになる。

権限ある?

実行権限の付与は忘れがち。

chmod +x deploy.sh

pwdをチェック

Neovimのカレントディレクトリどうなってる?

:!pwd
rsync -avz --delete public/ ...

rsyncの設定で、publicディレクトリを相対パスにしてるから、
カレントディレクトリが違うと、上手く動かないかも。

私は、環境を変えても、そのまま動くように相対パスしてる。
まあ、ここらへんは個人の好みかもしれない。

これ以外の原因で動かないなら、
私にはちょっと分からない。

私の環境ならこれで動いてるから、
これでよし。

ここまでの設定がすごく長かったけど、
WindowsからWSLに移行して良かったと思えるぐらいはラクになった。

さあ、これでやっと、
日記を書く環境が整ってきた。