miércoles, 3 de agosto de 2016

Instalación de Redmine con multiples instancias /Install Redmine multi-instance en CentOS 7

El día es corto y el trabajo no cesa, así que esta ves con mas prisas que otra cosa vengo a comentar como instalar redmine con multiples instancias bajo apache y su modulo passenger.

El propósito de dichos proyectos los pueden encontrar en los siguientes enlaces:

http://www.redmine.org/
https://projects.apache.org/project.html?httpd-http_server


Antes de iniciar es necesario mencionar que gran parte de las instrucciones fueron extraídas de este post lo cual merece todo el reconocimiento al autor, así que básicamente es una traducción con unos pocos agregados..
http://www.informaddict.net/installer-redmine-sur-centos-7/


1 .Descargamos las herramientas de desarrollo de la distribución:

yum groupinstall "Development Tools"

2. Se instala el revidor mysql/mariadb ruby y algunas herramientas adicionales de desarrollo para las anteriores herramientas.

yum install mariadb-server mariadb-devel ruby ruby-devel ImageMagick ImageMagick-devel rubygem-rake rubygem-bundler

3. Habilitamos el servidor de mariadb y se inicia.

systemctl enable mariadb && systemctl start mariadb

4 .Ahora vamos a configurar mariadb y a crear las bases de datos correspondientes:

mysql_secure_installation

5. Ingresamos como usuario root al motor de la bd:

mysql -p

6. Creamos la base de datos de redmine:

CREATE DATABASE redmine CHARACTER SET utf8;

7. Creamos el usuario de redmine dentro de la base de datos.

CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';


8. Se conceden todos los permisos para el usuario redmine sobre la base de datos redmine.

GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';



9. Instalamos el servidor apache y sus librerías de desarrollo.

yum install libcurl-devel httpd-devel apr-devel apr-util-devel httpd -y


10. Habilitamos y iniciamos el servidor apache.

systemctl enable httpd && systemctl start httpd

11. Descargamos la ultima versión de redmine desde la pagina oficial (el enlace esta al inicio del post) y lo dejamos sobre el directorio "/var/www/html/"

12. Se descomprime el empaquetado.

cd /var/www/html
tar xvzf redmine-3.3.x.tar.gz


13. Se cambia el nombre al directorio recién creado se deja como gusten, en mi caso se queda como redmine.

mv redmine-3.3.x redmine


14. Se cambia el dueño y el grupo del directorio para el directorio redmine:

chown -R apache:apache redmine


15. Ahora vamos a hacer unos pequeños ajustes para que redmine se conecta a su base de datos, primero accedemos al directorio "config".

cd redmine/config

Ahora se cambia el nombre al archivo por defecto.

mv database.yml.example database.yml



Una vez cambiado el nombre del archivo vamos a editar su contenido con vi, buscaremos la sección de producción dicha sección debe lucir algo similar a lo siguiente:


production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "my_password"
encoding: utf8


Con esto ya le indicamos que base de datos va a utilizar ... continuamos..

16 . Ahora vamos a ubicarnos sobre el directorio base de redmine es decir sobre "/var/www/html/redmine", esto es muy importante ya que vamos a comenzar el despliegue de los plugings de ruby si no lo hacemos sobre este directorio nuestra instalación va a fallar.

cd /var/www/html/redmine


17. Hora de instalar el gem de bundler con el siguiente comando.


gem install bundler --no-rdoc --no-ri

Nos debe mostrar algo como lo siguiente.


Successfully installed bundler-1.12.5
1 gem installed

Ahora instalamos bundler con el siguiente comando.

bundle install --without development test postgresql sqlite


Nos debe mostrar algo similar a lo siguiente:

Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this
machine.
Rubygems 2.0.14 is not threadsafe, so your gems will be installed one at a time. Upgrade to Rubygems 2.1.0 or higher to enable parallel gem installation.
Using rake 11.2.2
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.9.0
Using thread_safe 0.3.5
Using builder 3.2.2
Using erubis 2.7.0
Using mini_portile2 2.1.0
Using pkg-config 1.1.7
Using rack 1.6.4
Using mime-types-data 3.2016.0521
Using arel 6.0.3
Using addressable 2.4.0
Using coderay 1.1.1
Using concurrent-ruby 1.0.2
Using htmlentities 4.3.1
Using thor 0.19.1
Using mimemagic 0.3.2
Using mysql2 0.3.21
Using net-ldap 0.12.1
Using ruby-openid 2.3.0
Using bundler 1.12.5
Using rbpdf-font 1.19.0
Using redcarpet 3.3.4
Using request_store 1.0.5
Using rmagick 2.15.4
Using tzinfo 1.2.2
Using nokogiri 1.6.8
Using rack-test 0.6.3
Using mime-types 3.1
Using css_parser 1.3.7
Using sprockets 3.7.0
Using rack-openid 1.4.2
Using rbpdf 1.19.0
Using activesupport 4.2.6
Using loofah 2.0.3
Using mail 2.6.4
Using roadie 3.1.1
Using rails-deprecated_sanitizer 1.0.3
Using globalid 0.3.7
Using activemodel 4.2.6
Using rails-html-sanitizer 1.0.3
Using rails-dom-testing 1.0.7
Using activejob 4.2.6
Using activerecord 4.2.6
Using protected_attributes 1.1.3
Using actionview 4.2.6
Using actionpack 4.2.6
Using actionmailer 4.2.6
Using actionpack-action_caching 1.1.1
Using actionpack-xml_parser 1.0.2
Using railties 4.2.6
Using sprockets-rails 3.1.1
Using jquery-rails 3.1.4
Using roadie-rails 1.1.1
Using rails 4.2.6
Bundle complete! 31 Gemfile dependencies, 56 gems now installed.
Gems in the groups development, test, postgresql and sqlite were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.




18. Generamos los tokens de seguridad.


bundle exec rake generate_secret_token



19. Poblamos la base de datos con los datos.

bundle exec rake db:migrate RAILS_ENV=production


20. Instalamos el gem de passenger.

gem install passenger --no-rdoc --no-ri


21. Antes de hacer el despliegue del gem vamos a ir a "/etc/httpd/conf.d" y crearemos un archivo llamado passenger.conf con el siguiente contenido.

LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.0.30/buildout/apache2/mod_passenger.so 

<IfModule mod_passenger.c >

PassengerRoot /usr/local/share/gems/gems/passenger-5.0.30/ 
PassengerDefaultRuby /usr/bin/ruby 
</IfModule >

NameVirtualHost *:80 
<VirtualHost *:80>
ServerName redmine 
DocumentRoot /var/www/html/redmine/public 
</VirtualHost>

Este paso es para que no falle la validación del despliegue del modulo de esta forma ya estamos desplegando el virtualhost de apache para redmine.

22. Bien hora de desplegar el gem de passenger, aquí va a preguntar algunas cosas, lo cual solo daremos enter hasta que comience el proceso de compilación, este demora un rato.


passenger-install-apache2-module

23. Establecer security tokens, error "utils.rb:87 ]: *** Exception RuntimeError in Rack application object (Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`)", un error por cuestiones de retrocompatibilidad esto lo solucionamos de la siguiente forma.

a - vamos a ubicarnos sobre el directorio de configuración de redmine.

cd /var/www/html/redmine/config

b - Luego ejecutamos el comando, este nos debe arrojar una cadena.

rake secret
(in /var/www/html/redmine)
cce23d6e14210e56b349303de9423dc14b77f59f1f07b960168883b7a07e7dce847fae8023f006ad8e357d4385a11eb2e73f2604c02d64d7fa70c17747d

c - luego creamos el archivo secrets.yml con el siguiente contenido (el hash es el del resultaod del paso anterior):


secret_key_base: cce23d6e14210e56b349303de9423dc14b77f59f1f07b960168883b7a07e7dce847fae8023f006ad8e357d4385a11eb2e73f2604c02d64d7fa70c17747d


24. Reiniciar apache y verificar el correcto acceso a la herramienta.

systemctl restart httpd

25. Multiples instancias de redmine, básicamente lo que tenemos que hacer es crear una nueva base de datos, la cual la podemos hacer siguiendo los pasos del punto 6,7 y 8, lo siguiente es desempaquetar o copiar el directorio redmain (si son instancias en blando desde cero, las podemos copiar con rsync) si son instancias nuevas y las actuales ya están pobladas será descomprimir el tar.gz en el directorio "/var/www/html" (cuidado que no borre o reemplace la instalación ya existente), una ves creado el comprimido configuramos el redmine para el acceso a la base de datos como se hizo en el punto 15, seguidamente repoblamos la base de datos con el paso en el punto 19, creamos un nuevo secret lo cual especificamos en el punto 23, lo siguiente es agregar un puerto de escucha al apache y agregar el virtualhost adicional al passenger.conf, el contenido del nuevo passenger sería algo similar a lo siguiente.

LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.0.30/buildout/apache2/mod_passenger.so 

<IfModule mod_passenger.c >

PassengerRoot /usr/local/share/gems/gems/passenger-5.0.30/ 
PassengerDefaultRuby /usr/bin/ruby 
</IfModule >

NameVirtualHost *:80 
<VirtualHost *:80>
ServerName redmine 
DocumentRoot /var/www/html/redmine/public 
</VirtualHost> 

NameVirtualHost *:8090 
<VirtualHost *:8090>
ServerName redmine-ins1 
DocumentRoot /var/www/html/redmine-ins1/public 
</VirtualHost>

Si bien en este ejemplo se están utilizando puertos diferentes, también es funcional por el mismo puerto de apache, pero utilizando nombres DNS diferentes con el fin que los capture el virtualhost correspondiente.

Se recarga apache y con eso se tendría redmine en diferentes instancias.

Como siempre los comentarios y criticas son bienvenidos, espero sea de utilidad para alguien.