Created
July 1, 2012 21:22
-
-
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
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
| #!/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 |
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
| 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