Last active
September 29, 2015 10:46
-
-
Save rajiteh/f4f4e454e6f10c8ce42e to your computer and use it in GitHub Desktop.
Installs nvm, rbenv, apache, mysql and php5-fpm, supports selectively installing components. Tested on Ubuntu 14.04 with Vagrant
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -e | |
# BootstrapShhhhhh | |
# ================ | |
# | |
# Author: @rajiteh <[email protected]> | |
# License: MIT | |
# | |
# Installs a bunch of sh!. | |
# | |
# Usage [PACKAGE_VAR=value ... ] ./bootstrap.sh <package[=version] ... > | |
# Example $ APP_REPO_GIT="git@host:user/proj.git" ./bootstrap.sh nvm=0.12 rbenv app | |
# | |
# Packages: rbenv nvm apache2 php mysql pip app | |
# | |
# Package notes: | |
# * app | |
# - Package var APP_REPO_GIT, git URL of the repository. | |
# - Package var APP_DEPLOY_KEY, private key with pull rights to the target | |
# repository. | |
# - APP_DEPLOY_KEY can be ignored if SSH agent forwarding is enabled. | |
# - A file named 'Buildfile' will be executed after deployment if found | |
# at the root of repository. | |
# | |
# Script vars | |
SHELL_RC="${HOME}/.bashrc" | |
INSTALL=(base @ clean) | |
INDENT="--------->" | |
_action="" | |
export DEBIAN_FRONTEND=noninteractive | |
# Package vars: mysql | |
DBPASSWORD='vagrant' | |
function install_base() { | |
_say "Enabling multiverse." | |
sudo apt-add-repository multiverse | |
_say "Adding extra repositories." | |
sudo add-apt-repository -y ppa:git-core/ppa > /dev/null | |
_say "Updating apt." | |
sudo apt-get -qq -y update > /dev/null | |
_say "Setting locale." | |
_package_install language-pack-en | |
sudo locale-gen en_US.UTF-8 > /dev/null | |
sudo dpkg-reconfigure locales > /dev/null | |
_say "Upgrading apt." | |
sudo apt-get -qq -y upgrade > /dev/null | |
_say "Fixing broken dependencies." | |
sudo apt-get -f install > /dev/null | |
_say "Installing essentials." | |
_package_install autoconf build-essential git wget | |
} | |
function install_clean() { | |
_say "Cleaning up cache." | |
sudo apt-get -qq -y autoclean | |
sudo apt-get -qq -y clean | |
} | |
function install_rbenv() { | |
local version="$1" | |
[ -z "$1" ] && version="2.2.1" | |
local gem_rc="${HOME}/.gemrc" | |
local default_gems="bundler foreman" | |
_say "Configuring for version ${version}" | |
_package_install autoconf bison build-essential libssl-dev \ | |
libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev \ | |
libffi-dev libgdbm3 libgdbm-dev | |
_say "Installing rbenv." | |
curl -s https://raw.githubusercontent.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash | |
_say "Updating shell rc." | |
_ensure_line_sourced 'export RBENV_ROOT="$HOME/.rbenv"' | |
_ensure_line_sourced 'export PATH="$HOME/.rbenv/bin:$PATH"' | |
_ensure_line_sourced 'eval "$(rbenv init -)"' | |
_say "Updating gem rc." | |
touch $gem_rc | |
_ensure_line_present "gem: --no-rdoc --no-ri " "${gem_rc}" | |
_say "Installing dependencies." | |
rbenv bootstrap-ubuntu-12-04 > /dev/null | |
_say "Installing ruby." | |
rbenv install -s $version > /dev/null | |
rbenv global $version | |
rbenv rehash | |
_say "Installing gems." | |
gem install $default_gems | |
} | |
function install_nvm() { | |
local version="$1" | |
[ -z "$1" ] && version="0.12" | |
local npm_version="2" | |
local default_modules="gulp bower grunt-cli supervisor" | |
_say "Configuring for node=v${version} npm=v${npm_version}" | |
_say "Downloading NVM." | |
curl -s https://raw.githubusercontent.com/creationix/nvm/v0.27.1/install.sh | bash | |
_say "Updating shell rc." | |
_ensure_line_sourced 'export NVM_DIR="$HOME/.nvm"' | |
_ensure_line_sourced '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' | |
_say "Installing nodejs." | |
nvm install $version > /dev/null | |
nvm alias default $version | |
nvm use $version | |
_say 'Configuring NPM.' | |
npm install -g npm@$npm_version | |
_say 'Installing modules.' | |
npm install -g $default_modules | |
} | |
function install_pip() { | |
local workon_home="${HOME}/.virtualenvs" | |
_say "Setting up easy_install." | |
wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python | |
_say "Setting up pip." | |
sudo easy_install pip | |
_say "Setting up virtualenv." | |
sudo pip install virtualenv | |
sudo pip install virtualenvwrapper | |
mkdir -p $workon_home | |
_say "Updating shell rc." | |
_ensure_line_sourced "export WORKON_HOME=${workon_home}" | |
_ensure_line_sourced "source /usr/local/bin/virtualenvwrapper.sh" | |
_ensure_line_sourced "export PIP_VIRTUALENV_BASE=${workon_home}" | |
_say "Cleaning up." | |
rm -f ./setuptools*.zip | |
} | |
function install_mysql() { | |
_required_var "${DBPASSWORD}" | |
local dbPassword=$DBPASSWORD | |
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password '"$dbPassword"'' | |
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password '"$dbPassword"'' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/app-password-confirm password '"$dbPassword"'' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/mysql/admin-pass password '"$dbPassword"'' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/mysql/app-pass password '"$dbPassword"'' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/dbconfig-install boolean true' | |
sudo debconf-set-selections <<< 'phpmyadmin phpmyadmin/mysql/admin-user string root' | |
_package_install mysql-server-5.5 phpmyadmin | |
sudo mysql_install_db > /dev/null | |
} | |
function install_php() { | |
_package_install php5-fpm php5-cli libmcrypt-dev libssl-dev openssl | |
_say "Installing modules." | |
_package_install php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap \ | |
php5-mcrypt php5-memcache php5-redis php5-mysql php5-sqlite | |
_say 'Setting up config file.' | |
sudo sh -c 'cat > /etc/apache2/conf-available/php5-fpm.conf << EOL | |
<IfModule mod_fastcgi.c> | |
AddHandler php5-fcgi .php | |
Action php5-fcgi /php5-fcgi | |
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi | |
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -idle-timeout 900 -host 127.0.0.1:9000 -pass-header Authorization | |
<Directory /usr/lib/cgi-bin> | |
Options ExecCGI FollowSymLinks | |
SetHandler fastcgi-script | |
Require all granted | |
</Directory> | |
</IfModule> | |
EOL' | |
_say 'Touching cgi-bin.' | |
sudo touch /usr/lib/cgi-bin/php5.fcgi | |
sudo chown -R www-data:www-data /usr/lib/cgi-bin | |
_say 'Enabling FPM via TCP.' | |
sudo sed -i "s/listen =.*/listen = 127.0.0.1:9000/" /etc/php5/fpm/pool.d/www.conf | |
_say 'Enabling error logging.' | |
sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php5/fpm/php.ini | |
sudo sed -i "s/display_errors = .*/display_errors = On/" /etc/php5/fpm/php.ini | |
_say 'Enabling modules.' | |
sudo php5enmod mcrypt | |
sudo a2enconf php5-fpm | |
sudo service php5-fpm restart > /dev/null | |
sudo service apache2 restart > /dev/null | |
_say 'Installing composer.' | |
curl -sS https://getcomposer.org/installer | php > /dev/null | |
sudo mv composer.phar /usr/local/bin/composer > /dev/null | |
} | |
function install_app() { | |
local app_path="${HOME}/app" | |
local build_file="Buildfile" | |
_required_var "${APP_REPO_GIT}" | |
_say "Deploying app." | |
_git_deploy "${APP_REPO_GIT}" "${app_path}" | |
cd $app_path | |
if [ -f "${build_file}" ] | |
then | |
_say "Buildfile detected." | |
chmod +x "${build_file}" | |
eval "./${build_file}" | |
else | |
_say "No Buildfile found." | |
fi | |
} | |
function _git_deploy() { | |
local deploy_key_prv_path="${HOME}/.ssh/deploy_rsa" | |
local git_update=0 | |
local app_repo="${1}" | |
local app_path="${2}" | |
local app_branch="master" | |
if [ -n "${APP_DEPLOY_KEY}" ] | |
then | |
_say "Installing deploy key." | |
echo "${APP_DEPLOY_KEY}" > $deploy_key_prv_path | |
key_opts="-i ${deploy_key_prv_path}" | |
fi | |
export GIT_SSH_COMMAND="ssh ${key_opts} \ | |
-o StrictHostKeyChecking=no \ | |
-o UserKnownHostsFile=/dev/null" | |
_say "Detecting repository state." | |
mkdir -p $app_path | |
cd $app_path | |
[ -d ".git" ] && (git remote -v | grep "${app_repo}") && \ | |
git_update=1 | |
if [ "${git_update}" = "0" ] | |
then | |
_say "Resetting app folder." | |
rm -rf "${app_path}/*" | |
_say "Cloning app." | |
git clone $APP_REPO_GIT . | |
else | |
_say "Updating app repo." | |
git pull origin $app_branch | |
fi | |
git checkout $app_branch | |
} | |
function _required_var() { | |
if [ -z "${1}" ] | |
then | |
_say "ERROR: Required variable not present." | |
exit 1 | |
fi | |
} | |
function _say() { | |
echo $INDENT $_action $@ | |
} | |
function _package_install() { | |
_say "Configuring ${@}." | |
sudo apt-get -qq -y install $@ > /dev/null | |
} | |
function _ensure_line_sourced() { | |
_ensure_line_present "${1}" "${SHELL_RC}" | |
eval "${1}" | |
} | |
function _ensure_line_present() { | |
local line="$1" | |
local file="$2" | |
if grep -Fxq "${line}" $file | |
then | |
_say "EXISTS: ${line}" | |
else | |
echo "${line}" >> $file | |
_say " ADDED: ${line}" | |
fi | |
} | |
_say "WARNING:" | |
_say "WARNING: YOU ARE USING AN UNMAINTAINED VERSION OF THIS SCRIPT." | |
_say "WARNING: Please update your sources to" | |
_say "WARNING: https://github.com/rajiteh/bootstrapsh" | |
_say "WARNING:" | |
for pkg in "${INSTALL[@]}" | |
do | |
IFS='=' read -ra pkg_ver <<< "${pkg}" | |
_action="(${pkg_ver[0]})" | |
eval "install_${pkg_ver[0]} ${pkg_ver[1]}" | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment