CentOS仮想マシンにLAMP, Git, Redmine, phpMyAdminな開発サーバを一発構築するスクリプト

開発用に CentOS 6.4 (x86/64) の仮想サーバを構築し、開発環境を一発でセットアップするスクリプトをGitHubにて公開しました。

統合開発環境に NetBeans、プロジェクト管理に Redmine、コミット → プッシュされたら公開ディレクトリに自動デプロイという環境を構築できます。

ryu-blacknd / bootstrap

想定している開発フロー

  1. NetBeans IDE で WEB+DB 開発、Redmine でプロジェクト管理
  2. ローカルの Git リポジトリでコミット
  3. リモートのベアリポジトリへプッシュ (Redmineが参照するのはココ)
  4. 本番環境リポジトリ (/var/www/html 以下) で自動プル

スクリプトの概要

  • セキュリティ関係の設定 (ローカル開発環境なので甘々に設定)
  • yum のリポジトリを追加 (epel, remi)
  • yum update と、必要なパッケージのインストール
  • 不要なサービスの停止
  • LAMP (Apache, MySQL, PHP) のインストールと最低限の設定
  • Ruby と Passenger 周りのインストール
  • Git ユーザーの作成と関連する設定
  • phpMyAdmin のインストール (ソースから)
  • Redmine 及びテーマとプラグインをインストール
  • オマケ: bash と vim 周りの環境設定 (所謂 dotfiles)
    ベアリポジトリ用フックスクリプトの雛形

詳細は、シェルスクリプトを読んでみてください。たいしたことはしていません。

動作環境

  • LAN 内のサーバ PC、または VirtualBox 上の仮想マシン
  • CentOS 6.4 x86/64 minimal iso イメージでのインストール直後であること

インストール

rootでログインし、git をインストール後、取得した bootstrap.sh を実行するだけです。

# yum -y install git
# cd
# git clone https://github.com/ryu-blacknd/bootstrap.git
# bootstrap/bootstrap.sh

ほぼノンストップで進んでいきますが、Passenger のインストール時のみ、画面に表示される通り Enter を押して進んでください。 (修正予定)

※2013.10.16 追記: Passenger インストール時に Enter を自動入力し、ノンストップになりました。

最初にすること

vim の初回起動時、以下を実行してプラグインをインストールしてください。

:NeoBundleInstall

root アカウントでログイン後、リブートを行います。

# reboot

開発に関する情報

種別
Git ユーザーgituser:gituser
Git ベアリポジトリ *1/var/repos/{プロジェクト名}
Git 公開鍵を追記するファイル *2/home/gituser/.ssh/authorized_keys
Redmine の URLhttp://{ホスト名}/redmine/
Redmine ユーザーadmin:admin
phpMyAdmin の URLhttp://{ホスト名}/phpmyadmin/
各プロジェクトの URLhttp://{ホスト名}/{プロジェクト名}/

*1 NetBeans でのプッシュ先リポジトリ = Redmine での参照リポジトリ

*2 開発ユーザー毎に SSH 公開鍵を作成し、このファイルに追記していく (後述)

初回の開発フロー

初回のみ Git 絡みで色々と面倒ですが、以下のフローが済めば、以降は自動化され楽になります。

  1. [サーバ] ユーザー gituser で SSH ログイン
  2. [サーバ] /var/repos/{プロジェクト名} を作成し、ディレクトリ内で git init --bare
  3. [ローカル] NetBeans でローカルのリポジトリにファーストコミット
  4. [ローカル] NetBeans から先ほど作成したベアリポジトリにプッシュ
  5. [ローカル] Redmine で新規プロジェクトを作成、リポジトリを設定、ユーザー割り当て
  6. [サーバ] cd /var/www/html して git clone /var/repos/{プロジェクト名}
  7. [サーバ] /var/repos/{プロジェクト名}/.git/hooks/post-update をコピーして編集

post-update ファイルはユーザー root のホームディレクトリにあるため、gituser はアクセスできません。あらかじめ chown gituser. post-update としておき、gituser のホームディレクトリにでもコピーしておくとよいでしょう。

post-update のコピーと編集

フックスクリプト post-update は、プロジェクトを作成する毎に手動でコピー、**** の部分を編集します。

#!/bin/sh
/usr/bin/wget -q -O /dev/null http://localhost/redmine/sys/fetch_changesets?key=****
(cd /var/www/html/**** && git --git-dir=.git pull)

2行目は、Redmine の 管理 → 設定 → リポジトリ で生成した API キーを記述します。

RedmineのAPIキー

3行目は、上記手順のプロジェクト名 (=リポジトリのディレクトリ名) を記述します。

これで冒頭に書いたようなフローの準備が整いました。

以後はNetBeans で、ローカルコミットとベアリポジトリへのプッシュを繰り返して開発を進めます。

コミット・メッセージでチケットの状態を更新する

NetBeans からのコミット時は、コミット・メッセージの文末に refs #1 @1.5h 等を付与すると、Redmine のチケットと連携することができます。

このとき、作成者とコミッタを Redmine のユーザー名に合わせるようにしてください。

コミット・メッセージ

上記ユーザー名が Redmine 側と一致しない場合は、チケット連携が正常に行われません。その場合はプロジェクト毎の 設定 → リポジトリ から、ユーザーの関連付けを行ってください。

※詳しくはこちらを参照してください。

Redmine 1.1 新機能紹介: コミットメッセージによる作業時間の記録 | Redmine.JP Blog

リポジトリへのアクセスにSSH 鍵認証を利用する

ユーザー毎の SSH 公開鍵をユーザー gituserauthorized_keys に追記していきます。

以下の手順で SSH 公開鍵と秘密鍵のペアを生成します。

$ ssh-keygen -C user@example.com

なお、この鍵ペアを外部サーバへの接続用途に使わないのであれば、パスフレーズは無視して構いません。

これでユーザーのホームディレクトリに2つの鍵ファイルが作成されます。

役割ファイル名
SSH 秘密鍵~/.ssh/id_rsa
SSH 公開鍵~/.ssh/id_rsa.pub

この公開鍵をサーバ管理者に渡し、管理者は gituser ユーザーで ~/.ssh/authorized_keys に追記します。

$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys

次に NetBeans 側で、「秘密鍵ファイル」に上記の秘密鍵ファイルを指定すれば、リポジトリにアクセスすることができるようになります。