GitとLinuxサーバの連携と運用

Git管理されたプロジェクトをLinuxサーバのApacheなどと連携する場合の運用仕様案を提示します。本手順は、GitLabで管理されているPHPベースのWebシステムを、本番サーバへ安全に運用・反映する方法をまとめたものです。

サーバ環境とデプロイ

Gitの最新コンテンツを直接デプロイするのではなく、人間が一度確認する体系を用意する。/var/www以下を同一の持ち主で固定しておけば、Linuxを使う人、WinSCPを使う人、システムを作って必要なものだけデプロイするシステムを作る人などプロジェクトによって適用方法は選べられる設計とする。

/var/www 以下を webというオーナーとする。LinuxのCRONはrootで行うとする。

  • PHPシステム
  • 静的HTML
対象構成:

Git取得領域
/var/www/git/[PROJECT]

本番領域
/var/www/[HOSTNAME]

Document_Root
/var/www/HOSTNAME/html

本運用では、

GitLab
 
/var/www/git/[PROJECT]
 
管理者判断
 
/var/www/[HOSTNAME]

という2段構成を採用します。

最新版は自動取得されますが、本番反映は手動で実施します。


運用方針

採用理由

本番サーバへ自動デプロイすると、

  • 誤ったソースを即座に本番へ反映してしまう
  • 検証前のソースが公開される
  • ロールバックが複雑になる
  • Gitに不慣れな担当者が対応できない

といった問題があります。

そのため、

最新版取得と本番反映を分離

します。


ディレクトリ構成

Git管理領域
/var/www/git/[PROJECT]

GitLabから取得したソースを保管します。



本番領域
/var/www/[HOSTNAME]



サーバ管理者向け手順

Gitのインストール

Rocky Linux / AlmaLinux

dnf install -y git

SSH鍵作成

ssh-keygen -t ed25519

公開鍵をGitLabへ登録する。

確認

cat ~/.ssh/id_ed25519.pub

GitLab接続確認

SSHポートが20022の場合

ssh -p 20022 -T git@gitlab.example.jp

成功例: Welcome to GitLab, @username!


初回取得

mkdir -p /var/www/git

cd /var/www/git

git clone ssh://git@gitlab.example.jp:20022/group/project.git

普段はWeb担当者も参照できるように

所有者設定

chown -R web:ftp /var/www/git/project

とする。


Git自動取得

更新スクリプト

ファイル

vi /usr/local/bin/git-pull-project.sh

#!/bin/bash

set -e
REPO="/var/www/git/PROJECT"
chown -R root:root "$REPO"
git -C "$REPO" pull
chown -R web:ftp "$REPO"

権限付与

chmod 700 /usr/local/bin/git-pull-project.sh

Cron登録

rootで

crontab -e

登録内容

*/5 * * * * /usr/local/bin/git-pull-project.sh >/dev/null 2>&1

これにより、

GitLab
 ↓
/var/www/git/PROJECT

が常に最新状態になる。


Web担当者・システム担当者向け手順

最新版の確認

取得済ソース確認

cd /var/www/git/[PROJECT]
git status


Commit履歴確認

git log --oneline -10

本番との差分確認

rsync -avn \
  --exclude='.env' \
  /var/www/git/[PROJECT]/src/ \
  /var/www/HOSTNAME/

反映対象のみ確認する場合


本番反映

rsyncで反映

rsync -av \
  --exclude='.env' \
  /var/www/git/PROJECT/src/ \
  /var/www/HOSTNAME/

除外するもの

オプション説明

--exclude='.env'

理由

  • DB接続情報
  • APIキー
  • メール設定

ログも除外する場合

rsync -av \
  --exclude='.env' \
  --exclude='logs/' \
  /var/www/git/PROJECT/src/ \
  /var/www/HOSTNAME/

など本番固有情報を保護するため。


WinSCPによる運用

GitやLinuxコマンドに不慣れな担当者向け。

コピー元

/var/www/git/[PROJECT]/xxx

コピー先

/var/www/[HOSTNAME]/xxx

WinSCPでドラッグ&ドロップによる反映が可能。



メリット

  • 本番への自動反映事故を防止
  • GitLabの最新版を常に保持
  • Git管理と公開領域を分離
  • WinSCPでも運用可能
  • Git操作に詳しくない担当者でも対応可能
  • ロールバックしやすい
  • サーバ管理者とWeb担当者の役割分担が明確