Web サーバーに Github からデプロイする方法(既存のディレクトリを Git 管理に差し替える)

  • Git

github のリポジトリとサーバーを接続できるようにして、github にあるデータをgit pullコマンドでサーバーにデプロイするまでの流れを紹介します。

すでにサーバーにファイルがあり、そちらを git 管理に変更する方法の一例です。

サーバーへログイン、ユーザーの切り替え

ssh でサーバーにログインします。

ログインしたユーザーがウェブユーザー(apache や www-data、自分で作ったウェブユーザーなど)であれば、切り替える必要はありませんが、そうでない場合はウェブユーザーに切り替えます。

(例1) ログイン可能ユーザー

ウェブ実行ユーザーがログイン可能なら、ログインしておきます。

sudo su - <ユーザー名>

(例2) www-data のようなログイン不可ユーザー

debian の apache2 はデフォルトのウェブユーザーが www-data です。しかしこのユーザーにはログインすることができません。そのため、「特定のユーザーでコマンドを実行する」必要があります。

sudo -u <ユーザー名> <コマンド>

このログイン不可ユーザーを使うなら、ここは飛ばして次へ進みます。

鍵の作成

ここでは id_rsa (デフォルト名)で鍵を作ったとして進めます。すでに鍵がある場合は、そちらを使うか別の名前で鍵を作成します。

ログイン可能ユーザーの場合

ユーザーを切り替えたら、ssh-keygenで鍵を作ります。

cd ~/.ssh
ssh-keygen -t rsa -b 4096

.sshディレクトリがユーザーのホームディレクトリ(/home/{user})にないなら作成します。その際のパーミッションは 700 にしておきます。

ログイン不可ユーザーの場合

debian の www-data を例として進めます。このユーザーのホームディレクトリは/var/www/となるため、この場所に鍵を作ります。

# 鍵を置くところを作る
sudo mkdir /var/www/.ssh

# 所有者をウェブユーザに変更
sudo chown www-data:www-data /var/www/.ssh

# パーミッションを変更
sudo chmod 700 /var/www/.ssh

# 鍵作成
sudo -u www-data ssh-keygen -t rsa -b 4096

公開鍵を Github に登録

github のリポジトリへアクセスし、作成した公開鍵(id_rsa.pubSettings -> Deploy Keysにコピペして登録します。

catコマンドで中身を確認してコピーします。

# ログイン可能ユーザー
cat ~/.ssh/id_rsa.pub

# ログイン不可ユーザー
sudo cat <.sshディレクトリのある場所>/.ssh/id_rsa.pub

www-dataなら、/var/www/.ssh/id_rsa.pubにある(はず)

Git の初期化と設定

鍵を登録したら、github からデータを pull するための準備をします。以下のような流れです。

  1. 鍵を生成したユーザーにスイッチ(※)
  2. Git 初期化
  3. pull したくないファイルの設定
  4. upstream の設定など

(※)ログイン不可ユーザーの場合は、ログインユーザーではないため sudo su で切り替えることができません。sudo -u <ユーザー名> <コマンド>の形にして下記のコマンドを実行します。

※念のため、バックアップを取ってから行うことをお勧めします。

(1)Git 初期化

これはおそらくドキュメントルートなどになるはず。

cd <Git管理に変更したいディレクトリ>

# 初期化
git init

(2)pull させないファイルの設定

ここでエディタを起動させて、sparse-checkout の設定を行います。

sparse-checkout では、Git 管理しているファイルで pull したくないもの(README.md)などを設定します

# sparsecheckout 有効化
git config core.sparsecheckout true

# 設定
vi .git/info/sparse-checkout

設定の例

まず最初に全てのファイルを許可/*したのち、!ファイル名で pull したくないものを追加していきます。以下はなんとなくの例です。

/*
!.gitignore
!PULL_REQUEST_TEMPLATE.md
!README.md
!_src/

終わったら :wq もしくは ZZ で保存

(3)リポジトリの設定、取得

準備ができたので、pull してみます。https ではなく git プロトコルの方を登録します。

# 登録
git remote add origin <gitのリポジトリ>

# pull
git pull origin master

# upstream の設定
git branch --set-upstream-to=origin/master master

# pull
git pull

ですが、git で管理しているファイルがすでに存在していると思うので、そちらは全て削除してから pull を行います(これについてはもっといい方法があるかも…)。

以上で Git 化については終わりです。更新のたびにコマンドを入力する必要がありますが、CircleCI などを使ってこのあたりも自動化したら良いのかもしれません。

うまく行かない時

  • .ssh/config は正しいか(パーミッションや記述)
  • Deploy Keys に公開鍵(*.pub)を登録したか、またはそれが正しいか
  • リモートリポジトリのパスは正しいか
  • sparse-checkout で、リポジトリに存在しないファイルを無視しようとしてないか

pull したくないファイルの再設定

sparse-checkout で設定し忘れたり、設定を追加したいときは、

# git で管理しているルートへ移動
cd <DocumentRoot>

# sparse-checkout の設定
vim .git/info/sparse-checkout

# 設定を反映
git read-tree -m -u HEAD

Git 化については自分で調べに調べてようやくできた、という感じです。もしもっといい方法があれば教えてください…。