# 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/