AdminLTE3

【git】VPSでbareリポジトリを作成し自動デプロイ(/home/username→/var/www/html)

投稿日:

この記事では、VPSのホームディレクトリにbareリポジトリを作成し、push時に/var/www/htmlへ自動デプロイ(pull)する仕組みをbashフックで構築する手順を詳しく解説します。Gitを使った社内サイトやWordPressテーマの更新などに便利です。

前提条件

  • 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。

参考サイト

 

-AdminLTE3

Copyright© Code Custom , 2025 All Rights Reserved.