- Deploying a Rails App with EC2 + S3 + Ubuntu
- ============================================
- Create EC2 Instance
- -------------------
- create new instance ami-bf5eb9d6 [http://alestic.com/](http://alestic.com/)
- create new elastic ip
- attach elastic ip to instance
- point dns to elastic ip
- set the `:host` in `config/deploy.rb` to the new elastic ip
- Create S3 Buckets
- -----------------
- for production: projectname, projectname_backup
- for development: projectname_development, projectname_development_backup
- Connect to Server
- -----------------
- create local ~/.ssh/projectname_production_root file with private rsa ssh key, chmod 600
- ssh in as root such as ssh root@1.2.3.4 -i ~/.ssh/projectname_production_root
- Install Packages
- ----------------
- First update existing packages:
- # apt-get update
- # apt-get upgrade
- Then install new packages:
- # apt-get install apache2
- # apt-get install apache2-prefork-dev
- # apt-get install build-essential
- # apt-get install exim4
- # apt-get install git-core
- # apt-get install imagemagick
- # apt-get install irb
- # apt-get install libmysqlclient15-dev
- # apt-get install libyaml-ruby
- # apt-get install libzlib-ruby
- # apt-get install mysql-server
- # apt-get install rdoc
- # apt-get install ruby
- # apt-get install ruby1.8-dev
- # apt-get install rubygems
- # apt-get install sqlite3
- When prompted set the mysql-server password.
- Install Rubygems
- ----------------
- First install Rubygems itself:
- # gem install rubygems-update
- # gem update --system
- Something is messed up with this version of rubygems so we have to do something ghetto:
- # vi /usr/bin/gem
- After the line:
- require 'rubygems'
- Add:
- require 'rubygems/gem_runner'
- Then install the individual gems:
- # gem install daemons
- # gem install fastthread
- # gem install hpricot
- # gem install json
- # gem install mime-types
- # gem install mysql
- # gem install open4
- # gem install passenger
- # gem install rack
- # gem install rake
- # gem install right_aws
- # gem install ruby-mp3info
- # gem install sqlite3-ruby
- Configure Exim4
- ---------------
- Run the configurator:
- # dpkg-reconfigure exim4-config
- And enter these values as prompted:
- - internet site, sent directly via smtp
- - projectname.com
- - 127.0.0.1
- - other destinations: [blank]
- - relay: [blank]
- - relay: [blank]
- - dns minimal: no
- - delivery method: mbox
- - small files: no
- - root: root
- Configure MySQL
- ---------------
- # mysqladmin -u root -p create projectname_production
- # mysql -u root -p
- mysql> CREATE USER 'projectname_prod'@'localhost' IDENTIFIED BY 'password';
- mysql> FLUSH PRIVILEGES;
- mysql> CREATE DATABASE projectname_production DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
- mysql> GRANT ALL PRIVILEGES ON projectname_production.* TO 'projectname_prod'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
- Configure Apache and Phusion Passenger
- --------------------------------------
- Run the Passenger configurator:
- # passenger-install-apache2-module
- Edit Apache configs:
- # cd /etc/apache2/
- # a2enmod deflate
- # vi conf.d/projectname
- NameVirtualHost *
- LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
- PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6
- PassengerRuby /usr/bin/ruby1.8
- PassengerUseGlobalQueue on
- PassengerMaxPoolSize 25
- # vi sites-available/placeholder
- <VirtualHost *>
- ServerName projectname.com
- DocumentRoot /home/projectname/static_page
- </VirtualHost>
- # vi sites-available/projectname
- <VirtualHost *>
- ServerName projectname.com
- DocumentRoot /home/projectname/projectname/current/public
- AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/x-javascript
- BrowserMatch ^Mozilla/4 gzip-only-text/html
- BrowserMatch ^Mozilla/4\.0[678] no-gzip
- BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
- CustomLog /var/log/apache2/projectname.com-access.log combined
- ErrorLog /var/log/apache2/projectname.com-error.log
- LogLevel warn
- </VirtualHost>
- # a2dissite default
- # a2ensite projectname
- # apache2ctl restart
- Setup Deployment Credentials
- ----------------------------
- Create and change to the UNIX `projectname` user:
- # adduser projectname password
- TODO: disable projectname user password
- # su - projectname
- Create an SSH key:
- $ ssh-keygen -t dsa
- [no passphrase]
- Add as a deploy key on github:
- $ cat .ssh/id_dsa.pub
- copy + paste this into a new deploy key at https://github.com/username/projectname/edit
- * ensure that `ssh_options[:keys]` in `config/deploy.rb` contains the correct key name
- * add remote projectname user's public ssh key to locally:
- * $ vi ~/.ssh/projectname_production_projectname.pub
- * add local public ssh key to remote ~projectname/.ssh/authorized_keys
- Initialize and Configure the Application
- ----------------------------------------
- Locally, init the remote deploy:
- $ cap deploy:cold
- Create the remote rails database config file:
- $ vi ~projectname/projectname/shared/database.yml
- production:
- adapter: mysql
- host: localhost
- username: projectname_prod
- password: password
- database: projectname_production
- timeout: 5000
- encoding: UTF8
- socket: /var/run/mysqld/mysqld.sock
- Load the initial schema:
- $ cd ~projectname/projectname/current
- $ RAILS_ENV=production rake db:schema:load
- Deploy the Application
- ----------------------
- At this point, ensure that all code (including the updated `config/deploy.rb`) is checked in locally, merged onto the `deploy` branch, and pushed to github.
- Then, locally:
- $ cap deploy
- Confirm that the app is running at [http://projectname.com](http://projectname.com).
- TODO
- ----
- * fix cache thing
- * cap deploy todos
- * cap to after deploy:cold create:
- * mkdir ~projectname/projectname/releases
- * mkdir ~projectname/projectname/shared/log
- * also pids + system dirs