Drupal 7 サイトリビルド

Nid: 1200

データベースバックアップを使用してサイトを再作成し、不要モジュールや不要ファイルを一掃する。サイバー攻撃を受けたサイトでも、データベース感染していなければこの方法によって復旧可能。

1 . 準備

$ sitename=octaviadata.com
$ cd /var/www/html/$sitename

2 . ユーザ確認

$ drush uinf $(drush sqlq --extra=--skip-column-names "SELECT GROUP_CONCAT(name) FROM users")
 User ID       :  0
 User name     :
 User mail     :
 User roles    :  anonymous user
 User status   :  blocked

 User ID       :  1
 User name     :  admin
 User mail     :  octaviadata@outlook.com
 User roles    :  authenticated user
                  administrator
 User status   :  active

パスワード設定

$ drush upwd --password="newPassword" admin

ユーザをブロック

$ drush ublk <username>

3 . データベース確認

レコード件数確認

$ cd /var/www/html/$sitename
$ drush sql-query "select table_name, table_rows from information_schema.TABLES where table_schema = 'db_${PWD##*/}' order by table_rows;"

キャッシュテーブルクリア

$ drush sql-query "SHOW TABLES LIKE 'cache%'" | grep '^cache' | xargs -L1 -I% echo "TRUNCATE TABLE %;" | xargs | $(drush sql-connect) -v

ログデータクリア

$ drush watchdog-delete all -y

ログ設定見直し

admin/config/development/logging

empty core search index tables

$ drush sql-query "SHOW TABLES LIKE 'search_%'" | grep -v '^Tables' | xargs -L1 -I% echo "TRUNCATE TABLE %;" | xargs |  $(drush sql-connect) -v

to disable core search indexing

$ sudo vi sites/default/settings.php
$conf['search_cron_limit'] = '0';

アクセスログ設定の見直し、停止。人気記事を表示させる場合は必要。

admin/config/system/statistics
$ drush dis statistics -y

cron 設定確認

admin/config/system/cron

cron を実行し、レコードをクリアさせる。

$ sudo -u www-data drush cron

4 . 変更ファイル確認

コピーすべきファイルがないかどうか確認する。

$ sudo drush en hacked -y && drush hacked-list-projects --force-rebuild && drush hacked-list-projects | grep Changed
 Title                                                  Name                      Version         Status     Changed  Deleted
 Drupal core                                            drupal                    7.61            Changed    3        1
 Free pager                                             freepager                 7.x-2.x-dev     Changed    1        0
 Gratis                                                 gratis                    7.x-2.10        Changed    1        0
 Media Responsive Theme                                 media-responsive-theme    7.x-1.1         Changed    4        0
 Views Fluid Grid                                       views_fluid_grid          7.x-3.0         Changed    1        0
$ drush hacked-details gratis
Details for project: Gratis
Total files: 92, files changed: 1, deleted files: 0

Detailed results:
count(): Parameter must be an array or an object that implements Countable Table.php:699                                                             [warning]
 Status   File
 Changed  templates/html.tpl.php
$ drush hacked-diff gratis
diff -uprb a/templates/html.tpl.php b/templates/html.tpl.php
--- templates/html.tpl.php      2016-04-17 18:04:29.000000000 +0000
+++ templates/html.tpl.php      2016-05-27 08:14:50.000000000 +0000
@@ -63,5 +63,7 @@
 <?php print $page_top; ?>
 <?php print $page; ?>
 <?php print $page_bottom; ?>
+<!-- Go to www.addthis.com/dashboard to customize your tools -->
+<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-999" async="async"></script>
 </body>
 </html>
Only in /var/www/html/octaviadata.com/sites/all/themes/gratis/templates: html.tpl.php.org

5 . モジュールリストアップ

不要モジュールをOFFにする。

$ drush dis addthis addthis_displays addthis_test addtoany adsense_cse adsense_oldcode adsense_search xmlsitemap_user editor editor_ckeditor entitycache memcache memcache_admin mollom panels wysiwyg php matomo -y

モジュールリストを半角スペース区切りの文字列で作成し、モジュールをインストールする際に使用する。

$ dpmodules=`drush pm-list --status=enabled --pipe | tr '\n' ' '` && echo $dpmodules
actions_permissions admin_devel ...

6 . 必要ライブラリの確認

$ dplib=`/bin/ls /var/www/html/$sitename/sites/all/libraries` && echo $dplib
ckeditor colorbox htmlpurifier jquery.imagesloaded jsonpath predis

7 . データベースバックアップ

メンテナンスモード設定

$ drush vset maintenance_mode 1

日付と時間をファイル名に指定して、データベースをバックアップ。

$ sudo sh -c 'drush sql-dump > /var/www/html/db_${PWD##*/}.`date +%Y%m%d_%H%M%S`.sql'

8 . 旧サイトの退避

$ cd /var/www/html && sudo mv $sitename /var/www/html/tmp

9 . Drupal 7 インストール

データベースのパスワードはランダム。

$ cd /var/www/html && sudo drush dl drupal-7 --drupal-project-rename=$sitename && cd /var/www/html/$sitename && sudo drush -y si minimal --db-url=mysql://dbadmin_$sitename:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12`@localhost/db_$sitename --db-su=root --site-name="example web site" --account-mail=octaviadata@outlook.com --site-mail=octaviadata@outlook.com && sudo sh -c "chown -R www-data:www-data . && find . -type f -exec chmod 444 '{}' \; && find . -type d -exec chmod 555 '{}' \; && chmod a+w sites/default/files && chmod 444 sites/default/settings.php && find sites/default/files -type d -print0 | xargs -0 chmod 755"

当日日付ファイル名の sql ファイルからデータベースリストア。

$ drush -y sql-drop && drush sql-cli < ../db_$sitename.`date +%Y%m%d_`*.sql

10 . モジュールインストール

ライブラリ等ダウンロード

$ sudo rm -rf sites/all/libraries/{htmlpurifier,FooTable,predis,prettify,footable,fitvids,jsonpath}
$ sudo sh -c "git clone https://github.com/ezyang/htmlpurifier.git sites/all/libraries/htmlpurifier && git clone --branch V2 https://github.com/fooplugins/FooTable.git sites/all/libraries/FooTable && git clone https://github.com/nrk/predis.git sites/all/libraries/predis && git clone https://github.com/google/code-prettify.git sites/all/libraries/prettify && rm -rf /tmp/FooTable-3 && wget -cP /tmp https://github.com/fooplugins/FooTable/archive/V3.zip && unzip /tmp/V3.zip -d /tmp && mv /tmp/FooTable-3/compiled sites/all/libraries/footable && wget -c -P sites/all/libraries/fitvids https://raw.github.com/davatron5000/FitVids.js/master/jquery.fitvids.js && mkdir -p sites/all/libraries/jsonpath && wget -c -O sites/all/libraries/jsonpath/jsonpath.php https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jsonpath/jsonpath-0.8.1.php"

必要に応じてその他ライブラリ。

$ echo $dplib
$ sudo sh -c "rm -rf sites/all/libraries/superfish && git clone --branch 1.x https://github.com/mehrpadin/Superfish-for-Drupal.git sites/all/libraries/superfish"
$ rm -rf /tmp/leaflet.zip ; wget -c -P /tmp http://cdn.leafletjs.com/leaflet/v1.0.3/leaflet.zip && sudo unzip -d sites/all/libraries/leaflet /tmp/leaflet.zip
$ sudo sh -c "rm -rf sites/all/libraries/openlayers && git clone https://github.com/openlayers/openlayers.git sites/all/libraries/openlayers"
$ versionJuicebox='1.5.1.2'
$ sudo sh -c "rm -rf /tmp/juicebox_lite_${versionJuicebox}; wget -cP /tmp http://www.juicebox.net/release/juicebox_lite_${versionJuicebox}.zip && unzip /tmp/juicebox_lite_${versionJuicebox}.zip -d /tmp && rsync -av /tmp/juicebox_lite_${versionJuicebox}/ sites/all/libraries/juicebox && cp /tmp/juicebox_lite_${versionJuicebox}/web/jbcore/juicebox.js sites/all/libraries/juicebox/ && cp -r /tmp/juicebox_lite_${versionJuicebox}/web/jbcore/classic sites/all/libraries/juicebox/"
$ rm -rf /tmp/DataTables-*; wget -cP /tmp http://datatables.net/releases/DataTables-1.10.19.zip && unzip /tmp/DataTables-1.*.zip -d /tmp && sudo mkdir -p sites/all/modules/datatables && sudo mv /tmp/DataTables-1.10.19 sites/all/modules/datatables/dataTables
$ sudo sh -c "rm -rf sites/all/libraries/flexslider && git clone https://github.com/woocommerce/FlexSlider.git sites/all/libraries/flexslider"
$ sudo sh -c "rm -rf sites/all/libraries/colorbox && git clone https://github.com/jackmoore/colorbox.git sites/all/libraries/colorbox"
$ sudo wget -P sites/all/libraries/masonry https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js
$ sudo wget -P sites/all/libraries/jquery.cycle http://malsup.github.io/jquery.cycle.all.js
$ sudo wget -P sites/all/libraries/imagesloaded http://imagesloaded.desandro.com/imagesloaded.pkgd.min.js
$ sudo mkdir -p sites/all/libraries/jquery.imagesloaded && sudo cp sites/all/libraries/imagesloaded/imagesloaded.pkgd.min.js sites/all/libraries/jquery.imagesloaded/jquery.imagesloaded.js
$ sudo mkdir -p sites/all/libraries/infobubble/src && sudo wget -c -O sites/all/libraries/infobubble/src/infobubble-compiled.js https://raw.githubusercontent.com/googlemaps/v3-utility-library/master/infobubble/src/infobubble-compiled.js
$ sudo sh -c "rm -rf sites/all/libraries/soundmanager2 && git clone https://github.com/scottschiller/SoundManager2 sites/all/libraries/soundmanager2"
$ sudo sh -c "rm -rf sites/all/libraries/PHPExcel && git clone https://github.com/PHPOffice/PHPExcel.git sites/all/libraries/PHPExcel"
$ sudo wget -P sites/all/libraries/isotope https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js
$ sudo mkdir -p sites/all/modules/whois; wget -c -P /tmp https://jaist.dl.sourceforge.net/project/phpwhois/phpwhois/phpwhois-4.2.2/phpwhois-4.2.2.tar.gz && sudo tar xvzf /tmp/phpwhois-*.tar.gz -C sites/all/modules/whois && sudo mv sites/all/modules/whois/phpwhois-4.2.2 sites/all/modules/whois/phpwhois
$ sudo sh -c "rm -rf sites/all/libraries/jquery-simple-color && git clone https://github.com/recurser/jquery-simple-color.git sites/all/libraries/jquery-simple-color"

作成したモジュールリスト $dpmodules を使用して、モジュールをインストール

$ sudo drush dl google_analytics footable-7.x-1.0 -y
$ sudo drush -y en redis optimizedb path2ban module_missing_message_fixer schema_metatag $dpmodules
$ sudo drush -y en footable && sudo drush chosenplugin && drush -y dis toolbar overlay

エラーが出る場合、原因のモジュールを除外し、キャッシュクリアしてインストール再実行。

$ drush sql-query "DELETE FROM cache_bootstrap ;DELETE FROM cache"

不要モジュールがあれば、アンインストール

$ dpmunused='panels metatag_panels panels_mini panels_node panels_ipe i18n_panels total_control addthis addthis_displays adsense_cse' && drush dis $dpmunused -y && drush pm-uninstall $dpmunused -y

モジュールアップデート

$ drush module-missing-message-fixer-list
$ sudo sh -c "drush module-missing-message-fixer-fix --all && drush php-eval 'actions_synchronize(actions_list(), TRUE);' && drush -y pm-update && drush l10n-update"

11 . database update script の実行

$ sudo drush updatedb -y
update.php

12 . ファイルコピー

必要ファイル、変更したファイルをコピー

$ sudo rsync -avz --exclude='styles/' --exclude='*.gz' --exclude='*.js' --exclude='*.css' --exclude='.htaccess' ../tmp/$sitename/sites/default/files sites/default/
$ sudo rsync -avz ../tmp/$sitename/sites/default/files/favicons sites/default/files/
$ sudo cp -p ../tmp/$sitename/robots.txt .
$ sudo cp -p ../tmp/$sitename/sites/all/themes/responsive_bartik/templates/html.tpl.php ./sites/all/themes/responsive_bartik/templates/html.tpl.php
$ sudo cp -p ../tmp/$sitename/sites/all/themes/gratis/templates/html.tpl.php ./sites/all/themes/gratis/templates/html.tpl.php
$ sudo cp -p ../tmp/$sitename/sites/all/themes/responsive_business/templates/html.tpl.php ./sites/all/themes/responsive_business/templates/html.tpl.php
$ sudo cp -p ../tmp/$sitename/sites/all/themes/responsive_business/images/slide-image-* ./sites/all/themes/responsive_business/images/

差分の確認

$ diff /var/www/html/$sitename /var/www/html/tmp/$sitename
$ diff -r /var/www/html/$sitename /var/www/html/tmp/$sitename

13 . settings.php 設定

$ sudo vi sites/default/settings.php
/**
 * Redis
 */
$conf['redis_client_interface'] = 'Predis';
$conf['lock_inc']               = 'sites/all/modules/redis/redis.lock.inc';
$conf['path_inc']               = 'sites/all/modules/redis/redis.path.inc';
$conf['cache_backends'][]       = 'sites/all/modules/redis/redis.autoload.inc';
$conf['cache_default_class']    = 'Redis_Cache';
$conf['redis_client_socket']    = '/var/run/redis/redis-server.sock';
$conf['cache_prefix']           = 'octaviadata.com';

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'username' => 'dp_db_admin',
  'password' => 'dp_db_password',
  'port' => '',
  'host' => 'localhost',
  'database' => 'db_octaviadata.com',
  'charset' => 'utf8mb4',
  'collation' => 'utf8mb4_general_ci',
);

14 . アップデート、キャッシュクリア、ディレクトリパーミッション設定

$ [ ! -z $sitename ] || echo '$sitename is not set.' && cd /var/www/html/$sitename && pwd
$ sudo sh -c "drush pm-updatestatus 2>/dev/null && drush -y l10n-update; drush -y pm-update && drush -y updatedb && drush cron -d && drush cc all && chown -R www-data:www-data . && find . -type f -exec chmod 444 '{}' \; && find . -type d -exec chmod 555 '{}' \; && chmod a+w sites/default/files && chmod 444 sites/default/settings.php && find sites/default/files -type d -print0 | xargs -0 chmod 755"

Redis キー削除 settings.phpでキー設定している場合

$ redis-cli --scan --pattern hostname.octaviadata.com* | xargs redis-cli del

設定しているテーマの設定画面を開き、保存をクリックする。これをしないと、cssファイルが存在せずに、文字や色装飾のない画面になっていることがある。

admin/appearance

15 . ログ確認、設定確認

$ drush ws

サイトにアクセスして、エラー確認。

admin/reports/status

メンテナンスモード解除

$ drush vset maintenance_mode 0

16 . サイトのバックアップ

$ sudo drush archive-dump --tar-options='--exclude=.git --exclude=sites/default/files/styles' --destination=/var/www/html/db_${PWD##*/}.`date +%Y%m%d_%H%M%S`.tar.gz