Skip to content

Instantly share code, notes, and snippets.

@fairchild
Created July 1, 2012 21:22
Show Gist options
  • Select an option

  • Save fairchild/3029687 to your computer and use it in GitHub Desktop.

Select an option

Save fairchild/3029687 to your computer and use it in GitHub Desktop.
Setup a Ubuntu 12.04 server for serving a ruby and nodejs apps
#!/bin/bash
set -x
set -e
# Setup a new ubuntu 12.04 server
# this file can be used as the userdata file for a new instance.
# It should set any environments variables needed, and select which setup functions to run, in what order.
USERNAME=${1:-deploy}
APPNAME=${2:-deploy}
AUTHORIZED_KEYS=${3:-'ssh-rsa AxxxoNQ,......l1AQ== '}
RUBY_VERSION=${4:-'1.9.3'}
APT_PROXY=${5:-"http://10.4.45.95:3142"}
LOG_SERVER=${6:-"10.4.45.95"}
FUNCTIONS_URL=${7:-'https://raw.github.com/gist/3029687/c1738dfb7a15588f9f83595786d15085106a0f24/setup_functions.bash'}
NEW_RELIC_LICENSE_KEY=${8:-''}
: ${NEW_RELIC_LICENSE_KEY:=""}
export DEBIAN_FRONTEND=noninteractive
curl -o /tmp/setup_functions.bash $FUNCTIONS_URL
. /tmp/setup_functions.bash
appserver
export DEBIAN_FRONTEND=noninteractive
function dist_upgrade () {
echo "$FUNCNAME now executing."
sudo apt-get -y update
sudo apt-get -y dist-upgrade
}
function install_common_tools () {
echo "$FUNCNAME now executing."
# install some tools I like to have
sudo apt-get -y install nmap wget curl tree lsof vim subversion mosh unzip patch git git-core links xfsprogs tmux
}
function build_tools () {
echo "$FUNCNAME now executing."
# install some build and runtime needs
sudo apt-get -y install build-essential automake libtool bison autoconf libreadline-dev openssl libreadline6 libreadline6-dev zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libc6-dev ncurses-dev imagemagick libmagickcore-dev libmagick++-dev libpq-dev
echo " installing jruby requirements"
sudo apt-get -y install g++ openjdk-6-jre-headless ant openjdk-6-jdk
}
function daemons () {
echo "\n\n ---> $FUNCNAME now executing."
#memcached
sudo apt-get -y install redis-server
}
function runtimes () {
sudo apt-get -y install libc-ares2 nodejs
}
function setup_deploy_user () {
echo "\n\n ---> $FUNCNAME now executing."
sudo useradd -c 'The user used to deploy apps' -s '/bin/bash' -d /home/${USERNAME} -m ${USERNAME}
sudo touch /etc/sudoers.d/91-${USERNAME}
sudo chmod 0440 /etc/sudoers.d/91-${USERNAME}
echo "echo \"${USERNAME} ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/91-${USERNAME}" | sudo bash
sudo mkdir -p /home/${USERNAME}/.ssh
echo "${AUTHORIZED_KEYS}" > /tmp/authorized_keys
sudo mv /tmp/authorized_keys /home/${USERNAME}/.ssh/authorized_keys
sudo chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.ssh
# sudo -u ${USERNAME} 'ssh-keygen -b 4096 -t rsa -f /home/${USERNAME}/.ssh/id_rsa -P ""'
echo "export RAILS_ENV=production">>/home/${USERNAME}/.bash_profile
echo "export RACK_ENV=production">>/home/${USERNAME}/.bash_profile
echo '. "$HOME/.bashrc"'>>/home/${USERNAME}/.bash_profile
echo 'gem: --no-ri --no-rdoc'>>/home/${USERNAME}/.gemrc
}
function setup_postgres () {
echo "\n\n ---> $FUNCNAME now executing."
sudo apt-get install -y postgresql-9.1 libpq-dev postgresql-client-9.1 postgresql-contrib-9.1 postgresql-9.1-ip4r postgresql-9.1-postgis postgresql-autodoc
# createuser --echo --superuser deploy
echo "CREATE USER ${USERNAME} WITH PASSWORD 'secret4${USERNAME}';
ALTER USER ${USERNAME} WITH SUPERUSER;
CREATE DATABASE ${APPNAME}">/tmp/pguser.psql
sudo -u postgres sh -c "psql -f /tmp/pguser.psql"
rm /tmp/pguser.psql
# sudo sh -c "echo 'localhost:5432:*:${USERNAME}:secret4${USERNAME}'>/home/${USERNAME}/.pgpass"
sudo sh -c "echo '*:*:*:${USERNAME}:secret4${USERNAME}'>/home/${USERNAME}/.pgpass"
sudo chown ${USERNAME}:${USERNAME} /home/${USERNAME}/.pgpass
sudo chmod 0600 /home/${USERNAME}/.pgpass
}
function install_ruby () {
echo "\n\n ---> $FUNCNAME now executing."
sudo sh -c "echo 'gem: --no-ri --no-rdoc'>/etc/gemrc"
sudo apt-get -y install ruby1.9.1-full libnokogiri-ruby1.9.1
sudo gem install bundler right_aws json foreman taps
}
function setup_newrelic_server_monitoring () {
echo "\n\n ---> $FUNCNAME now executing."
# INstall newrelic server onitoring
sudo wget -O /etc/apt/sources.list.d/newrelic.list http://download.newrelic.com/debian/newrelic.list
sudo wget -O /tmp/548C16BF.gpg http://download.newrelic.com/548C16BF.gpg
sudo apt-key add /tmp/548C16BF.gpg
sudo apt-get update
sudo apt-get install -y newrelic-sysmond
sudo nrsysmond-config --set license_key=${NEW_RELIC_LICENSE_KEY}
sudo /etc/init.d/newrelic-sysmond start
sudo rm /tmp/548C16BF.gpg
}
function setup_www () {
echo "\n\n ---> $FUNCNAME now executing."
sudo apt-get -y install nginx-full
sudo mkdir -p /var/www/apps/${APPNAME}/shared/ssl
sudo chown -R ${USERNAME}:www-data /var/www
ln -s /var/www/apps/${APPNAME} /home/${USERNAME}/app #just for convenience
}
function setup_ssl () {
echo "TODO: setup ssl"
}
function setup_rvm () {
echo "\n\n ---> $FUNCNAME now executing."
sudo -i -u ${USERNAME} bash -c "curl -L https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash"
sudo -i -u ${USERNAME} bash -c "echo "gem: --no-rdoc --no-ri" > ~/.gemrc"
sudo -i -u ${USERNAME} bash -c "echo \"source ~/.rvm/scripts/rvm\">>~/.bashrc"
# source ~/.rvm/scripts/rvm
sudo -i -u ${USERNAME} bash -c "rvm install $RUBY_VERSION"
sudo -i -u ${USERNAME} bash -c "rvm --default use $RUBY_VERSION"
sudo -i -u ${USERNAME} bash -c "rvm rubygems current"
sudo -i -u ${USERNAME} bash -c "gem install capistrano foreman pg pry awesome_print nokogiri oj multi_json faraday thin puma"
}
function setup_elastic_search () {
echo "\n\n ---> $FUNCNAME now executing."
mkdir -p mkdir -p /tmp/setup_elastic_search
cd /tmp/setup_elastic_search
sudo apt-get install -y openjdk-7-jre
wget https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.7.tar.gz -O elasticsearch.tar.gz
tar -xf elasticsearch.tar.gz
rm elasticsearch.tar.gz
sudo mv elasticsearch-* elasticsearch
sudo mv elasticsearch /usr/local/share
curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch
sudo service elasticsearch start
cd -
rm -rf /tmp/setup_elastic_search
}
function setup_apt_cache () {
echo "Acquire::http::Proxy \"${APT_PROXY}\";" > /tmp/01proxy
sudo mv /tmp/01proxy /etc/apt/apt.conf.d/01proxy
}
function setup_amqp_server () {
# this is needed for logstash
sudo apt-get install -y rabbitmq-server amqp-tools librabbitmq-dev librabbitmq0
}
function setup_landscape () {
sudo apt-get install landscape-client
sudo landscape-config --computer-title "${APPNAME}" --account-name michaelf --script-users=ubuntu,deploy --tags server --ok-no-register
}
function setup_logging () {
echo "echo $LOG_SERVER logserver>>/etc/hosts" | sudo bash
echo "echo $LOG_SERVER elasticsearch-server>>/etc/hosts" | sudo bash
echo " *.* @${LOG_SERVER}:514">/tmp/10-pao1-logstash
sudo mv /tmp/10-pao1-logstash /etc/rsyslog.d/10-pao1-logstash
sudo service rsyslog restart
sudo curl -o /usr/local/logstash-1.1.0-monolithic.jar http://semicomplete.com/files/logstash/logstash-1.1.0-monolithic.jar
sudo mkdir -p /etc/logstash
sudo curl -o /etc/logstash/logstash_shipper.conf https://raw.github.com/gist/3030472/e5b41ba54191f3835612e0697990251faf02727f/logstash_shipper.conf
#NOTE: --backened is only needed if elasticsearch is not discoverable thru multicast
# java -jar /usr/local/logstash-1.1.0-monolithic.jar agent -f /etc/logstash/logstash_shipper.conf
# web interface woudl be run with:
# java -jar /usr/local/logstash-1.1.0-monolithic.jar web
}
function setup_monitoring () {
sudo apt-get install -y ganglia-monitor
sudo apt-get install -y collectd collectd-dev
}
# ========================================
# = copmposite funcitons to setup a role =
# ========================================
function appserver () {
setup_apt_cache
dist_upgrade
setup_deploy_user
install_common_tools
build_tools
runtimes
daemons
setup_postgres
setup_www
setup_newrelic_server_monitoring
setup_monitoring
# setup_logging
# setup_rvm
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment