---
# System prepended metadata

title: nsiaf instalación

---

# nsiaf instalación
## Preinstalación
#### Solución al problema "sudo: command not found"
Cambiar a usuario root : ```su```
Instalar el paquete "sudo"
```
apt-get install sudo
```

Añadir nombre de usuario al grupo sudo
```
/sbin/adduser nombre sudo
```

Añadir nombre de usuario al archivo ```sudoers```
```
nano /etc/sudoers
```
Una vez abierto, hay que buscar la línea que contiene %sudo   ALL=(ALL:ALL) ALL y, bajo ella, añadir los siguiente:
```vim
# User privilege specification
root    ALL=(ALL:ALL) ALL
tunombredeusuario ALL=(ALL:ALL) ALL
```
Una vez añadida esta línea, guardamos la configuracion. y salir de usuario root con : ```exit```
Actualizar repositorio 
```sudo apt-get update ```

La instalación de paquetes en el servidor remoto
```console
sudo apt-get install -y curl checkinstall bzip2 gawk g++ gcc make \
libc6-dev patch libreadline6-dev zlib1g-dev libssl-dev libyaml-dev \
libsqlite3-dev sqlite3 autoconf libgmp-dev libgdbm-dev libncurses5-dev \
automake libtool bison pkg-config libffi-dev wget
```    
Instalar git :
```
sudo apt install git
```
Instalar [ImageMagick](http://www.imagemagick.org/) complento

```console
sudo apt-get install -y imagemagick libmagickwand-dev
```
 #### Instalar wkhtmltopdf::

[wkhtmltopdf](http://wkhtmltopdf.org/) permite la conversión de HTML a PDF. En
los respositorios oficiales de Debian está la versión `0.9.9` el cual no cumple
correctamente con su función, debido a que estamos utilizando funciones nuevas.
Se recomienda la versión `0.12.0` o superiores, el cual se puede descargar
manualmente desde http://wkhtmltopdf.org/downloads.html

```console
wget -c https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
tar -xvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
sudo mv wkhtmltox /opt/
rm wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
```

La ubicación del binario es: `/opt/wkhtmltox/bin/wkhtmltopdf`
## Instalar RVM (Ruby Version Manager) https://rvm.io/ 
Te permite instalar y manejar varias versiones de Ruby en tu sistema.

Instalar herramienta gnupg2:
```
sudo apt install gnupg2
```
Instalar claves GPG:

```
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
```

Descargar y ejecutar script de instalación [rvm](https://rvm.io/):   https://rvm.io/rvm/install
```
\curl -sSL https://get.rvm.io | bash -s stable
```

Actualizar fuente y recargar shell:
```

source ~/.rvm/scripts/rvm

```
Listar versiones ruby disponibles:
```
rvm list known
```

Instalar la version 2.4.10
```
rvm install ruby-2.4.10
```
utilizar ruby :
```
rvm use ruby-2.4.10
```
Instalar gema bundler
```
gem install bundler --no-document
```
## Instalar NodeJS version 10.24

Instalar nodejs en su version 10.24.1:
```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
```
Instalar version 10.24.1 
``` 
sudo apt install nodejs=10.24.1-deb-1nodesource1 
```

Instalación del paquete `yarn`:

```console
sudo npm install -g yarn
```

## Instalación de base de datos (MariaDB)

```console
sudo apt-get install -y mariadb-server libmariadb-dev
```
### crear usuarios mariadb con privilegios
ingresar a consola mariadb:
```
sudo mariadb -u root 
```
creacion de usuario
```
CREATE USER 'user'@'%' IDENTIFIED BY 'MyStrongPass.';
```
conceder permisos
```
GRANT ALL PRIVILEGES ON * . * TO 'user'@'%'; 
```
Aplicar cambios
```
FLUSH PRIVILEGES;
```

listar usuarios: 
```
SELECT host, USER, password FROM mysql.user;
```
mostrar version de mariadb:
 ```
 mariadb -u root -p
 mariadb> select version();
 ```
ref: https://www.daniloaz.com/es/como-crear-un-usuario-en-mysql-mariadb-y-concederle-permisos-para-una-base-de-datos-desde-la-linea-de-comandos/
### para proteger MySQL/Mariadb (opcional)::
Se puede saltar este paso
```
sudo mysql_secure_installation
```


ref: https://mariadb.com/kb/en/mysql_secure_installation/



### Habilitar el acceso remoto de MariaDB

```
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 

```
Busque la línea "bind_address " y cámbiela de la siguiente manera:

```
#By default we only accept connections from localhost 
#bind-address   = 127.0.0.1 
bind-address   = 0.0.0.0
```
reiniciar servicio :
```
sudo systemctl restart mariadb
```

link referencias ::
https://www.ochobitshacenunbyte.com/2018/11/15/listar-bases-de-datos-y-usuarios-en-mysql-y-mariadb/ --- listar base datso y usuarios
mas info : https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/

https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-ubuntu-20-04-es


## Instalar NSIAF

Clonar el proyecto de repositorio git:
```
git clone https://gitlab.com/miguelcond/nsiaf.git
```
ingresar a nsiaf:
```
cd nsiaf
```
Copiar archivos de configuracion
```
cp config/database.yml.sample config/database.yml
cp config/secrets.yml.sample config/secrets.yml
```
Instalar gemas de nsiaf
```
bundle install --deployment --without development test
```

```
bundle install
```

Editar `database.yml` para configuracion de base de datos: 
```
nano /config/database.yml
```

Si se necesita hacer una configuración más específica para la base de datos
se debe cambiar los siguientes datos:

```yaml
development:
  adapter: mysql2
  encoding: utf8
  database: nsiaf_production 
  pool: 5
  host: localhost
  username: root
  password: root
  port: 3306
  socket: /var/run/mysqld/mysqld.sock
  
production:
  adapter: mysql2
  encoding: utf8
  database: nsiaf_production 
  pool: 5
  host: localhost
  username: root
  password: root
  port: 3306
  socket: /var/run/mysqld/mysqld.sock
```

Generar la clave secreta:

```console
bundle exec rake secret
```

copiar la clave secreta generada y editar en :
`nano config/secrets.yml`

Editar con `secrets.yml` con el siguiente contenido en production y development (para iniciar en modo desarrollo):

```yml
production:
  convert_api_url: "https://intranet.adsib.gob.bo/conversion-formatos"
  rails_host: "www.dominio.gob.bo"
  rails_relative_url_root: ""
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  wkhtmltopdf: "/opt/wkhtmltox/bin/wkhtmltopdf"
  ufv_desde: "01-01-2018"
  exception_notification:
    email_prefix: "[NSIAF] "
    sender_address: "notificador <noreply@dominio.gob.bo>"
    exception_recipients: "desarrollador1@dominio.gob.bo, desarrollador2@dominio.gob.bo, ..."
  smtp_settings:
    address: 'smtp.dominio.gob.bo'
    port: 587
    domain: 'dominio.gob.bo'
    user_name: 'nsiaf'
    password: 'mi-super-password'
    authentication: 'plain'
    enable_starttls_auto: true
  interoperabilidad_plantillas: false
```

donde:

* `convert_api_url` es la URL donde se encuentra instalado el API de [Conversión de Formatos](https://gitlab.agetic.gob.bo/bolivia-libre/conversion-formatos)
* `rails_host` es el host del servidor de deploy tal como: `www.dominio.gob.bo`.
* `rails_relative_url_root` es la ubicación del subdirectorio de deploy tal como: `www.dominio.gob.bo/activos`
  dejar una cadena vacía en el caso que el deploy sea en la raíz del dominio.
* `secret_key_base` se **DEBE** reemplazar con la clave secreta generada en el
  paso anterior.
* `wkhtmltopdf` es la ubicación del binario para conversión de HTML a PDF.
* `ufv_desde` descarga UFVs desde esa fecha del sitio web del Banco Central de
  Bolivia.
* `sender_address` es el email desde donde se haran las notificaciones por email
* `exception_recipients` ahí va los destinos de los emails puede ser uno o
  varios emails separados por comas: `des1@dominio.gob.bo, des2@dominio.gob.bo`
* `smtp_settings` la configuración del servidor de email desde el cual se
  enviará los emails de notificación de excepciones.
* `interoperabilidad_plantillas` Si es `true`, entonces implica que habra intercambio de información con el sistema de gestión documental(plantillas) mediante servicios web.

Descargar las dependencias para frontend:

```shell
sudo yarn install
```
Editar development.rb para deshabilitar yarn check
```
nano config/environments/development.rb
````
cambiar el valor ```true``` a ```false``` en la linea :
```config.webpacker.check_yarn_integrity = true ``` 

Compilamos los archivos CSS y JS:

```console
bundle exec rake assets:clobber RAILS_ENV=production
bundle exec rake assets:precompile RAILS_ENV=production
```

Crear la base de datos e inicializar con la configuración por defecto

```console

bundle exec rake db:create RAILS_ENV=production
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake db:seed RAILS_ENV=production
```

Si sale el siguiente error :
```
Patching ActiveRecord::Relation#or.  This might blow up
rake aborted!
```
Editar version de gema bcrypt
```
nano Gemfile
```
modificar en `Gemfile` la version de bcrypt a:
```
gem 'bcrypt', '~> 3.1.13'
```

Ejecutar para actualizar la gema
```
bundle install --no-deployment
bundle update bcrypt
```
y luego :
```
bundle exec rake db:seed RAILS_ENV=production
```

Iniciar nsiaf en modo desarrollo
```
bundle exec rails server -b 0.0.0.0
```




## Para despliegue en produccion

Instalar apache : 

```
sudo apt-get install -y apache2 libcurl4-openssl-dev libapr1-dev libaprutil1-dev

```
Instalar librerias necesarias
```
sudo apt install apache2-dev libcurl4-gnutls-dev

```

### Instalar passenger en el servidor:
```
sudo gem install passenger 
o
gem install passenger

```

Instalar el módulo de passenger para apache2:

```
sudo passenger-install-apache2-module
o
passenger-install-apache2-module
```
:::warning
Nota:
En la parte que passenger-install-apache2-module pide seleccionar los lenguajes
de programación para los cuales se instalará el módulo

Seleccionar Ruby solamente.

:::
```
Welcome to the Phusion Passenger Apache 2 module installer, v6.0.14.

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:

 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.


--------------------------------------------
Which languages are you interested in?

Use <space> to select.
If the menu doesn't display correctly, press '!'

 ‣ ⬢  Ruby
   ⬡  Python
   ⬡   Node.js
   ⬡  Meteor

--------------------------------------------

```
al terminar la instalacion de passenger le mostrara lo siguiente:


```
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/usuario/.rvm/gems/ruby-2.4.10/gems/passenger-6.0.12/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/usuario/.rvm/gems/ruby-2.4.10/gems/passenger-6.0.12
     PassengerDefaultRuby /home/usuario/.rvm/gems/ruby-2.4.10/wrappers/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER when you are done editing.

--------------------------------------------

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... (!)

   You did not specify 'LoadModule passenger_module' in any of your Apache
   configuration files. Please paste the configuration snippet that this
   installer printed earlier, into one of your Apache configuration files, such
   as /etc/apache2/apache2.conf.


Detected 0 error(s), 1 warning(s).
Press ENTER to continue.

--------------------------------------------

Deploying a web application

To learn how to deploy a web app on Passenger, please follow the deployment
guide:

  https://www.phusionpassenger.com/library/deploy/apache/deploy/

Enjoy Phusion Passenger, a product of Phusion® (www.phusion.nl) :-)
https://www.phusionpassenger.com

Passenger® is a registered trademark of Phusion Holding B.V.
```
Después de instalar el módulo de passenger, editar el archivo de configuracion de Apache 
```
sudo nano /etc/apache2/sites-available/000-default.conf
```
 y adicionar estas lineas :
``` apache
LoadModule passenger_module /home/nombre_usuario/.rvm/gems/ruby-2.4.10/gems/passenger-6.0.12/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/nombre_usuario/.rvm/gems/ruby-2.4.10/gems/passenger-6.0.12
     PassengerDefaultRuby /home/nombre_usuario/.rvm/gems/ruby-2.4.10/wrappers/ruby
   </IfModule>

```

:::info 
Nota: El contenido de éstos archivos depende de la versión de la gema Passenger.
:::

despues crear enlace simbolico en `/var/www/html`
ingresamos a :  ```/var/www/html```
```
cd /var/www/html
```
```
sudo ln -s /home/nombre_usuario/nsiaf/ nsiaf
```
Adicionar estas lineas en```sudo vim /etc/apache2/sites-available/000-default.conf```el siguiente contenido si se va instalar la aplicación en la raiz del dominio
```apache
<VirtualHost *:80>
  ServerName www.dominio.gob.bo
  DocumentRoot /var/www/html/nsiaf/public
  RailsEnv production
  <Directory /var/www/html/nsiaf/public>
    Allow from all
    Options -MultiViews
  </Directory>
</VirtualHost>
```
reiniciar apache y verificar
```
sudo service apache2 restart
sudo systemctl status apache2.service
```
ir al navegador y escribir la ip del servidor en la barra url

para ver logs de produccion::


```
tails -f log/production.log
```
Reiniciar apache
```
sudo service apache2 restart
sudo systemctl restart apache2
```
## solucion al problema reporte fisico valorado 2
### Error Mysql2:: Illegal mix of collation
 *__Mensaje de error :__  ActiveRecord::StatementInvalid (Mysql2::Error: Illegal mix of collations (utf8_unicode_ci, COERCIBLE) and (utf8_general_ci,COERCIBLE) for operation 'substring_index')*

Al seleccionar el boton generar reporte , en los log del sistema se muestra el siguiente error:

```
ActiveRecord::StatementInvalid (Mysql2::Error: Illegal mix of collations (utf8_unicode_ci, COERCIBLE) and (utf8_general_ci,COERCIBLE) for operation 'substring_index')
```

ActiveRecord::StatementInvalid (Mysql2::Error: Illegal mix of collations (utf8_unicode_ci, COERCIBLE) and (utf8_general_ci,COERCIBLE) for operation 'substring_index')

#### Para corregir el problema:

Hacer un backup de la base de datos nsiaf_production
```
mysqldump -v --opt --events --routines --triggers --default-character-set=utf8 -u your_username -p your_db_name > db_backup_your_db_name_`date +%Y%m%d_%H%M%S`.sql
```
Eliminar la base de datos nsiaf_production desde la consola de mariadb
```
drop database nsiaf_production;
```
Abrir el archivo del backup ` db_backup_your_db_name.sql`  con un editor de texto 

buscar y luego remplazar el valor 

ver el formato de collate en el backup realizado
buscar y luego remplazar el formato collate  `utf8_unicode_ci` a `utf8_general_ci` en todas las coincidencias encontradas y guardar cambios.
```sql=
CREATE DEFINER=`admin`@`%` FUNCTION `saldo_final_v1`(subarticle_id INT, fecha_fin DATETIME) RETURNS varchar(255) CHARSET utf8 COLLATE utf8_unicode_ci
BEGIN
      DECLARE total DECIMAL(10, 2);
      DECLARE cantidad DECIMAL(10, 2);
      SELECT IFNULL(sum(stock), 0), IFNULL(SUM(saldo), 0) into cantidad, total
        FROM (SELECT @cantidad := IF(-stock < amount, -stock, amount) AS stock,
                     @cantidad * unit_cost AS saldo
                FROM (SELECT t1.note_entry_id,
                             t1.subarticle_id,
                             t1.entry_subarticle_id,
                             t1.entry_date,
                             t1.unit_cost,
```

#### crear nueva base de datos con la codificacion utf8_general_ci
```console

CREATE DATABASE IF NOT EXISTS nsiaf_production DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
```
Restaurar backup a la nueva base datos creada :

```
mysql -u your_username --password=your_password your_db_name < db_backup_your_db_name_`date +%Y%m%d_%H%M%S`.sql
```
verificar codificacion de la base de datos
```
select default_character_set_name, default_collation_name from information_schema.schemata where schema_name = 'name_database';
```



ref: https://tableplus.com/blog/2019/08/illegal-mix-of-collations-mysql.html

https://stackoverflow.com/questions/11770074/illegal-mix-of-collations-utf8-unicode-ci-implicit-and-utf8-general-ci-implic

https://www.linode.com/docs/guides/use-mysqldump-to-back-up-mysql-or-mariadb/
## para realizar backups - mariadb



backup :
```
$ mysqldump -v --opt --events --routines --triggers --default-character-set=utf8 -u your_username -p your_db_name > db_backup_your_db_name_`date +%Y%m%d_%H%M%S`.sql

```
comprimido con gzip
```
$ mysqldump --opt --events --routines --triggers --default-character-set=utf8 -u your_username --password=your_password your_db_name | gzip -c > db_backup_your_db_name_`date +%Y%m%d_%H%M%S`.sql.gz

```

restaurar base de datos

```
mysql -u your_username --password=your_password your_db_name < db_backup_your_db_name_`date +%Y%m%d_%H%M%S`.sql
```

https://www.linode.com/docs/guides/use-mysqldump-to-back-up-mysql-or-mariadb/





