この記事では、VPSのホームディレクトリにbareリポジトリを作成し、push時に/var/www/htmlへ自動デプロイ(pull)する仕組みをbashフックで構築する手順を詳しく解説します。Gitを使った社内サイトやWordPressテーマの更新などに便利です。
Contents
前提条件
- VPSにrootまたはsudo権限でログインできること
- Gitがインストール済み(sudo apt install git など)
- /var/www/html に公開コンテンツを配置するWebサーバー設定済み
- クライアント側(ローカルPC)からSSH接続できること
1. bareリポジトリの準備
まず、VPSのユーザーhome配下に、bareリポジトリ用のディレクトリを作成します。ここでは『username』ユーザーで操作する例です。
ssh username@your-vps-ip
# ホームディレクトリへ移動
target="$HOME/git/myproject.git"
mkdir -p $target
cd $target
# bareリポジトリを初期化
git init --bare
上記で/home/username/git/myproject.gitが空のbareリポジトリとなりました。
2. リポジトリの所有者とパーミッション設定
Web公開ディレクトリとフックが適切に動くように、所有者・グループを合わせます。例としてwww-dataを使う場合:
sudo chown -R username:www-data /home/username/git/myproject.git
sudo chmod -R 775 /home/username/git/myproject.git
3. post-receiveフックの作成
bareリポジトリ配下のhooksディレクトリにpost-receiveスクリプトを作成します。push後に自動で/var/www/htmlへcheckoutする内容です。
# hooksディレクトリへ移動
cd /home/username/git/myproject.git/hooks
# post-receiveをエディタで作成
echo '#!/bin/bash
# デプロイ先ワークツリー
TARGET=/var/www/html
# Gitリポジトリワークツリー指定
GIT_DIR=/home/username/git/myproject.git
# すべてのブランチを強制checkout
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
# パーミッションをwww-dataに合わせる
chown -R www-data:www-data $TARGET
chmod -R 775 $TARGET
' > post-receive
# 実行権限を付与
chmod +x post-receive
これで、リモートにpushがあるたびに自動的に内容が/var/www/htmlへ反映されます。
4. クライアント側の設定
ローカルリポジトリを用意し、VPS上のbareリポジトリをoriginとして登録します。
cd /path/to/local/project
# リポジトリ未初期化の場合
git init
# リモートリポジトリを追加
git remote add origin ssh://username@your-vps-ip/home/username/git/myproject.git
# 初回push
git add .
git commit -m "Initial commit"
git push -u origin master
push後、VPSの/var/www/html配下にファイルがデプロイされていることを確認してください。
5. デプロイ動作の確認とトラブルシューティング
・pushしても反映されない場合は、VPS上でhooksの権限を再確認。
・/var/www/htmlのSELinuxが有効な環境では、semanage fcontextやrestoreconコマンドでラベル付与が必要です。
sudo setenforce 0 # 一時的に無効化
target="/var/www/html(/.*)?"
sudo semanage fcontext -a -t httpd_sys_content_t "$target"
sudo restorecon -Rv /var/www/html
6. ブランチ運用やWebhook連携
- master以外のbranch運用時は、フック内でcheckoutするbranch名を変数化するか、環境変数で切り替え。
- GitHub/GitLab連携の場合は、Webhook先をVPS上の受信スクリプトに指定し、git pullで同様にdeploy。
参考サイト