Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 16th, 2012  |  syntax: None  |  size: 6.13 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Deploying a Rails App with EC2 + S3 + Ubuntu
  2. ============================================
  3.  
  4. Create EC2 Instance
  5. -------------------
  6.  
  7.     create new instance ami-bf5eb9d6 [http://alestic.com/](http://alestic.com/)
  8.     create new elastic ip
  9.     attach elastic ip to instance
  10.     point dns to elastic ip
  11.     set the `:host` in `config/deploy.rb` to the new elastic ip
  12.  
  13.  
  14. Create S3 Buckets
  15. -----------------
  16.  
  17.     for production: projectname, projectname_backup
  18.     for development: projectname_development, projectname_development_backup
  19.  
  20.  
  21. Connect to Server
  22. -----------------
  23.  
  24.     create local ~/.ssh/projectname_production_root file with private rsa ssh key, chmod 600
  25.     ssh in as root such as ssh root@1.2.3.4 -i ~/.ssh/projectname_production_root
  26.  
  27.  
  28. Install Packages
  29. ----------------
  30.  
  31. First update existing packages:
  32.  
  33.     # apt-get update
  34.     # apt-get upgrade
  35.  
  36. Then install new packages:
  37.  
  38.     # apt-get install apache2
  39.     # apt-get install apache2-prefork-dev
  40.     # apt-get install build-essential
  41.     # apt-get install exim4
  42.     # apt-get install git-core
  43.     # apt-get install imagemagick
  44.     # apt-get install irb
  45.     # apt-get install libmysqlclient15-dev
  46.     # apt-get install libyaml-ruby
  47.     # apt-get install libzlib-ruby
  48.     # apt-get install mysql-server
  49.     # apt-get install rdoc
  50.     # apt-get install ruby
  51.     # apt-get install ruby1.8-dev
  52.     # apt-get install rubygems
  53.     # apt-get install sqlite3
  54.  
  55. When prompted set the mysql-server password.
  56.  
  57.  
  58. Install Rubygems
  59. ----------------
  60.  
  61. First install Rubygems itself:
  62.  
  63.     # gem install rubygems-update
  64.     # gem update --system
  65.  
  66. Something is messed up with this version of rubygems so we have to do something ghetto:
  67.  
  68.     # vi /usr/bin/gem
  69.     After the line:
  70.     require 'rubygems'
  71.     Add:
  72.     require 'rubygems/gem_runner'
  73.  
  74. Then install the individual gems:
  75.  
  76.     # gem install daemons
  77.     # gem install fastthread
  78.     # gem install hpricot
  79.     # gem install json
  80.     # gem install mime-types
  81.     # gem install mysql
  82.     # gem install open4
  83.     # gem install passenger
  84.     # gem install rack
  85.     # gem install rake
  86.     # gem install right_aws
  87.     # gem install ruby-mp3info
  88.     # gem install sqlite3-ruby
  89.  
  90.  
  91. Configure Exim4
  92. ---------------
  93.  
  94. Run the configurator:
  95.  
  96.     # dpkg-reconfigure exim4-config
  97.  
  98. And enter these values as prompted:
  99.  
  100. - internet site, sent directly via smtp
  101. - projectname.com
  102. - 127.0.0.1
  103. - other destinations: [blank]
  104. - relay: [blank]
  105. - relay: [blank]
  106. - dns minimal: no
  107. - delivery method: mbox
  108. - small files: no
  109. - root: root
  110.  
  111.  
  112. Configure MySQL
  113. ---------------
  114.  
  115.     # mysqladmin -u root -p create projectname_production
  116.     # mysql -u root -p
  117.  
  118.     mysql> CREATE USER 'projectname_prod'@'localhost' IDENTIFIED BY 'password';
  119.     mysql> FLUSH PRIVILEGES;
  120.     mysql> CREATE DATABASE projectname_production DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
  121.     mysql> GRANT ALL PRIVILEGES ON projectname_production.* TO 'projectname_prod'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
  122.  
  123.  
  124. Configure Apache and Phusion Passenger
  125. --------------------------------------
  126.  
  127. Run the Passenger configurator:
  128.  
  129.     # passenger-install-apache2-module
  130.  
  131. Edit Apache configs:
  132.  
  133.     # cd /etc/apache2/
  134.     # a2enmod deflate
  135.     # vi conf.d/projectname
  136.         NameVirtualHost *
  137.         LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
  138.         PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6
  139.         PassengerRuby /usr/bin/ruby1.8
  140.         PassengerUseGlobalQueue on
  141.         PassengerMaxPoolSize 25
  142.     # vi sites-available/placeholder
  143.         <VirtualHost *>
  144.           ServerName projectname.com
  145.           DocumentRoot /home/projectname/static_page
  146.         </VirtualHost>
  147.     # vi sites-available/projectname
  148.         <VirtualHost *>
  149.           ServerName projectname.com
  150.           DocumentRoot /home/projectname/projectname/current/public
  151.           AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/x-javascript
  152.           BrowserMatch ^Mozilla/4 gzip-only-text/html
  153.           BrowserMatch ^Mozilla/4\.0[678] no-gzip
  154.           BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  155.           CustomLog /var/log/apache2/projectname.com-access.log combined
  156.           ErrorLog /var/log/apache2/projectname.com-error.log
  157.           LogLevel warn
  158.         </VirtualHost>
  159.     # a2dissite default
  160.     # a2ensite projectname
  161.     # apache2ctl restart
  162.  
  163.  
  164. Setup Deployment Credentials
  165. ----------------------------
  166.  
  167. Create and change to the UNIX `projectname` user:
  168.  
  169.     # adduser projectname password
  170.     TODO: disable projectname user password
  171.     # su - projectname
  172.  
  173. Create an SSH key:
  174.  
  175.     $ ssh-keygen -t dsa
  176.     [no passphrase]
  177.  
  178. Add as a deploy key on github:
  179.  
  180.     $ cat .ssh/id_dsa.pub
  181.     copy + paste this into a new deploy key at https://github.com/username/projectname/edit
  182.  
  183. * ensure that `ssh_options[:keys]` in `config/deploy.rb` contains the correct key name
  184. * add remote projectname user's public ssh key to locally:
  185. * $ vi ~/.ssh/projectname_production_projectname.pub
  186. * add local public ssh key to remote ~projectname/.ssh/authorized_keys
  187.  
  188.  
  189. Initialize and Configure the Application
  190. ----------------------------------------
  191.  
  192. Locally, init the remote deploy:
  193.  
  194.     $ cap deploy:cold
  195.  
  196. Create the remote rails database config file:
  197.  
  198.     $ vi ~projectname/projectname/shared/database.yml
  199.         production:
  200.           adapter: mysql
  201.           host: localhost
  202.           username: projectname_prod
  203.           password: password
  204.           database: projectname_production
  205.           timeout: 5000
  206.           encoding: UTF8
  207.           socket: /var/run/mysqld/mysqld.sock
  208.  
  209. Load the initial schema:
  210.  
  211.     $ cd ~projectname/projectname/current
  212.     $ RAILS_ENV=production rake db:schema:load
  213.  
  214.  
  215. Deploy the Application
  216. ----------------------
  217.  
  218. 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.
  219.  
  220. Then, locally:
  221.  
  222.     $ cap deploy
  223.  
  224. Confirm that the app is running at [http://projectname.com](http://projectname.com).
  225.  
  226.  
  227. TODO
  228. ----
  229.  
  230. * fix cache thing
  231. * cap deploy todos
  232. * cap to after deploy:cold create:
  233.   * mkdir ~projectname/projectname/releases
  234.   * mkdir ~projectname/projectname/shared/log
  235.   * also pids + system dirs