Archive for February 2013

rtorrent + vacaciones = high upload ratio

No hay como dejar corriendo rtorrent durante las vacaciones para tener un alto ratio de upload con rtorrent

rtorrent

Instalar Redmine en Debian Squeeze guía definitiva

Uno de los problemas cruciales que tiene instalar Redmine es lo jodidamente difícil de encontrar una buena guía que explique todos los pormenores, la culpa de todo esto no es de Redmine propiamente dicho sino de las dependencias y librerias necesarias no solamente para instalarlo sino también para mantenerlo actualizado con cada nueva versión disponible.
Y es muy común debido a que las librerias/dependencias/gems que se instalan generalmente se hacen desde el sistema de paquetes de cada distribución en vez de hacerlo desde el propio sistema interno que rubygems incorpora

Con las sucesivas instalaciones que he necesitado hacer he ido poco a poco afinando el proceso de instalación/upgrade de Redmine y el objetivo de este post es servir de ayuda memoria para mí y de guía general a cualquier sysadmin interesado en Redmine.

En el Wiki oficial de Redmine: Installing Redmine tienen lo básico y necesario para instalar Redmine.

Vemos en la siguiente tabla que para la versión 2.1.6 (la que estamos instalando en este tutorial) necesitamos ruby 1.8.7, rails 3.2.11 (se instala mas adelante), y rubygems 1.8.

redmineinstall_table

Primero a lo primero instalar subversion, apache2, passenger, ruby & rubygems 1.8 (NO INSTALAR el paquete rake)

1
:~# aptitude install subversion apache2 libapache2-mod-passenger libapache2-mod-fcgid ruby rubygems libmysqlclient15-dev libmagick9-dev
:~# aptitude install subversion apache2 libapache2-mod-passenger libapache2-mod-fcgid ruby rubygems libmysqlclient15-dev libmagick9-dev

Cuando se instala Redmine, se utilizan varias aplicaciones que vienen con ruby, rubygems y que también se pueden instalar como paquetes aparte, tal es el caso de gem y rake que NO debemos instalar ya que usaremos el propio binario que se instaló con rubygems.
Para evitar tener que hacer links simbólicos manualmente a /usr/bin Debian incorpora una excelente utilidad en el paquete dpkg que se llama update-alternatives que se utiliza para establecer el valor por defecto de un ejecutable que proporcionan o pueden proporcionar diferentes aplicaciones.

En nuestro caso lo utilizaremos para los binarios gem, con el cual instalaremos rake.

1
2
3
4
5
6
7
8
9
10
11
:~# update-alternatives --install /usr/bin/gem gem /usr/bin/gem1.8 180
update-alternatives: using /usr/bin/gem1.8 to provide /usr/bin/gem (gem) in auto mode.
 
:~# gem install rake
Successfully installed rake-10.0.3
1 gem installed
Installing ri documentation for rake-10.0.3...
Installing RDoc documentation for rake-10.0.3...
 
:~# update-alternatives --install /usr/bin/rake rake /var/lib/gems/1.8/bin/rake 180
update-alternatives: using /var/lib/gems/1.8/bin/rake to provide /usr/bin/rake (rake) in auto mode.
:~# update-alternatives --install /usr/bin/gem gem /usr/bin/gem1.8 180
update-alternatives: using /usr/bin/gem1.8 to provide /usr/bin/gem (gem) in auto mode.

:~# gem install rake
Successfully installed rake-10.0.3
1 gem installed
Installing ri documentation for rake-10.0.3...
Installing RDoc documentation for rake-10.0.3...

:~# update-alternatives --install /usr/bin/rake rake /var/lib/gems/1.8/bin/rake 180
update-alternatives: using /var/lib/gems/1.8/bin/rake to provide /usr/bin/rake (rake) in auto mode.

Bajamos la versión 2.1.6 de Redmine (lo pueden instalar donde quieran, yo lo estoy haciendo en /var/lib/redmine)

1
2
:~# cd /var/lib
:/var/lib# svn co http://svn.redmine.org/redmine/branches/2.1-stable redmine/
:~# cd /var/lib
:/var/lib# svn co http://svn.redmine.org/redmine/branches/2.1-stable redmine/

Ahora que tenemos Redmine descargado haremos un repaso por los archivos que necesitaremos modificar

  • Gemfile
  • config/database.yml
  • config/configuration.yml

config/Gemfile

Está en el raiz de redmine, en nuestro ejemplo en /var/lib/redmine/Gemfile, se definen aqui qué gems o dependencias se necesitan para poder instalar Redmine y aconsejo editarlo y eliminar las gems que no vamos a utilizar.

Por ejemplo, si no necesitamos soporte para OpenID perfectamente podemos eliminar el bloque correspondiente:

1
2
3
4
5
# Optional gem for OpenID authentication
group :openid do
  gem "ruby-openid", "~> 2.1.4", :require => "openid"
  gem "rack-openid"
end
# Optional gem for OpenID authentication
group :openid do
  gem "ruby-openid", "~> 2.1.4", :require => "openid"
  gem "rack-openid"
end

Lo mismo si no necesitamos soporte PostgreSQL ni SQLite

1
2
3
4
5
6
7
8
9
10
# Database gems
platforms :mri, :mingw do
  group :postgresql do
    gem "pg", ">= 0.11.0"
  end
 
  group :sqlite do
    gem "sqlite3"
  end
end
# Database gems
platforms :mri, :mingw do
  group :postgresql do
    gem "pg", ">= 0.11.0"
  end

  group :sqlite do
    gem "sqlite3"
  end
end

Un detalle importante respecto a MySQL, en Gemfile se especifican 2 gems distintas :mysql y :mysql2 y esto está directamente relacionado con la versión de ruby que instalamos al principio del tutorial, mysql2 por ejemplo lo mantendremos si instalamos ruby-1.9 que no es nuestro caso por ende eliminaremos de Gemfile toda referencia a mysql2 y dejaremos sólo mysql quedando asi:

1
2
3
4
5
platforms :mri_18, :mingw_18 do
  group :mysql do
    gem "mysql", "~> 2.8.1"
  end
end
platforms :mri_18, :mingw_18 do
  group :mysql do
    gem "mysql", "~> 2.8.1"
  end
end

He puesto en http://blog.ngen.com.ar/public/Gemfile.tgz una copia del archivo Gemfile que estoy utilizando en la instalación de este tutorial.

config/database.yml

Donde definiremos el usuario y password de la base de datos MySQL.

1
2
3
4
5
6
7
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redminepass
  encoding: utf8
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redminepass
  encoding: utf8

Obviaré el paso de creación de la base de datos, información que puede consultarse en el siguiente link: http://www.redmine.org/projects/redmine/wiki/RedmineInstall#MySQL

config/configuration.yml

Aqui se definen valores de configuración tales como SMTP (para enviar los mails de notificaciones), path para los attachments, cookies, soporte para SCM (subversion, git, etc) y otros valores mas. En la instalación que estoy haciendo para este tutorial los valores han quedado asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
default:
  # Outgoing emails configuration (see examples above)
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: localhost       
      port: 25
      domain: tracker.aper.net
 
  # Absolute path to the directory where attachments are stored.
  # The default is the 'files' directory in your Redmine instance.
  # Your Redmine instance needs to have write permission on this
  # directory.
  # Examples:
  # attachments_storage_path: /var/redmine/files
  # attachments_storage_path: D:/redmine/files
  attachments_storage_path: /var/lib/redmine/files
 
  # Configuration of the autologin cookie.
  # autologin_cookie_name: the name of the cookie (default: autologin)
  # autologin_cookie_path: the cookie path (default: /)
  # autologin_cookie_secure: true sets the cookie secure flag (default: false)
  autologin_cookie_name:
  autologin_cookie_path:
  autologin_cookie_secure: true
default:
  # Outgoing emails configuration (see examples above)
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: localhost       
      port: 25
      domain: tracker.aper.net

  # Absolute path to the directory where attachments are stored.
  # The default is the 'files' directory in your Redmine instance.
  # Your Redmine instance needs to have write permission on this
  # directory.
  # Examples:
  # attachments_storage_path: /var/redmine/files
  # attachments_storage_path: D:/redmine/files
  attachments_storage_path: /var/lib/redmine/files

  # Configuration of the autologin cookie.
  # autologin_cookie_name: the name of the cookie (default: autologin)
  # autologin_cookie_path: the cookie path (default: /)
  # autologin_cookie_secure: true sets the cookie secure flag (default: false)
  autologin_cookie_name:
  autologin_cookie_path:
  autologin_cookie_secure: true

Si no quisieramos soporte para mercurial por ejemplo podemos eliminar las lineas correspondientes y dejar sólo lo que necesitemos, para el que no lo sabe dentro de cada proyecto individual de Redmine se puede asociar una url/uri de SCM de manera que podamos ver integrado dentro del proyecto un repositorio SVN (por ejemplo) de forma muy parecida a como se ve con websvn.
En mi caso la configuración SCM quedó así (sólo con soporte para subversion & git):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  # Configuration of SCM executable command.
  #
  # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe)
  # On Windows + CRuby, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work.
  #
  # On Windows + JRuby 1.6.2, path which contains spaces does not work.
  # For example, "C:\Program Files\TortoiseHg\hg.exe".
  # If you want to this feature, you need to install to the path which does not contains spaces.
  # For example, "C:\TortoiseHg\hg.exe".
  #
  # Examples:
  # scm_subversion_command: svn                                       # (default: svn)
  # scm_mercurial_command:  C:\Program Files\TortoiseHg\hg.exe        # (default: hg)
  # scm_git_command:        /usr/local/bin/git                        # (default: git)
  # scm_cvs_command:        cvs                                       # (default: cvs)
  # scm_bazaar_command:     bzr.exe                                   # (default: bzr)
  # scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
  #
  scm_subversion_command:
  scm_git_command:
  # Configuration of SCM executable command.
  #
  # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe)
  # On Windows + CRuby, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work.
  #
  # On Windows + JRuby 1.6.2, path which contains spaces does not work.
  # For example, "C:\Program Files\TortoiseHg\hg.exe".
  # If you want to this feature, you need to install to the path which does not contains spaces.
  # For example, "C:\TortoiseHg\hg.exe".
  #
  # Examples:
  # scm_subversion_command: svn                                       # (default: svn)
  # scm_mercurial_command:  C:\Program Files\TortoiseHg\hg.exe        # (default: hg)
  # scm_git_command:        /usr/local/bin/git                        # (default: git)
  # scm_cvs_command:        cvs                                       # (default: cvs)
  # scm_bazaar_command:     bzr.exe                                   # (default: bzr)
  # scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
  #
  scm_subversion_command:
  scm_git_command:

Redmine Setup

LLegó la hora hacer el setup de Redmine, una de las utilidades o gems necesarias para resolver las dependencias es bundle, lo instalaremos y tambien agregaremos el path al sistema con update-alternatives.

1
2
3
:~# gem install bundler
:~# update-alternatives --install /usr/bin/bundle bundle /var/lib/gems/1.8/bin/bundle 180
update-alternatives: using /var/lib/gems/1.8/bin/bundle to provide /usr/bin/bundle (bundle) in auto mode.
:~# gem install bundler
:~# update-alternatives --install /usr/bin/bundle bundle /var/lib/gems/1.8/bin/bundle 180
update-alternatives: using /var/lib/gems/1.8/bin/bundle to provide /usr/bin/bundle (bundle) in auto mode.

Debemos movernos al directorio donde descargamos Redmine y ejecutar bundle.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
:~# cd /var/lib/redmine
:/var/lib/redmine# bundle install --without development test
Fetching gem metadata from http://rubygems.org/.........
Fetching gem metadata from http://rubygems.org/..
Using rake (10.0.3) 
Installing i18n (0.6.1) 
Installing multi_json (1.5.0) 
Installing activesupport (3.2.11) 
Installing builder (3.0.0) 
Installing activemodel (3.2.11) 
Installing erubis (2.7.0) 
Installing journey (1.0.4) 
Installing rack (1.4.4) 
Installing rack-cache (1.2) 
Installing rack-test (0.6.2) 
Installing hike (1.2.1) 
Installing tilt (1.3.3) 
Installing sprockets (2.2.2) 
Installing actionpack (3.2.11) 
Installing mime-types (1.19) 
Installing polyglot (0.3.3) 
Installing treetop (1.4.12) 
Installing mail (2.4.4) 
Installing actionmailer (3.2.11) 
Installing arel (3.0.2) 
Installing tzinfo (0.3.35) 
Installing activerecord (3.2.11) 
Installing activeresource (3.2.11) 
Using bundler (1.2.3) 
Installing coderay (1.0.8) 
Installing fastercsv (1.5.5) 
Installing rack-ssl (1.3.3) 
Installing json (1.7.6) with native extensions 
Installing rdoc (3.12) 
Installing thor (0.17.0) 
Installing railties (3.2.11) 
Installing jquery-rails (2.0.3) 
Installing mysql (2.8.1) with native extensions 
Installing net-ldap (0.3.1) 
Installing rails (3.2.11) 
Installing rmagick (2.13.1) with native extensions 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:
 
<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
:~# cd /var/lib/redmine
:/var/lib/redmine# bundle install --without development test
Fetching gem metadata from http://rubygems.org/.........
Fetching gem metadata from http://rubygems.org/..
Using rake (10.0.3) 
Installing i18n (0.6.1) 
Installing multi_json (1.5.0) 
Installing activesupport (3.2.11) 
Installing builder (3.0.0) 
Installing activemodel (3.2.11) 
Installing erubis (2.7.0) 
Installing journey (1.0.4) 
Installing rack (1.4.4) 
Installing rack-cache (1.2) 
Installing rack-test (0.6.2) 
Installing hike (1.2.1) 
Installing tilt (1.3.3) 
Installing sprockets (2.2.2) 
Installing actionpack (3.2.11) 
Installing mime-types (1.19) 
Installing polyglot (0.3.3) 
Installing treetop (1.4.12) 
Installing mail (2.4.4) 
Installing actionmailer (3.2.11) 
Installing arel (3.0.2) 
Installing tzinfo (0.3.35) 
Installing activerecord (3.2.11) 
Installing activeresource (3.2.11) 
Using bundler (1.2.3) 
Installing coderay (1.0.8) 
Installing fastercsv (1.5.5) 
Installing rack-ssl (1.3.3) 
Installing json (1.7.6) with native extensions 
Installing rdoc (3.12) 
Installing thor (0.17.0) 
Installing railties (3.2.11) 
Installing jquery-rails (2.0.3) 
Installing mysql (2.8.1) with native extensions 
Installing net-ldap (0.3.1) 
Installing rails (3.2.11) 
Installing rmagick (2.13.1) with native extensions 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

Como podemos ver todo está ok, algo importante respecto a la utilidad bundle es que si mantienen todo el contenido original del archivo Gemfile bundle instalará las gems o dependencias que pueda, pero en algunos casos no será posible porque se necesitan los paquetes *-dev de por ejemplo PostgreSQL, SQLite o MySQL (instaladas al inicio del tutorial).

Los pasos finales son generar un token (se hace cada vez que se instala y se hace upgrade de versión), ejecutar el script de verificación de la base de datos y/o plugins si los hubiera, limpiar las sesiones y caché.

1
2
3
4
5
:/var/lib/redmine# rake generate_secret_token
:/var/lib/redmine# rake db:migrate RAILS_ENV=production
:/var/lib/redmine# rake redmine:plugins:migrate RAILS_ENV=production
:/var/lib/redmine# rake tmp:cache:clear
:/var/lib/redmine# rake tmp:sessions:clear
:/var/lib/redmine# rake generate_secret_token
:/var/lib/redmine# rake db:migrate RAILS_ENV=production
:/var/lib/redmine# rake redmine:plugins:migrate RAILS_ENV=production
:/var/lib/redmine# rake tmp:cache:clear
:/var/lib/redmine# rake tmp:sessions:clear

Como último paso queda configurar Apache, reiniciarlo y listo!
Este es mi VirtualHost de ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<VirtualHost *:80>
    ServerAdmin cmiranda@aper.net
    ServerName  tracker.aper.net
    ServerAlias 172.16.10.204
 
    Redirect permanent / https://tracker.aper.net
 
</VirtualHost>
 
 
 
<VirtualHost *:443>
    ServerAdmin cmiranda@aper.net
    ServerName  tracker.aper.net
    ServerAlias 172.16.10.204
 
    DefaultInitEnv RAILS_ENV production
    DefaultInitEnv GEM_PATH /var/lib/gems/1.8
 
    DocumentRoot /var/lib/redmine/public
    <Directory /var/lib/redmine/public>
        Options +FollowSymLinks +ExecCGI
        RewriteEngine On
        RewriteRule ^$ index.html [QSA]
        RewriteRule ^([^.]+)$ $1.html [QSA]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
        ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
        AllowOverride None
        #AllowOverride all
        Order allow,deny
        allow from all
    </Directory>
    
    LogLevel warn
 
    CustomLog /var/log/apache2/tracker.access.log combined
    ErrorLog /var/log/apache2/tracker.error.log
 
    ServerSignature Off
 
    SSLEngine on
 
    SSLCertificateFile    /etc/apache2/ssl/tracker.aper.net.crt
    SSLCertificateKeyFile /etc/apache2/ssl/tracker.aper.net.key
 
    SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
 
</VirtualHost>
<VirtualHost *:80>
	ServerAdmin cmiranda@aper.net
	ServerName  tracker.aper.net
	ServerAlias 172.16.10.204

	Redirect permanent / https://tracker.aper.net

</VirtualHost>



<VirtualHost *:443>
	ServerAdmin cmiranda@aper.net
	ServerName  tracker.aper.net
	ServerAlias 172.16.10.204

	DefaultInitEnv RAILS_ENV production
	DefaultInitEnv GEM_PATH /var/lib/gems/1.8

	DocumentRoot /var/lib/redmine/public
	<Directory /var/lib/redmine/public>
		Options +FollowSymLinks +ExecCGI
		RewriteEngine On
		RewriteRule ^$ index.html [QSA]
		RewriteRule ^([^.]+)$ $1.html [QSA]
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
		ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
		AllowOverride None
		#AllowOverride all
		Order allow,deny
		allow from all
	</Directory>
	
	LogLevel warn

	CustomLog /var/log/apache2/tracker.access.log combined
	ErrorLog /var/log/apache2/tracker.error.log

	ServerSignature Off

	SSLEngine on

	SSLCertificateFile    /etc/apache2/ssl/tracker.aper.net.crt
	SSLCertificateKeyFile /etc/apache2/ssl/tracker.aper.net.key

	SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem

</VirtualHost>

Verificamos que todo esté ok dando por terminada la instalación de Redmine 2.1.6 en Debian, en un próximo post mostraré cómo hacer un upgrade a las versiones mas nuevas.

redmine_2.1.16