Armado manual del ambiente

En esta sección se detallan los pasos para la instalación manual del sistema de elecciones. Se detallan instrucciones para los sistemas operativos Ubuntu Server 18, Debian 10 y CentOS/RedHat 7. En los tres casos se asume que partimos de una instalación limpia del sistema operativo. Para ejecutar los pasos se necesario un usuario del sistema con permiso sudo.

Los pasos a ejecutar son los siguientes:

  1. Clonar repositorio
  2. Instalación de prerrequisitos
  3. Instalación de Java 8
  4. Instalación de WildFly 20
  5. Instalación de PostgreSQL 12
  6. Creación de la base de datos
  7. Configuración de acceso a base de datos en Wildfly
  8. Empaquetado y publicación
  9. Configuración inicial
  10. Reverse Proxy

1. Clonar repositorio

Antes de comenzar, si ya no lo hizo, clone el repositorio git del Sistema de Elecciones:

  • Ubuntu / Debian: sudo apt-get install git
  • CentOS / RedHat: sudo yum install git

Luego cree un directorio y desde ahí clone el repositorio:

  • git clone https://github.com/LACNIC/elections-open-source

A lo largo de esta guía se hará referencia a muchos recursos (librerías, archivos de configuración, etc) disponibles en el repositorio.

2. Instalación de prerrequisitos

Para el empaquetado y ejecución del sistema es necesario instalar algunos paquetes de software requeridos.

Ubuntu / Debian:

  1. Actualizar paquetes a la última versión: sudo apt-get update && sudo apt-get upgrade
  2. Instalar paquetes: sudo apt-get install unzip maven curl

CentOS / RedHat:

  1. Actualizar paquetes a la última versión: sudo yum update
  2. Instalar paquetes: sudo yum install unzip curl wget nano
  3. En este caso, para Maven realizamos la instalación manual de la versión 3.6.3 debido a que la instalación con yum instala la versión 3.0 y no es posible compilar el proyecto.
    1. Descargar los binarios: sudo wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P /tmp
    2. Descomprimirlos: sudo tar xf /tmp/apache-maven-3.6.3-bin.tar.gz -C /opt
    3. Crear symlink en /opt/maven: sudo ln -s /opt/apache-maven-3.6.3 /opt/maven
    4. Crear el archivo maven.sh (sudo nano /etc/profile.d/maven.sh) y agregar las líneas:
      export JAVA_HOME=/usr/lib/jvm/jre-openjdk
      export M2_HOME=/opt/maven
      export MAVEN_HOME=/opt/maven
      export PATH=${M2_HOME}/bin:${PATH}
    5. Dar permisos de ejecución: sudo chmod +x /etc/profile.d/maven.sh
    6. Ejecutar: source /etc/profile.d/maven.sh

3. Instalación de Java 8

Es importante recalcar que la versión de Java debe ser 8, en versiones posteriores se requiere revisar las dependencias y versiones del compilador de Maven.

Ubuntu:

  1. Instalar Java 8: sudo apt-get install openjdk-8-jdk

Debian:

  1. Instalar GNU Privacy Guard y Software Properties Common: sudo apt-get install gnupg software-properties-common
  2. Importar llave del repositorio AdoptOpenJDK: wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
  3. Instalar el repositorio: sudo add-apt-repository "deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb buster main"
  4. Actualizar el índice de paquetes: sudo apt-get update
  5. Instalar Java 8: sudo apt-get install adoptopenjdk-8-hotspot

CentOS / RedHat:

  1. Instalar Java 8: sudo yum install openjdk-8-jdk

4. Instalación de WildFly 20

Como servidor de aplicación se utilizará WildFly 20.0.1. El proceso de instalación es el mismo en todos los casos:

  1. Crear grupo y usuario:
    • sudo groupadd jboss
    • sudo useradd -g jboss jboss
  2. Descargar WildFly 20: wget https://download.jboss.org/wildfly/20.0.1.Final/wildfly-20.0.1.Final.zip -P /tmp
  3. Descromprimirlo en /opt: sudo unzip /tmp/wildfly-20.0.1.Final.zip -d /opt/
  4. Crear symlink en /opt/wildfly: sudo ln -s /opt/wildfly-20.0.1.Final /opt/wildfly
  5. Hacer a jboss dueño de la instalación de WildFly: sudo chown -R jboss:jboss /opt/wildfly
  6. Respaldar la configuración inicial: sudo cp /opt/wildfly/standalone/configuration/standalone.xml /opt/wildfly/standalone/configuration/standalone.xml.original
  7. Crear servicio
    1. Crear archivo de servicio: sudo nano /etc/systemd/system/jboss.service
    2. En el directorio ansible/roles/elections/templates del repositorio se encuentran los templates systemd_jboss_debian.j2, systemd_jboss_ubuntu.j2 y systemd_jboss_rh-centos.j2, a los que sólo hay que modificar los valores de mínimo y máximo para el tamaño del heap. Use el que corresponda según su sistema operativo.
    3. Iniciar el servicio: sudo systemctl start jboss
    4. Activar el inicio automático del servicio: sudo systemctl enable jboss
  8. Si planea utilizar Maven para la publicación de los artefactos (ver sección Publicación), deberá crear un usuario de administración WildFly. Para esto, ejecutar el siguiente comando y seguir los pasos: sudo /opt/wildfly/bin/add-user.sh

5. Instalación de PostgreSQL 12

Como servidor de base de datos utilizaremos PostgreSQL 12. A continuación se detallan las actividades para la instalación y configuración.

Ubuntu:

  1. Crear grupo y usuario:
    1. sudo groupadd postgres
    2. sudo useradd -g postgres postgres
  2. Importar llave del repositorio: wget -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
  3. Instalar repositorio: sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt bionic-pgdg main"
  4. Actualizar el índice de paquetes: sudo apt-get update
  5. Instalar PostgreSQL 12 y requisitos: sudo apt-get install postgresql-12 postgresql-client-12 libpq-dev python-psycopg2
  6. Crear un usuario de base de datos para la aplicación:
    1. Cambiar a usuario postgres:sudo su - postgres
    2. Crear el usuario: createuser <usuario> --password
    3. Setear contraseña para el usuario: psql -c "alter user <usuario> with password '<contraseña>'"

Debian:

  1. Crear grupo y usuario:
    1. sudo groupadd postgres
    2. sudo useradd -g postgres postgres
  2. Importar llave del repositorio: wget -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
  3. Instalar repositorio: sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main"
  4. Actualizar el índice de paquetes: sudo apt-get update
  5. Instalar PostgreSQL 12 y requisitos: sudo apt-get install postgresql-12 postgresql-client-12 libpq-dev python-psycopg2
  6. Crear un usuario de base de datos para la aplicación:
    1. Cambiar a usuario postgres:sudo su - postgres
    2. Crear el usuario: createuser <usuario> --password
    3. Setear contraseña para el usuario: psql -c "alter user <usuario> with password '<contraseña>'"

CentOS / RedHat:

  1. Crear grupo y usuario:
    1. sudo groupadd postgres
    2. sudo useradd -g postgres postgres
  2. Instalar repositorio: sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
  3. Instalar PostgreSQL 12 y requisitos: sudo yum install postgresql-12 postgresql12-server postgresql12-libs python-psycopg2
  4. Configuración inicial del servidor: sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
  5. Configurar PostgreSQL para acceso con usuario y contraseña para conexiones locales:
    1. Respaldar la configuración inicial de acceso: sudo cp /var/lib/pgsql/12/data/pg_hba.conf /var/lib/pgsql/12/data/pg_hba.conf.original
    2. Tomar el archivo ansible/roles/elections/files/db/pg_hba.conf del repositorio y copiarlo en /var/lib/pgsql/12/data/pg_hba.conf
  6. Iniciar el servicio: sudo systemctl start postgresql-12
  7. Activar el inicio automático del servicio: sudo systemctl enable postgresql-12
  8. Crear un usuario de base de datos para la aplicación:
    1. Cambiar a usuario postgres:sudo su - postgres
    2. Crear el usuario: createuser <usuario> --password
    3. Setear contraseña para el usuario: psql -c "alter user <usuario> with password '<contraseña>'"

6. Creación de la base de datos

A continuación se detallan las tareas para levantar un dump inicial de la base de datos del sistema. El proceso es el mismo en todos los casos:

  1. Copiar el dump del repositorio (ansible/roles/elections/files/db/elections.zip) a /opt/dumps/
  2. Descromprimirlo: sudo unzip elections.zip
  3. Cambiar a usuario postgres: sudo su - postgres
  4. Crear la base de datos elections con el usuario <usuario> como dueño: createdb elections -O <usuario>
  5. Restaurar el dump inicial: psql -U postgres -d elections /opt/dumps/elections.sql
  6. Configurar permisos sobre la base de datos:
    1. Conectarse a la base con el usuario postgres: psql -d elections. Ejecutar las siguientes sentencias:
    2. GRANT USAGE ON SCHEMA public TO <usuario>;
    3. GRANT ALL PRIVILEGES ON DATABASE elections TO <usuario>;
    4. GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO <usuario>;
    5. GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO <usuario>;

7. Configuración de acceso a base de datos en Wildfly

Para que la aplicación se pueda conectar a la base de datos, es necesario instalar el driver de PostgreSQL y crear el datasource en WildFly. El procedimiento es el mismo en todos los casos:

  1. Detener el servicio del WildFly: sudo service jboss stop.
  2. Copiar el driver de PostgreSQL del repositorio (ansible/roles/elections/files/postgresql-42.2.16.jar) a /opt/wildfly/standalone/deployments/.
  3. Copiar los módulos jxl, ipresource y commons-validator del repositorio (ansible/roles/elections/files/modules/) a /opt/wildfly/modules/system/layers/base/ (copiar la estructura de directorios tal cual está en el repositorio).
  4. Agregar el datasource en /opt/wildfly/standalone/configuration/standalone.xml, puede basarse en el archivo ansible/roles/elections/templates/standalone.xml.j2 del repositorio.
  5. Levantar el servicio del WildFly: sudo service jboss start

8. Empaquetado y publicación

El Sistema de Elecciones consiste de 3 artefactos a publicar en el servidor WildFly:

  • elections-ejb.jar
  • elections-ws.war
  • elections.war

Los procedimientos para empaquetado y publicación son los mismos en todos los casos.

Empaquetado:

En el directorio ansible/roles/elections/files/deployments del repositorio se encuentran los artefactos ya generados.

También puede generarlos a partir del código fuente. Para esto, desde el directorio raíz del repositorio ejecute el siguiente comando Maven: sudo mvn clean package

Esto generará los 3 artefactos en los directorios <artefacto>/target.

Publicación:

Para publicarlos, alcanza con copiarlos al directorio /opt/wildfly/standalone/deployments/ y WildFly hace el despliegue automáticamente.

También puede usar Maven para la publicación. Para eso el procedimiento es el siguiente:

  1. Editar el archivo sudo nano /etc/maven/settings.xml y agregar el servidor WildFly. Para esto, dentro del tag <servers> agregar:
    <server>
      <id>wildfly-elections</id>
      <username>usuario</username>
      <password>contraseña</password>
    </server>

    Los valores de usuario y contraseña corresponden al usuario de administración de WildFly creado anteriormente.
  2. Ejecutar el siguiente comando Maven para publicar los artefactos:
    sudo mvn wildfly:deploy-only -Dwildfly.id=wildfly-elections -Dwildfly.hostname=localhost -Dwildfly.port=9990
    El parámetro wildfly.id se corresponde con el <id> del paso anterior.

Luego de publicados los artefactos, el sistema ya está operativo y accesible en http://<ip-servidor>:8080/elections.

9. Configuración inicial

Antes de comenzar a usar el sistema, son necesarias algunas tareas iniciales de configuación.

Estas tareas se detallan en el siguiente documento.

10. Reverse proxy

Luego de completar la instalación, el sistema es accesible directamente contra el servidor de aplicaciones. Para un ambiente de desarrollo o testeo esto no es un problema, pero para ambientes de producción se recomienda la instalación y configuración de un servidor web (por ej. Apache o Nginx) que actúe como reverse proxy.

Las ventajas de usar reverse proxy son, entre otras, evitar el acceso directo contra el sevidor de backend, cacheo y compresión de contenidos y logging HTTP.