シェルスクリプトとコマンドを駆使してECcubeのサイトを自動構築するまで

別にECcubeに限らないけど、自動であるサイトを構築する際のシェルのTIPs
全体の流れは下記のようになります。OSはLinuxです。ECcube2.1.2を用いて、PostgreSQLをDBにしています。
今回は細切れに説明していきますが、実際は1つのシェルスクリプトで全自動で実行してます。

  1. 引数チェック(エラーチェック)
  2. ユーザの追加
  3. Apacheバーチャルホストファイルの作成
  4. PostgresにDB作成とユーザ追加
  5. ECcubeデータコピー(デプロイ)
  6. ECcube DBデータ登録
  7. ECcube DBデータの個別箇所を変更
  8. data/install.phpの変更
  9. おまけ(htaccess, htpasswdファイルの生成)


1. 引数チェック

引数チェックは、引数の数だけ見ます。
下記の例では、引数の数が6個でなければエラー処理を行います。
エラー処理は、mailコマンドを呼び出して、SubjectにShop construct errorという文字列を入れて、hoge@hogehoge.comに送信します。本文は << HON以降の箇所のヒアドキュメントになります。

if [ $# != 6 ]; then
	echo "Argment number is not 6."
	mail -s "Shop construct error" hoge@hogehoge.com << HON
shop construct error
Argment number is not 6
Argment1 shopname is $1
HON
	exit;
fi

問題がなければ引数を下記のように変数に入れます
変数名に続くイコールの文字の前後はスペースを入れてはいけません。
$1は第一引数です。ここでは第6引数までを変数に展開しています。

PPATH=/home/hoge/program/

SHOPNAME=$1
SHOPPASSWD=$2
HTPASSWD=$3
SHOP_URL=$4
SHOP_HOME=/home/sites/$SHOPNAME
SHOP_MAIL=$5
SHOP_TITLE=$6

2.ユーザの追加

ユーザの追加は、先ほどの変数を使って、useraddコマンドでユーザを作成しています。作成と同時に、-dでホームディレクトリの指定、-sで使えるシェルの指定(ここではシェルを使えないように指定)し、-pでパスワードを指定しています

/usr/sbin/useradd $SHOPNAME -d $SHOP_HOME -s /sbin/nologin -p $SHOPPASSWD


3.Apacheバーチャルホストファイルの作成
バーチャルホストのファイルは、/usr/local/apache/conf/vhost/以下に作成し、Apachehttpd.conf側でvhost以下のファイルを全て読み込むようにIncludeの設定をしておきます。

echo "<VirtualHost *:80>
ServerAdmin root@hogehoge.com 
DocumentRoot \"$SHOP_HOME/eccube/html\" 
ServerName $SHOP_URL"
<Directory \"$SHOP_HOME/eccube/html\"> 
AllowOverride All
Order allow,deny
Allow from all 
</Directory> 
</VirtualHost> " >  /usr/local/apache/conf/vhost/$SHOPNAME.conf


4. PostgresにDB作成とユーザ追加
該当のショップが利用するPostgreSQLのDBとユーザを作成します。
下記のようにcreate userのSQL文でユーザとパスワードを設定します。
続けて、create database文でDB名を指定して、そのDBのオーナーとなるユーザ名を指定します
下記のように、pgsqlユーザで-c以降のコマンドを実行しています。
コマンドは、pgsqlコマンドを利用して、-f以降のsqlファイルを実行しています。

echo "create user $SHOPNAME with password '$SHOPPASSWD';" > $PPATH/$SHOPNAME.sql
echo "create database zeroshop_$SHOPNAME owner $SHOPNAME;" >> $PPATH/$SHOPNAME.sql

su -l pgsql -c "/usr/local/pgsql/bin/psql postgres -f $PPATH/$SHOPNAME.sql"

5. ECcubeデータコピー(デプロイ)
これは適当なディレクトリにECcubeをインストールしておいて、rsyncか、cp -r とかで丸ごとコピー


6. ECcube DBデータ登録
予めECcubeをインストールして基本的な管理情報を登録したら、下記のコマンドでDBデータをダンプしておきます

/usr/local/pgsql/bin/pg_dump -O -U pgsql baseDBdata > baseDBdata.dump

上記のように-Oオプションをつけないと、そのDBのオーナー情報までついてくるので、他のDBにリストアするとオーナが異なってしまいますので注意が必要です。
pg_dumpに関しては下記を参照
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.1-ja/app-pgdump.html
http://d.hatena.ne.jp/seesaa/20080523

それで、baseDBdata.dumpを作っておいたら、このシェルスクリプトからは下記のように投入します

/usr/local/pgsql/bin/psql -U $SHOPNAME -d $SHOPNAME < baseDBdata.dump


7. ECcube DBデータの個別箇所を変更
psqlコマンドは、-cオプションを使うと任意のSQL文が実行できるためこれを使います。
参考URL http://ash.jp/db/pg_psql_sample.htm
下記は、ECcubeのショップメールアドレスとショップ名をUPDATE文で書き換えてます

/usr/local/pgsql/bin/psql -U $SHOPNAME -d $SHOPNAME -c "UPDATE dtb_baseinfo SET law_email='$SHOP_MAIL', law_url='http://$SHOP_URL',shop_name='$SHOP_TITLE', email01='$SHOP_MAIL', email02='$SHOP_MAIL', email03='$SHOP_MAIL', email04='$SHOP_MAIL', email05='$SHOP_MAIL' ;"


下記は、UPDATE文を使ってECcube管理者ユーザのパスワードを変えてます(管理者ユーザは一人という前提です)

/usr/local/pgsql/bin/psql -U $SHOPNAME -d $SHOPNAME -c "UPDATE dtb_member SET password='$SHA1PASS' ;"

上記のpasswordカラムはSHA1で暗号化したものを指定する必要があります。そのため上記のコマンド実行前に下記を実行します
変数SHA1PASSにsha1.phpを実行した結果を入れてます。 `で囲んだものはそのコマンドの実行結果が返ります。

SHA1PASS=`/home/hoge/program/sha1.php $SHOPPASSWD`

sha1.phpは下記の内容になります
AUTH_MAGICの値は、eccube/data/mtb_constants_init.phpの中のAUTH_MAGICの値と同じにする必要があります。

#!/usr/local/php5/bin/php
<?php
$passwd_char=$argv[1];


define('AUTH_MAGIC', "hogehogehoge111222233333333");

echo sha1($passwd_char . ':' . AUTH_MAGIC);
?>

上記のphpでは、改行に注意(下記を参照)
http://d.hatena.ne.jp/ichikaway/20080904/1220513091



8. data/install.phpの変更
あとはeccubeのdata/install.phpを環境に合わせて書き換える(生成する)だけです。
下記を参考に
http://d.hatena.ne.jp/ichikaway/20080731

echo '<?php' > $PPATH/$SHOPNAME-install.php

echo "    define ('ECCUBE_INSTALL', 'ON');
    define ('HTML_PATH', '$SHOP_HOME/eccube/html/');
    define ('SITE_URL', 'http://$SHOP_URL/');
    define ('SSL_URL', 'http://$SHOP_URL/');
    define ('URL_DIR', '/');
    define ('DOMAIN_NAME', '');
    define ('DB_TYPE', 'pgsql');
    define ('DB_USER', '$SHOPNAME');
    define ('DB_PASSWORD', '$SHOPPASSWD');
    define ('DB_SERVER', '127.0.0.1');
    define ('DB_NAME', '$SHOPNAME');
    define ('DB_PORT', '');
    define ('DATA_PATH', '$SHOP_HOME/eccube/data/');
    define ('MOBILE_HTML_PATH', HTML_PATH . 'mobile/');
    define ('MOBILE_SITE_URL', SITE_URL . 'mobile/');
    define ('MOBILE_SSL_URL', SSL_URL . 'mobile/');
    define ('MOBILE_URL_DIR', URL_DIR . 'mobile/');
" >> $PPATH/$SHOPNAME-install.php

echo '?>' >> $PPATH/$SHOPNAME-install.php


cp $PPATH/$SHOPNAME-install.php $SHOP_HOME/eccube/data/install.php


9. おまけ(htaccess, htpasswdファイルの生成)

BASIC認証をかけたいフォルダがあれば、htpasswdを生成します。

  • bでパスワード設定、-cで.htpasswdファイルを生成します。
/usr/bin/htpasswd -b -c $SHOP_HOME/eccube/html/フォルダ/.htpasswd $SHOPNAME $HTPASSWD

シェルに関する参考URL
http://www.e.ics.nara-wu.ac.jp/~nogu/tips/shellscript.html
http://www.atmarkit.co.jp/flinux/rensai/shell05/parameter.html
http://www.infoscience.co.jp/technical/rsync/rsync.html