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に移行して良かったと思えるぐらいはラクになった。
さあ、これでやっと、
日記を書く環境が整ってきた。