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).