-
-
Save graysky/126447 to your computer and use it in GitHub Desktop.
This file contains 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
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment