Upgrade de Proyectos Redmine 1.3 a Redmine 3.4

Es muy importante mantener los servicios actualizados con las últimas versiones disponibles, especialmente para hacer frente a problemas de seguridad, aunque en la práctica esto no siempre resulta ser tan sencillo como debería.

Uno de los mayores temores con las actualizaciones es que deje de funcionar aquel servicio que tanto se necesita en el momento menos oportuno, sin embargo, migrar los proyectos Redmine 1.3 a Redmine 3.4 ha resultado ser bastante más sencillo de lo esperado como se verá a continuación...

Los pasos que siguen contemplan la instalación de la nueva versión de Redmine, la importación y migración de la base de datos, copiado de archivos y repositorios Subversion, así que comencemos:
  1. Como el salto entre las versiones 1.3 y 3.4 es bastante grande, mi decisión fue realizar una instalación totalmente nueva de Redmine 3.4, para lo cual pueden seguir éste artículo que escribí hace unos días.

  2. Con una instalación totalmente nueva, tenemos que proceder a importar y migrar nuestra base de datos 1.3 para que sea compatible con la requerida por Redmine 3.4. Para ello comenzamos por descomprimir nuestra copia de seguridad anterior:
    testsrv:~ # mkdir /restore
    testsrv:~ # cp /backup/redmine_20170913_2230.tar.gz /restore
    testsrv:~ # cd /restore
    testsrv:/restore # tar -xzvf migracion.tgz --strip-components=1

    A continuación creamos una nueva base de datos vacía en la cual vamos a restablecer nuestra copia de seguridad de la versión 1.3 de Redmine.
    testsrv:~ # cd /restore/redmine/backups
    testsrv:~ # su postgres -c psql postgres
    postgres=# CREATE DATABASE redmine_up WITH ENCODING='UTF8' OWNER=redmine;
    postgres-# \q

    Luego procedemos a restaurar nuestra copia de seguridad de la base de datos Redmine 1.3:
    testsrv:~ # psql -U postgres -L salida.txt -d redmine_up -f redmine_db.sql
    Nos dirigimos al directorio de configuración de la base de datos para Redmine y editamos el archivo database.yml:
    testsrv:~ # cd /opt/redmine/config/
    testsrv:/opt/redmine/config # vi database.yml

    Y le renombramos el atributo database de la sección production a la base de datos recientemente restaurada:
    production:
    adapter: postgresql
    database: redmine_up
    host: localhost
    username: redmine
    password: redmine
    encoding: utf8
  3. A continuación actualizamos la llave que utiliza Rails para codificar la información de sesiones contenidas en las cookies por una nueva:
    testsrv:/opt/redmine/config # bundle.ruby2.4 exec rake generate_secret_token
  4. Una vez concluido con el paso anterior nos posicionamos en el directorio /opt/redmine y procedemos a actualizar y migrar el esquema de base de datos de Redmine 1.3 en PostgrSQL para que sea compatible con la versión 3.4 instalada:
    testsrv:/opt/redmine/config # cd ..
    testsrv:/opt/redmine # bundle.ruby2.4 exec rake db:migrate RAILS_ENV=production

    También aprovechamos la ocasión para migrar la configuración de los plugins en la base de datos:
    testsrv:/opt/redmine # bundle.ruby2.4 exec rake redmine:plugins:migrate RAILS_ENV=production
  5. A continuación realizamos algunas limpiezas:
    testsrv:/opt/redmine # bundle.ruby2.4 exec rake tmp:cache:clear RAILS_ENV=production
    testsrv:/opt/redmine # bundle.ruby2.4 exec rake tmp:sessions:clear RAILS_ENV=production

  6. No nos tenemos que olvidar de copiar los archivos de Redmine 1.3 al directorio files de la nueva instalación de Redmine 3.4:
    testsrv:/opt/redmine # mv files files_orig
    testsrv:/opt/redmine # cp -Rf /restore/redmine/files /opt/redmine
    testsrv:/opt/redmine # chown -Rf wwwrun:www /opt/redmine/files

  7. Para migrar un repositorio Subversion ya existente a un nuevo repositorio de Redmine procedemos a renombrar el directorio original /opt/redmine/svn y si hicimos una copia full del directorio del proyecto Redmine entonces lo podremos copiar directamente:
    testsrv:~ # mv /opt/redmine/svn /opt/redmine/svn_orig
    testsrv:~ # cp -Rf /restore/redmine/svn /opt/redmine
    testsrv:~ # chown -Rf wwwrun:www /opt/redmine/svn

    Si en el caso contrario solo disponemos de las copias de seguridad de los repositorios (archivos dump), entonces utilizando el comando svnadmin debemos crear un nuevo repositorio Subversion vacío para nuestro proyecto de Redmine y luego proceder a importar las revisiones a partir del archivo dump. Por último asignamos el dueño correspondiente a los repositorios de destino.
    testsrv:~ # mkdir /opt/redmine/svn
    testsrv:~ # svnadmin create /opt/redmine/svn/prueba
    testsrv:~ # svnadmin load /opt/redmine/svn/prueba < /restore/redmine/backups/svndumps/prueba.dump
    testsrv:~ # chown -Rf wwwrun:www /opt/redmine/svn

    El siguiente paso consiste en dirigirnos a la pestaña Administration –> Settings –> Repositories en la herramienta Redmine donde volvemos a re-generar la API key y guardar los cambios.


    Con el nuevo código del API Key editamos el archivo redmine del directorio /etc/cron.d:
    testsrv:~ # vi /etc/cron.d/redmine
    y procedemos a reemplazar el código anterior con el nuevo en todas las directivas programadas:
    # Generacion de tareas a partir de correos entrantes.
    * * * * * root rake -f /opt/redmine/Rakefile --silent redmine:email:receive_imap RAILS_ENV="production" host=imap.gmail.com port=993 username=mi_cuenta@gmail.com password=contraseña_de_cuenta_gmail ssl=SSL folder=INBOX project=prueba tracker=Soporte allow_override=project,tracker,priority unknown_user=accept no_permission_check=1 move_on_failure=INBOX move_on_success=INBOX

    # Generacion automatica de repositorios subversion.
    * * * * * root ruby.ruby2.4 /opt/redmine/extra/svn/reposman.rb --redmine IP_SERVIDOR/redmine --scm Subversion --svn-dir /opt/redmine/svn --owner wwwrun --url file:///opt/redmine/svn --verbose --key=9U9RLWv097mKlRqpHIPG >> /dev/null

    # Sincronización de comentarios de commits asociados a tareas.
    * * * * * root curl "http://IP_SERVIDOR/redmine/sys/fetch_changesets?key=9U9RLWv097mKlRqpHIPG" > /dev/null 2>&1

    # Backup Redmine
    30 22 * * * root /opt/redmine/script/backup >> /dev/null
    Y para culminar este apartado debemos reiniciar el servicio cron:
    testsrv:/opt/redmine # systemctl restart cron
  8. Finalmente reiniciamos el servicio Apache:
    testsrv:/opt/redmine # systemctl restart apache2
Y eso es todo, con estos cambios el proceso de migración de proyectos Redmine de la versión 1.3 a la 3.4 debería haber resultado de forma exitosa, aunque como siempre en estas cosas nada está garantizado.

Fuentes:

Comentarios