wpdeploy.sh – a script for easy deployment of WordPress

This script will download and completely install WordPress on Gentoo with lighttpd web server.

Few notes:

  • If was written for my own purposes and it isn’t completely universal. There are no guaranties whatsoever, of course. But you still may find it (or parts of it) useful and I will try to answer your questions if there are any.
  • It is expected that you have installed lighttpd web server, MySQL and WP-CLI.
  • Script should be run by root user.

Usage:

$ sh wpdeploy.sh

What the script does:

  1. Collect data from user
  2. Download and extract latest version of WordPress
  3. Configure lighttpd
  4. Create MySQL database
  5. Configure wp-config.php
  6. Generate admin password and install WordPress
  7. Install selected plugins and themes
  8. Set chosen file owner, group and permissions

wpdeploy.sh version 2 (26.12.2013) – download

 

#!/bin/bash
 
#################################################################################
#	wpdeploy.sh																	#
#################################################################################
#																				#
#	A bash script for easy deployment of WordPress site on Gentoo with 			#
#	lighttpd web server.														#
#																				#
#	See http://bit.ly/1cAuCAC for more information.								#
#																				#
#	Copyright (C) 2013 Zaantar (zaantar@zaantar.eu)								#
#																				#
#################################################################################
#																				#
#	This program is free software: you can redistribute it and/or modify		#
#	it under the terms of the GNU General Public License as published by		#
#	the Free Software Foundation, either version 3 of the License, or			#
#	(at your option) any later version.											#
#																				#
#	This program is distributed in the hope that it will be useful,				#
#	but WITHOUT ANY WARRANTY; without even the implied warranty of				#
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the				#
#	GNU General Public License for more details.								#
#																				#
#	You should have received a copy of the GNU General Public License			#
#	along with this program.  If not, see <http://www.gnu.org/licenses/>.		#
#																				#
#################################################################################
 
### predefined constants ###
 
# names of these variables are quite self-explanatory...
WWW_BASEDIR=/var/www/
DOWNLOAD_URL=http://wordpress.org/latest.tar.gz
DEFAULT_GROUP=lighttpd
DEFAULT_USER=lighttpd
LIGHTTPD_CONFIG_PATH=/etc/lighttpd/
DEFAULT_LIGHTTPD_CONFIG_FILE=lighttpd.conf
WP_CONFIG_LANG="cs_CZ";
WP_CONFIG_CUSTOM="define('FS_METHOD', 'direct');"
DEFAULT_ADMIN_USER="zaantar"
DEFAULT_ADMIN_EMAIL="zaantar@zaantar.eu"
 
### helper functions ###
 
# values for terminal output formatting
COLOUR_BTW='\033[90m'
COLOUR_WHITE='\033[01;37m'
COLOUR_RESTORE='\033[0m'
COLOUR_RED='\033[91m'
 
function echo_white() {
    echo -e "\n$COLOUR_WHITE$1$COLOUR_RESTORE"
}
 
function echo_btw() {
    echo -e "$COLOUR_BTW$1$COLOUR_RESTORE"
}
 
function strip_trailing_slashes() {
	echo `sed 's#/*$##;s#^/*##' <<< $1`
}
 
function lowercase() {
	echo $1 | tr '[:upper:]' '[:lower:]'
}
 
### introduction ###
echo_white "wpdeploy.sh"
echo "Copyright (C) 2013 Zaantar (zaantar@zaantar.eu)"
echo "This program comes with ABSOLUTELY NO WARRANTY."
echo "This is free software, and you are welcome to redistribute it"
echo "under certain conditions. See http://www.gnu.org/licenses/ for details."
echo
 
### user input ###
echo_white "Stage 0: Data collection."
 
# web domain
read -p "Host name (e.g. for http://blog.zaantar.eu enter blog.zaantar.eu): " WP_HOSTNAME
WP_HOSTNAME=$(strip_trailing_slashes $WP_HOSTNAME)
WP_URL="http://$WP_HOSTNAME"
echo_btw "WP_HOSTNAME=$WP_HOSTNAME"
echo
 
# wordpress installation
read -p "WordPress installation location relative to $WWW_BASEDIR: " WP_RELATIVEDIR
WP_RELATIVEDIR=$(strip_trailing_slashes $WP_RELATIVEDIR)
WP_PATH="$WWW_BASEDIR$WP_RELATIVEDIR"
echo_btw "WP_PATH=$WP_PATH"
echo
 
# file group and owner
read -p "Owner (or owner:group) for WordPress files [$DEFAULT_USER:$DEFAULT_GROUP]: " OWNERS
if [ -z "$OWNERS" ];
then
    OWNERS="$DEFAULT_USER:$DEFAULT_GROUP"
fi
echo_btw "OWNERS=$OWNERS"
echo
 
# what to chmod?
WP_FIRST_DIR=`echo $WP_RELATIVEDIR | cut -f1 -d"/"`
echo_btw "WP_RELATIVEDIR = $WP_RELATIVEDIR, WP_FIRST_DIR = $WP_FIRST_DIR"
echo -e "Do you want to chmod and chown from \n\t(a) $WWW_BASEDIR$WP_FIRST_DIR\nor\t(b) $WP_PATH?"
read -p "Your choice [b]: " CHMOD_OPTION
CHMOD_OPTION=$(lowercase $CHMOD_OPTION)
if [ "$CHMOD_OPTION" == "a" ];
then
	CHMOD_PATH="$WWW_BASEDIR$WP_FIRST_DIR"
else
	CHMOD_PATH="$WP_PATH"
fi
echo_btw "CHMOD_PATH = $CHMOD_PATH"
echo
 
# lighttpd
read -p "lighttpd config file to append to [$DEFAULT_LIGHTTPD_CONFIG_FILE]: " LIGHTTPD_CONFIG_FILE
if [ -z "$LIGHTTPD_CONFIG_FILE" ];
then
    LIGHTTPD_CONFIG_FILE=$DEFAULT_LIGHTTPD_CONFIG_FILE
fi
LIGHTTPD_CONFIG_FILE="$LIGHTTPD_CONFIG_PATH$LIGHTTPD_CONFIG_FILE"
echo_btw "LIGHTTPD_CONFIG_FILE=$LIGHTTPD_CONFIG_FILE"
echo
 
# manipulate with database?
read -p "Create new database (Y/n)?: " MYSQL_CREATE
MYSQL_CREATE=$(lowercase $MYSQL_CREATE)
echo
 
# mysql database name
read -p "MySQL database and user name for WordPress: " MYSQL_DB_NAME
MYSQL_USER_NAME=$MYSQL_DB_NAME
echo
 
if [ "$MYSQL_CREATE" != "n" ];
then
    # mysql root password
    read -s -p "MySQL root password: " MYSQL_ROOT_PASSWORD
    echo
else
    # mysql user password
    read -s -p "Password for the database: " MYSQL_USER_PASSWORD
    echo
fi
 
# wp credentials
read -p "Site title [$WP_HOSTNAME]: " SITE_TITLE
if [ -z "$SITE_TITLE" ];
then
    SITE_TITLE=$WP_HOSTNAME
fi
echo
 
 
read -p "WordPress admin username [$DEFAULT_ADMIN_USER]: " ADMIN_USER
if [ -z "$ADMIN_USER" ];
then
    ADMIN_USER=$DEFAULT_ADMIN_USER
fi
echo_btw "ADMIN_USER=$ADMIN_USER"
echo
 
 
read -p "WordPress admin e-mail [$DEFAULT_ADMIN_EMAIL]: " ADMIN_EMAIL
if [ -z "$ADMIN_EMAIL" ];
then
    ADMIN_EMAIL=$DEFAULT_ADMIN_EMAIL
fi
echo_btw "ADMIN_EMAIL=$ADMIN_EMAIL"
echo
 
read -p "Press any key to begin... " -n1 -s
echo
 
### copy wordpress files ###
echo_white "Stage 1: Download and extract WordPress files."
 
echo "Create target directory $WP_PATH..."
mkdir --parents $WP_PATH
 
echo "Download wordpress files and extract them..."
wget -O - $DOWNLOAD_URL | tar -zxf - --directory $WP_PATH --strip 1
 
 
### configure lighttpd ###
echo_white "Stage 2: Lighttpd"
 
# see https://zaantar.eu/2013/06/domaci-server-s-gentoo-wordpress-na-lighttpd/ (czech)
# for more information about wordpress on lighttpd
echo "Configuring lighttpd file..."
echo "$(cat <<EOF
 
# WordPress configuration for $WP_RELATIVEDIR
# Generated by wpdeploy.sh (https://zaantar.eu)
\$HTTP["host"] =~ "(^|www\.)$WP_HOSTNAME" {
    server.document-root = var.basedir + "/$WP_RELATIVEDIR"
    url.rewrite-final = (
        "^/(wp-admin|wp-includes|wp-content)/(.*)" => "\$0", # Exclude some directories from rewriting
        "^/(.*.php?.*)" => "\$0", # Exclude .php files at root from rewriting
        "^/(.*)$" => "/index.php/\$1" # Handle permalinks and feeds
    )
}
 
EOF
)" >> $LIGHTTPD_CONFIG_FILE
 
 
echo "Restarting lighttpd service..."
rc-service lighttpd restart
 
 
### create mysql database ###
echo_white "Stage 3: MySQL database."
 
if [ "$MYSQL_CREATE" != "n" ];
then
 
    echo "Generate password for new user..."
    MYSQL_USER_PASSWORD=$( < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32})
 
    echo "Create the database..."
    echo "create database $MYSQL_DB_NAME; grant all on $MYSQL_DB_NAME.* to '$MYSQL_USER_NAME'@'localhost' identified by '$MYSQL_USER_PASSWORD';" |  mysql -v -u root --password=$MYSQL_ROOT_PASSWORD
 
else
    echo "Skipping..."
fi
 
 
### wordpress config ###
echo_white "Stage 4: wp-config.php"
 
echo "CD to $WP_PATH..."
cd "$WP_PATH"
 
# now we start using WP CLI. you should see http://wp-cli.org/ for more information
echo "Create wp-config.php file..."
wp core config --dbname=$MYSQL_DB_NAME --dbuser=$MYSQL_USER_NAME --dbpass=$MYSQL_USER_PASSWORD --locale=$WP_CONFIG_LANG --extra-php <<PHP
 
$WP_CONFIG_CUSTOM
 
PHP
 
 
### installation ###
echo_white "Stage 5: Installation"
 
# generate password for admin
ADMIN_PASSWORD=$( < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32})
echo -e "WordPress admin password: $COLOUR_RED$ADMIN_PASSWORD$COLOUR_RESTORE"
 
wp core install --url="$WP_URL" --title="$SITE_TITLE" --admin_user="$ADMIN_USER" --admin_email="$ADMIN_EMAIL" --admin_password="$ADMIN_PASSWORD"
 
### initial configuration ###
echo_white "Stage 6: Initial site configuration"
 
# install "default" plugins and themes (for my purposes)
wp plugin install wordpress-logging-service --activate
wp plugin install superadmin-helper --activate
wp plugin install login-security-solution --activate
wp plugin install reply-to
wp plugin install codestyling-localization --activate
wp plugin install hotfix --activate
wp plugin install wp-maintenance-mode --activate
wp plugin install admin-bar-login
wp plugin install backwpup
wp plugin install http://genesisthemes.de/wp-content/uploads/2013/05/backwpup-humility_100-rc1.zip --activate
wp plugin install automatic-updater
wp plugin install wordpress-language --activate
wp theme install montezuma
 
 
### cleanup ###
echo_white "Stage 7: Polishing and cleanup"
 
echo "Change user ownership and permissions..."
echo_btw "CHMOD_PATH = $CHMOD_PATH, OWNERS = $OWNERS"
chown -R "$OWNERS" "$CHMOD_PATH"
chmod -R ug+rwx "$CHMOD_PATH"
 
 
### finished ###
echo_white "Finished. Happy blogging!"

This post is also available in: Czech

One thought on “wpdeploy.sh – a script for easy deployment of WordPress”

  1. Another way to make automated deployment. Look throught a tool for beginners and experienced developers! Instead of making a setup and doing that boring repeatable job that you do for each new WordPress project, you can just use WPD https://wpdeployer.com/ It’ll save much time for you and make a developing process simpler.

Leave a Reply

Your email address will not be published. Required fields are marked *


This site uses Akismet to reduce spam. Learn how your comment data is processed.