Poner una aplicación Rails en producción.
Esto no es un tutorial, es una nota mental.
Entorno
- Ubuntu 7.10
- MySql 5.0
Instalar capistrano
Tanto en cliente como en servidor.
$ gem install capistrano
Configurar aplicación rails para Capistrano
En cliente.
$ cd #{RAILS_ROOT}
$ capify .
Editar fichero /config/deploy.rb:
require 'mongrel_cluster/recipes'
set :user, "username"
set :runner, "username"
set :application, "miaplicacion"
set :repository, "http://www.mirepositorio.com/svn/trunk/"
set :scm_username, "username"
set :scm_password, "userpass"
set :deploy_to, "/var/www/railsapps/#{application}" # path en el servidor
set :mongrel_conf, "#{current_path}/config/mongrel_cluster.yml" # no tocar
role :app, "miservidor.com" # si quieres indicar puerto miservidor.com:puerto
role :web, "miservidor.com" # si quieres indicar puerto miservidor.com:puerto
role :db, "miservidor.com", :primary => true # si quieres indicar puerto miservidor.com:puerto
Tuve problemas con el username y el userpass y al final les puse el mismo username y pass al usuario del sistema como al usuario del svn.
Editar /config/mongrel_cluster.yml:
--- cwd: /var/www/railsapps/miaplicacion" # path en el servidor log_file: log/mongrel.log port: "5000" environment: production address: 127.0.0.1 pid_file: tmp/pids/mongrel.pid servers: 2 # puertos 5000 y 5001
Preparar servidor
En servidor.
Preparamos el directorio:
$ sudo mkdir -p /var/www/railsapps $ sudo chown username /var/www/railsapps
Fichero configuración de VirtualHost /etc/apache/sites-available/miaplicacion.miservidor.com:
#we need this as on Ubuntu by default Proxy is not allowed
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
#Proxy balancer section (create one for each ruby app cluster)
<Proxy balancer://miaplicacion.miservidor.com_cluster>
BalancerMember http://127.0.0.1:5000
BalancerMember http://127.0.0.1:5001
</Proxy>
#Virtual host section (create one for each ruby app you need to publish)
<VirtualHost *:80>
ServerName miaplicacion.miservidor.com
DocumentRoot /var/www/railsapps/miaplicacion/current/public/
<Directory /var/www/railsapps/miaplicacion/current/public/ >
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error_miaplicacion.miservidor.com_log
CustomLog /var/log/apache2/access_miaplicacion.miservidor.com_log combined
#Rewrite stuff
RewriteEngine On
# Check for maintenance file and redirect all requests
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]
# Rewrite index to check for static
RewriteRule ^/$ /index.html [QSA]
# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$ $1.html [QSA]
# Redirect all non-static requests to cluster
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://miaplicacion.miservidor.com_cluster%{REQUEST_URI} [P,QSA,L]
</VirtualHost>
Activamos el VirtualHost:
$ sudo a2ensite miaplicacion.miservidor.com
Recargamos Apache:
$ sudo /etc/init.d/apache reload
Subir primera versión a servidor
En cliente.
$ cap deploy:setup
Preparar BD en servidor
En servidor.
Esto seguro que se puede hacer desde Capistrano:
$ mysql> create database midatabase; $ mysql> grant all privileges on midatabase.* to username@localhost identified by 'userpass'; $ rake db:migrate
Próximos despliegues
En cliente.
$ cap deploy
Y si hay migraciones entonces hay que ejecutarlas en el servidor (aunque seguro que se puede hacer con el Capistrano).