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