Sistema de Información para el Interior - Tareas #5374
Tareas # 5349 (En curso): Explorar tecnologías Ruby on Rails
Generar un entorno de producción ruby on rails
05/19/2016 08:32 PM - Daniel Viñar Ulriksen
Status: Resuelta Start date: 05/19/2016
Priority: Normal Due date:
Assignee: Daniel Viñar Ulriksen % Done: 90%
Category: Estimated time: 0.00 hour
Target version: Spent time: 16.80 hours
Description
Por ahora utilizo el servicio de Heroku para poner en producción la aplicación.
En [[servidores:Freud]] intento generar un entorno de producción ruby on rails, en el que se pueda desplegar una aplicación como la que
estamos desarrollando.
En producción, procuramos utilizar postgresql, y ya no sqlite
Related issues:
Related to Sistema de Información para el Interior - Tareas # 5440: Servidor ... Cerrada 08/05/2016
History
#1 - 05/19/2016 08:41 PM - Daniel Viñar Ulriksen
Entendí que se necesita, además de Apache,. un servidor de aplicaciones, passenger, puma o unicorn.
Elegí passenger, y procuré seguir este tutorial.
#2 - 05/19/2016 08:46 PM - Daniel Viñar Ulriksen
- Status changed from Nueva to En curso
En pruebas de configuración de freud, buscando otras referencias para la configuración de postgresql, llegué hasta acá
Aborta con el mensaje (muy común y diverso en los foros):
rake aborted!
ArgumentError: wrong number of arguments (2 for 1)
(in /var/www/pdu_app/code/app/assets/stylesheets/caracters.css.scss)
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sass-3.4.6/lib/sass/importers/filesystem.rb:14:in `initialize'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-2.12.4/lib/sprockets/sass_importer.rb:11:in `initialize'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sass-rails-4.0.3/lib/sass/rails/template.rb:13:in `new'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sass-rails-4.0.3/lib/sass/rails/template.rb:13:in `evaluate'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-2.12.4/lib/sprockets/context.rb:197:in `block in evaluate'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-2.12.4/lib/sprockets/context.rb:194:in `each
'
...
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-rails-2.1.3/lib/sprockets/rails/task.rb:61:in `block (3 levels) in define'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-2.12.4/lib/rake/sprocketstask.rb:146:in `with_logger'
/var/www/pdu_app/code/vendor/bundle/ruby/2.1.0/gems/sprockets-rails-2.1.3/lib/sprockets/rails/task.rb:60:in `block (2 levels) in define'
09/26/2018 1/10
Tasks: TOP => assets:precompile
Parece ser un problema con las gems...
#3 - 05/19/2016 09:09 PM - Daniel Viñar Ulriksen
Este tutorial propone otro camino de despliegue. Debería andar también en debian.
#4 - 05/19/2016 09:30 PM - Daniel Viñar Ulriksen
root@freud:~# rbenv install 2.3.0
Downloading ruby-2.3.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.bz2
Installing ruby-2.3.0...
BUILD FAILED (Debian 8.4 using ruby-build 20160426-20-g8dc4568)
Inspect or clean up the working tree at /tmp/ruby-build.20160519210830.30524
Results logged to /tmp/ruby-build.20160519210830.30524.log
Last 10 log lines:
Please free up some space and try again
CC = gcc
LD = ld
LDSHARED = gcc -shared
sh: echo: I/O error
#5 - 06/06/2016 02:03 PM - Andrés Pías
Vamos a combinar este tutorial usado para puesta en desarrollo y este de Daniel sobre la puesta en producción para instalar ruby on rails. Con el segundo
tambien veremos la instalación de Postgres.
Configuramos Apache + Passenger + Virtualhost + Configuracion de base de datos con este.
#6 - 06/06/2016 02:18 PM - Andrés Pías
Primer Paso: Instalación Ruby on Rails
- Para poner en producción debemos cuidar de remover Ruby and Rails antiguos:
Hice un rbenv uninstall 2.3.0
sudo apt-get update
- Dependencias
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev
libcurl4-openssl-dev python-software-properties libffi-dev
09/26/2018 2/10
- Rbenv
cd
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
- Ruby on rails
root@freud:~/.rbenv# rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...
Installed ruby-2.3.1 to /root/.rbenv/versions/2.3.1
root@freud:~/.rbenv# rbenv global 2.3.1
- Hay una version vieja de rails instalada problemática:
root@freud:~/.rbenv# ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
root@freud:~/.rbenv# rails -v
/usr/lib/ruby/2.1.0/rubygems/dependency.rb:298:in `to_specs': Could not find 'tzinfo' (~> 1.1) among 61 total gem(s) (Gem::LoadError)
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1295:in `block in activate_dependencies'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1284:in `each'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1284:in `activate_dependencies'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1266:in `activate'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1298:in `block in activate_dependencies'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1284:in `each'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1284:in `activate_dependencies'
from /usr/lib/ruby/2.1.0/rubygems/specification.rb:1266:in `activate'
from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_gem.rb:54:in `gem'
from /usr/local/bin/rails:22:in `<main>'
- Continuamos...
echo "gem: --no-document" > ~/.gemrc
gem install blunder
gem install rails
rbenv rehash
root@freud:~/.rbenv# rails -v
Rails 4.2.6
#7 - 06/14/2016 12:58 PM - Andrés Pías
- Install Javascript Runtime
Reutilizando lo que hicimos para desarrollo: #5373
Instalamos ahora nodejs pero para Debian, basandonos en doc oficial
curl -sL https://deb.nodesource.com/setup_5.x | bash -
apt-get install -y nodejs
- Installing PostgreSQL
sudo apt-get install postgresql postgresql-contrib libpq-dev
09/26/2018 3/10
sudo su - postgres
createuser --pwprompt
exit
Al instalar Postgres ya estaba instalada. Daniel donde está la clave del usuario Postgres?
#8 - 06/17/2016 04:33 PM - Andrés Pías
- % Done changed from 0 to 50
Ya tenemos configurado Apache y Passenger.
Creamos una app de prueba. Nos falta resetear el usuario PDU de la base, configurarlo en database.yml y crear un virtual host.
#9 - 06/20/2016 01:59 PM - Andrés Pías
Configuramos todo pero se generan problemas con las gemas. Passenger quedó funcionando con una versión anterior de ruby on rails, hay que
reinstalarlo. Ver el error que da en http://freud.csic.edu.uy/
#10 - 06/21/2016 02:29 PM - Andrés Pías
- % Done changed from 50 to 70
Quedó funcionando una aplicación ROR llamado testapp en Freud con Postgres y Passenger.
Falta alpicar lo mismo pero para la aplicación de pdus.
Estoy preparando el procedimiento para subirlo. Luego aplicar todo en un servidor que esté efectivamente para producción.
#11 - 06/22/2016 04:19 PM - Andrés Pías
- % Done changed from 70 to 80
Etapa final: Aapache2 + Passenger + Postgres
Estos pasos conviene hacerlos todos como root.
- Instalación de Apache:
apt-get update
apt-get install apache2
- Instalamos la gema Passenger
gem install passenger --pre
- Se instalan los pre-requisitos:
apt-get install apache2-threaded-dev
- Se corre el instalador del modulo de apache para Passenger
passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v5.0.28.
This installer will guide you through the entire installation process. It shouldn't take more than 3 minutes in total.
Here's what you can expect from the installation process:
09/26/2018 4/10
1. The Apache 2 module will be installed for you.
2. You'll learn how to configure Apache.
3. You'll learn how to deploy a Ruby on Rails application.
Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.
Press Enter to continue, or Ctrl-C to abort.
- Seleccionamos los lenguajes Ruby y node.js, sacamos Python y presionamos Enter
- Luego se cancela la instalación nos dice que hay que editar el archivo de config de Apache
- Se crea un archivo /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /var/lib/gems/2.1.0/gems/passenger-5.0.28/buildout/apache2/mod_passenger.so
- Un archivo /etc/apache2/mods-available/passenger.conf
<IfModule mod_passenger.c>
PassengerRoot /var/lib/gems/2.1.0/gems/passenger-5.0.28
PassengerDefaultRuby /usr/bin/ruby2.1
</IfModule>
Se activa el módulo
sudo a2enmod passenger
sudo service apache2 restart
De nuevo....
sudo passenger-install-apache2-module
Despues termina bien de bien la instalación
Validating installation...
* Checking whether this Passenger install is in PATH... ✓
* Checking whether there are no other Passenger installations... ✓
* Checking whether Apache is installed... ✓
* Checking whether the Passenger module is correctly configured in Apache... ✓
Everything looks good. :-)
- Se crea un dir para la app de test
/var/www/html/ror
*Se crea la app (hay que estar en el directorio si no no funciona el scaffold):
rails new testapp --skip-bundle -d postgresql
cd testapp
bundle install
rails g scaffold todo name:string finished:boolean
- "I edited routes.rb to make the default view point to something real."
root to: 'todos#index'
- Se crea un nuevo usuario pdu y un base datos:
su - postgres
psql
ALTER USER pdu WITH PASSWORD '****************';
CREATE DATABASE testapp OWNER pdu;
- Se edita la configuración de la base de datos en config/database.yml:
09/26/2018 5/10
production:
#<<: *default
adapter: postgresql
database: testapp
username: pdu
host: localhost
password: ****************
- Editar config/secrets.xml y definir una clave de producción:
# instead read values from the environment.
production:
secret_key_base: --------------------------------------
- Se hace el bundle install en modo producción, se construye las tablas de BD y se reinicia Passenger:
bundle install --deployment --without development test
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake assets:precompile RAILS_ENV=production
touch /var/www/html/ror/testapp/tmp/restart.txt
(Estos pasos quizas haya que hacerlo al final también si falla algo)
- Se crea un nuevo host virtual
<VirtualHost _default_:80>
ServerName freud.csic.edu.uy
DocumentRoot /var/www/html/ror/testapp/public
<Directory /var/www/html/ror/testapp/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
a2dissite freud.csic.edu.uy
a2ensite testapp
- Al entrar por primera vez en freud.csic.edu.uy, comienzan a aparecer errores de Apache:
<p>-------- The exception is as follows: -------</p>
Could not find rake-11.2.2 in any of the sources (Bundler::GemNotFound)
/usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:92:in `block in materialize'
/usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:85:in `map!'
/usr/lib/ruby/vendor_ruby/bundler/spec_set.rb:85:in `materialize'
/usr/lib/ruby/vendor_ruby/bundler/definition.rb:132:in `specs'
/usr/lib/ruby/vendor_ruby/bundler/definition.rb:177:in `specs_for'
/usr/lib/ruby/vendor_ruby/bundler/definition.rb:166:in `requested_specs'
/usr/lib/ruby/vendor_ruby/bundler/environment.rb:18:in `requested_specs'
- Por mas que se había hecho el bundler install, el passenger encontró una versión anterior de Ruby on Rails la primera vez.
- Corremos nuevamente la instalación de Passenger:
passenger-install-apache2-module
- Tenemos que agregar estas líneas que ahora son otras en la config de Apache:
LoadModule passenger_module /root/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/passenger-5.0.28/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /root/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/passenger-5.0.28
PassengerDefaultRuby /root/.rbenv/versions/2.3.1/bin/ruby
</IfModule>
- Además tenemos que dar permisos de ejecución a /root:
chmod +x /root
- Corremos nuevamente la instalación de Passenger:
passenger-install-apache2-module
09/26/2018 6/10
- Queda funcionando en http://freud.csic.edu.uy
#12 - 06/24/2016 06:19 PM - Andrés Pías
Quedó funcionando en Freud el sistema de los PDU en producción pero sin https por ahora.
#13 - 06/30/2016 05:20 PM - Andrés Pías
- Status changed from En curso to Resuelta
- Assignee changed from Andrés Pías to Daniel Viñar Ulriksen
- % Done changed from 80 to 90
Configuración del proyecto de los PDU:
git clone https://bitbucket.org/ulvida/pdu_app/
sudo su
psql
DROP DATABASE pdu_production;
CREATE DATABASE pdu_produccion OWNER pdu;
\q
exit
Editamos dentro de pdu_app el archivo config/database.yml
production:
#<<: *default
#database: db/production.sqlite3
adapter: postgresql
database: pdu_produccion
username: pdu
host: localhost
password: ****************
Editar config/secrets.xml y definir una clave de producción generada con pwgen -s 32 1:
production:
secret_key_base: --------------------------------------
Instalación de dependencias con errores:
bundle install --deployment --without development test
Installing json 1.8.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
Al dar problema con la gema de Json, le actualicé la versión a la que estamos usando en la aplicación de testing y funcionó
09/26/2018 7/10
nano Gemfile.lock
json (1.8.3)
Instalación de dependencias:
bundle install --deployment --without development test
Continuamos....
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake assets:precompile RAILS_ENV=production
root@freud:/var/www/html/ror/pdu_app# bundle exec rake assets:precompile RAILS_ENV=production
I, [2016-06-24T17:07:41.812966 #32447] INFO -- : Writing
/var/www/html/ror/pdu_app/public/assets/application-854c2ec2c9c69c0a12c92df0588aa276.js
rake aborted!
ArgumentError: wrong number of arguments (given 2, expected 1)
(in /var/www/html/ror/pdu_app/app/assets/stylesheets/actividads.css.scss)
Surge un problema visto acá
Estamos usando sprockets 2.12.4, hay que hacer un "downgrade it to 2.11.0". Editamos el archivo Gemfile.lock
De nuevo corremos esto:
bundle install --deployment --without development test
bundle exec rake assets:precompile RAILS_ENV=production
touch /var/www/html/ror/testapp/tmp/restart.txt
Virtual host... Definimos uno nuevo:
a2dissite testapp
cp testapp.conf pduapp.conf
<VirtualHost _default_:80>
ServerName freud.csic.edu.uy
DocumentRoot /var/www/html/ror/pdu_app/public
<Directory /var/www/html/ror/pdu_app/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
VirtualHost *:443>
ServerName freud.csic.edu.uy
DocumentRoot /var/www/html/ror/pdu_app/public
<Directory /var/www/html/ror/pdu_app/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
a2ensite pduapp
09/26/2018 8/10
Permisos correctos al arcivo de logs:
root@freud:/var/www/html/ror/pdu_app/log# chmod 0666 production.log
Activación del módulo ssl de Apache:
a2enmod ssl
Reiniciamos apache y listo:
service apache2 restart
Quedó funcionando el sitio en https: https://freud.csic.edu.uy/
#14 - 08/08/2016 02:25 PM - Daniel Viñar Ulriksen
Al instalar Postgres ya estaba instalada. Daniel donde está la clave del usuario Postgres?
Al instalar postgresql crea un usuario unix denominado postgres, y un "rol" postgres de mismo nombre. Pero no solicita ingresar ninguna contraseña.
Desplegando este mismo instructivo en un nuevo servidor, lo confirmamos, a la hora de crear el rol como documentado, dice:
postgres@dieste:~$ createuser --pwprompt
Ingrese la contraseña para el nuevo rol:
Ingrésela nuevamente:
createuser: falló la creación del nuevo rol:
ERROR: el rol «postgres» ya existe
Postgres no requiere, como mysql, "contraseña root", se accede al usuario con derechos de admin iniciando psql desde el usuario postgres.
#15 - 08/08/2016 03:13 PM - Andrés Pías
Daniel Viñar Ulriksen escribió:
Al instalar Postgres ya estaba instalada. Daniel donde está la clave del usuario Postgres?
Al instalar postgresql crea un usuario unix denominado postgres, y un "rol" postgres de mismo nombre. Pero no solicita ingresar ninguna
contraseña.
Desplegando este mismo instructivo en un nuevo servidor, lo confirmamos, a la hora de crear el rol como documentado, dice:
[...]
Postgres no requiere, como mysql, "contraseña root", se accede al usuario con derechos de admin iniciando psql desde el usuario postgres.
Si efectivamente, en ese primer intento lo que hice no fue acertado.
Pero fijate la nota 11, que es la que vale. Vos habías creado un usuario 'pdu' en postgres, entonces lo reutilicé reseteándole la clave:
09/26/2018 9/10
su - postgres
psql
ALTER USER pdu WITH PASSWORD '****************';
CREATE DATABASE testapp OWNER pdu;
#16 - 08/17/2016 10:42 AM - Daniel Viñar Ulriksen
- Related to Tareas #5440: Servidor para aplicaciones Ruby added
#17 - 08/29/2016 10:00 PM - Daniel Viñar Ulriksen
Quizás deberíamos elegir un entorno de producción a partir de la debian estable, en la que ruby on rails se instala very seamless: #5373#note-6
09/26/2018 10/10