5 Instalar en ArchLinux
Mauricio Baeza edited this page 2018-02-20 23:28:14 +00:00

La maquina virtual está configurada con ArchLinux. Empresa Libre ya viene instalada y configurada tanto en pruebas como en producción en esta MV. La siguiente guía es solo si quieres experimentar en un sistema limpio.

Accede como root y asegurate de tener al día el sistema:

pacman -Syu

Revisa la configuración mínima.

  • La hora local:

      ln -sf /usr/share/zoneinfo/America/Mexico_City /etc/localtime    
    

IMPORTANTE: Establece la zona horaria correcta de acuerdo al C.P. de emisión al momento de timbrar.

  • El host name

      cat /etc/hostname
    
      empresalibre
    
  • El lenguaje predeterminado

      cat /etc/locale.conf
    
      LANG=es_MX.UTF-8
    
  • El mapa de teclado para la consola

      cat /etc/vconsole.conf
    
      KEYMAP=es
    

Agregamos un nuevo usuario

useradd -m empresa

Establece su contraseña

passwd empresa

Instala sudo

pacman -S sudo

Agrega al nuevo usuario como sudo

vim /etc/sudoers

root ALL=(ALL) ALL
empresa ALL=(ALL) ALL

Guarda y cierra

Instalamos openssh

pacman -S openssh

Edita el archivo de configuración local de ssh y establece el puerto de tu preferencia

vim /etc/ssh/ssh_config

Edita el archivo de configuración del servidor ssh y establece el mismo puerto de comunicación. Desactiva el acceso por root y agrega al usuario.

vim /etc/ssh/sshd_config

Port 22
PermitRootLogin no
AllowUsers empresa

Guarda y sal. Activamos e iniciamos el demonio.

systemctl enable sshd

systemctl start sshd

Verifica que IP tiene asignada la maquina:

ip addr | grep "inet "

Ya deberías poder acceder desde otra línea de comandos desde otra maquina desde cualquier sistema operativo con soporte para SSH.

ssh empresa@192.168.X.X

Vamos a configurar el prompt del usuario para que muestre información util. En este momento estamos identificados con el nuevo usuario.

vim .bashrc

Y agregas las líneas:

THEIP=$(ip addr | grep 'inet ' | grep -v '127.0.0.1' | cut -d '/' -f 1 | awk '{print $2}')
PS1="┌─[\e[0;32m\H-"$THEIP"\e[m][\e[1;31m\u\e[m]->{\[\e[34;1m\]\w\[\e[0;1m\]}\n└──> \[\e[0m\]"

PS1 ya debería existir, comenta la línea o reemplazala completamente.

Guarda (CTRL+O) y sal (CTRL+X) y activa.

source .bashrc

Debes de ver

┌─[empresalibre-192.168.X.X][empresa]->{~}
└──>

Esto es util cuando se usa la MV por que podría llegar a cambiar la IP, si es un VPS en línea, la IP es fija, por lo que puedes dejar solo:

PS1="┌─[\e[0;32m\H\e[m][\e[1;31m\u\e[m]->{\[\e[34;1m\]\w\[\e[0;1m\]}\n└──> \[\e[0m\]"

Que se debe ver:

┌─[empresalibre][empresa]->{~}
└──>

Instalamos algunas herramientas y librerías necesarias; mlocate para localizar archivos, vim para tener una alternativa para editar archivos, git para hacer la magia de las actualizaciones, gcc para compilar algunos librerías necesarias, rsync para sincronizacion de archivos y directorios, por supuesto Python, libxslt para el procesamiento de los XML y xmlsec para firmar los XML.

sudo pacman -S mlocate vim git gcc rsync python python-pip libxslt xmlsec

Actualizamos la base de datos de archivos.

sudo updatedb

Instalamos el servidor de base de datos. Empresa Libre funciona con SQLite, MySQL/MariaDB y PostgreSQL (recomendado). SQLite esta en el core de Python, para los demás tienes que instalar el servidor y las librerías Python. Para esta guía usaremos PostgreSQL.

Instalamos el servidor

sudo pacman -S postgresql

Nos cambiamos al usuario postgres

sudo -u postgres -i

Inicializamos el servidor

initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data'

Salimos del usuario

exit

Activamos e iniciamos el demonio

sudo systemctl enable postgresql

sudo systemctl start postgresql

Accedemos al shell de postgres

sudo -u postgres -i psql

Crearemos dos roles, uno para el ambiente productivo y otro para el de pruebas.

CREATE ROLE empresalibre WITH LOGIN ENCRYPTED PASSWORD 'supersecret';

CREATE ROLE empresatest WITH LOGIN ENCRYPTED PASSWORD 'supersecret';

Creamos las bases de datos para cada entorno, asignando su respectivo dueño.

CREATE DATABASE empresalibre WITH OWNER empresalibre;

CREATE DATABASE empresatest WITH OWNER empresatest;

Puedes usar el nombre que prefieras tanto en los roles como en las bases de datos. Solo toma nota de cual asignas a cada una.

Salimos

\q

Estando en el home del usuario empresa, creamos una carpeta para proyectos.

mkdir proyectos

Y otra para los registros log

mkdir log

Accedemos a proyectos

cd proyectos

Clonamos el repositorio de Empresa Libre

git clone https://gitlab.com/mauriciobaeza/empresa-libre.git

Vamos a crear un vínculo simbólico a esta carpeta dentro del home del usuario para tener rutas más cortas y accesibles. Regresamos a la carpeta home

cd

Creamos el vínculo simbólico para producción.

ln -s proyectos/empresa-libre/source/ empresa-libre

Entramos a la carpeta para producción.

cd proyectos/empresa-libre

Instalamos los requerimientos de Empresa Libre.

sudo pip install -r requirements.txt

Instalamos la librería para PostgreSQL y Uwsgi

sudo pip install psycopg2 uwsgi

Accedemos a la carpeta de la aplicación.

cd source/app

Copia los archivos inicales de configuración

cp conf.py.example conf.py

cp main.ini.example main.ini

Edita conf.py

nano conf.py

Establece DEBUG en False y la ruta para el log de registro.

DEBUG = False

LOG_PATH = '/home/empresa/log/empresalibre.log'

Edita el archivo de configuración de Uwsgi main.ini

nano main.ini

Establece las rutas correctas de la aplicación y del log de registros

[uwsgi]
socket = 127.0.0.1:3033
uid = empresa
gid = empresa
chdir = /home/empresa/empresa-libre/app
wsgi-file = main.py
callable = app
master = true
processes = 4
threads = 4
thunder-lock = true
logger = file:/home/empresa/log/empresalibre-uwsgi.log

Toma nota del socket, lo usaremos al configurar nginx. Nota que en uid y gid usamos el nombre del usuario. La ruta en chdir es el vínculo simbolico creado previamente. En processes puedes establecer tantos CPUs le asignes a tu maquina virtual.

Accede a controllers y copia el archivo de configuración para el PAC

cd controllers

cp conf.py.example conf.py

Asegurate de que DEBUG este en False

nano conf.py

Nos movemos a la carpeta de los modelos de la base de datos.

 cd ../models/

Agregamos nuestro RFC y la configuración de nuestra base de datos.

└──> python main.py -rfc
Introduce el nuevo RFC: BASM740115RW0
Introduce los datos de conexión: postgres|||empresalibre|empresalibre|supersecret
[01-Nov-2017 23:47:00] INFO: API: Conectado a la BD...
[01-Nov-2017 23:47:02] INFO: API: Tablas creadas correctamente...
[01-Nov-2017 23:47:02] INFO: API: SuperUsuario creado correctamente...
[01-Nov-2017 23:47:02] INFO: API: Valores iniciales insertados...
[01-Nov-2017 23:47:02] INFO: API: Importando datos...
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: Categorias
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATImpuestos
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATUnidades
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATTipoRelacion
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATMonedas
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATFormaPago
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATRegimenes
[01-Nov-2017 23:47:02] INFO: API:   Importando tabla: SATUsoCfdi
[01-Nov-2017 23:47:03] INFO: API: Importación terminada...
[01-Nov-2017 23:47:03] INFO: API: RFC agregado correctamente...

El script realiza las siguientes acciones:

0.- Guarda el RFC y la configuración de acceso a la base de datos
1.- Crea las tablas necesarias
2.- Inserta los valores iniciales
3.- Importa las tablas del SAT

Si se usara SQLite, la configuración sería:

sqlite|RUTA_ABSOLUTA_A_ARCHIVO_SQLITE

Para PostgreSQL y MySQL es:

TIPO|SERVIDOR|PUERTO|BASE_DE_DATOS|USUARIO|CONTRASEÑA

Donde:

TIPO = postgres o mysql
SERVIDOR = localhost (default) o IP del servidor
PUERTO = default de cada base de datos
BASE_DE_DATOS = Nombre de la base de datos
USUARIO = Usuario con permisos de conexión, lectura y escritura en la BD
CONTRASEÑA = contraseña de la base de datos

Ahora instalamos y configuramos nginx

sudo pacman -S nginx

Activamos e iniciamos nginx

sudo systemctl enable nginx

sudo systemctl start nginx

Desde cualquier navegador de la red, con la IP de esta maquina virtual, deberías poder ver la página inicial de bienvenida de Nginx

Vamos a configurar nginx como proxy de uwsgi. Editamos.

sudo nano /etc/nginx/nginx.conf

Con el siguiente contenido

user  empresa;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server_tokens off;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;

    disable_symlinks off;

    client_max_body_size 1m;
}

Nota que estamos ejecutando nginx con el usuario empresa, no es lo más ortodoxo pero como es una maquina virtual exclusiva para Empresa Libre funciona correctamente. Si haces esta configuración en un VPS en Internet, es mejor ejecutarlo con el usuario predeterminado de la distribución, que, generalmente es nginx o http, depende de cada distribución.

Creamos el directorio para las configuraciónes de los servidores.

sudo mkdir /etc/nginx/conf.d

Editamos el archivo default.conf para agregar el servidor.

sudo nano /etc/nginx/conf.d/default.conf

Con el siguiente contenido

server {
    listen 80 default_server;
    server_name localhost;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:3033;

        access_log      /var/log/nginx/empresalibre.access.log;
        error_log       /var/log/nginx/empresalibre.error.log;
    }

    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location /static {
        alias /home/empresa/empresa-libre/static;
    }

}

Nota que en server_name usamos localhost, para una VM esta bien, si estas usando una VPS en Internet, debes de usar tu dominio o subdominio, por ejemplo:

server_name empresalibre.net;

Nota que en uwsgi_pass va el mismo valor previamente configurado en main.ini

Ahora configuramos el service para Empresa Libre

sudo vim /etc/systemd/system/empresalibre.service

Con el contenido

[Unit]
Description=uWSGI instance to serve Empresa Libre

[Service]
ExecStart=/usr/bin/uwsgi /home/empresa/empresa-libre/app/main.ini

[Install]
WantedBy=multi-user.target

Lo activamos e iniciamos.

sudo systemctl enable empresalibre

sudo systemctl start empresalibre

Solo nos resta reiniciar Nginx y listo, debemos poder ver la pantalla de acceso a Empresa Libre. Tal vez tengas que presionar CTRL+F5 en tu navegador para forzar el refresco de la pantalla.

Ahora vamos a configurar el entorno de pruebas. Accede a la carpeta proyectos dentro del home del usuario.

cd proyectos

Hacemos una copia de la carpeta empresa-libre para usarla como pruebas.

rsync -atv empresa-libre/ empresa-libre-develop/

En la carpeta home del usuario, creamos el vínculo simbólico para pruebas.

cd

ln -s proyectos/empresa-libre-develop/source/ empresa-libre-develop

El primer paso importante es cambiar la rama del proyecto.

cd proyectos/empresa-libre-develop/

Cambiamos a la rama de desarrollo.

git checkout develop

Rama 'develop' configurada para hacer seguimiento a la rama remota 'develop' de 'origin'.
Cambiado a nueva rama 'develop'

Ahora editamos los archivos necesarios. Para no movernos del directorio actual, usamos las rutas relativas

sudo nano source/app/conf.py

Aquí cambia solo la ruta del log, DEBUG debe estar en False

DEBUG = False
LOG_PATH = '/home/empresa/log/empresalibre-develop.log'

Editamos el ini de uwsgi

sudo nano source/app/main.ini

Debe quedar:

[uwsgi]
socket = 127.0.0.1:3034
uid = empresa
gid = empresa
chdir = /home/empresa/empresa-libre-develop/app
wsgi-file = main.py
callable = app
master = true
processes = 4
threads = 4
thunder-lock = true
logger = file:/home/empresa/log/empresalibre-develop-uwsgi.log

Nota que las rutas cambian a develop y que el puerto del socket cambia a 3034, es el valor que estableceremos en la configuración de nginx

Editamos el archivo conf.py del PAC

sudo vim source/app/controllers/conf.py

Aquí es importante que DEBUG este en True, si no, no podrás timbrar en pruebas

DEBUG = True

Ahora si nos movemos a la carpeta de los modelos para iniciar la base de datos de pruebas con el RFC de pruebas del PAC

cd source/app/models/

Agregamos el RFC de pruebas (LAN7008173R5) y configuramos el acceso con la base de datos de pruebas configurada al inicio.

└──> python main.py -rfc
Introduce el nuevo RFC: LAN7008173R5
Introduce los datos de conexión: postgres|||empresatest|empresatest|blades3.3
[02-Nov-2017 00:42:08] INFO: API: Conectado a la BD...
[02-Nov-2017 00:42:09] INFO: API: Tablas creadas correctamente...
[02-Nov-2017 00:42:09] INFO: API: SuperUsuario creado correctamente...
[02-Nov-2017 00:42:09] INFO: API: Valores iniciales insertados...
[02-Nov-2017 00:42:09] INFO: API: Importando datos...
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: Categorias
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATImpuestos
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATUnidades
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATTipoRelacion
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATMonedas
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATFormaPago
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATRegimenes
[02-Nov-2017 00:42:09] INFO: API:   Importando tabla: SATUsoCfdi
[02-Nov-2017 00:42:09] INFO: API: Importación terminada...
[02-Nov-2017 00:42:09] INFO: API: RFC agregado correctamente...

IMPORTANTE: Solo usa el RFC de pruebas del PAC LAN7008173R5

Ahora editamos el archivo default.conf de nginx para agregar el nuevo servidor de pruebas.

sudo vim /etc/nginx/conf.d/default.conf

No borres el servidor anterior, solo agregalo debajo del mismo.

server {
    listen 8000;
    server_name localhost;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:3034;

        access_log      /var/log/nginx/empresalibre-develop.access.log;
        error_log       /var/log/nginx/empresalibre-develop.error.log;
    }

    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location /static {
        alias /home/empresa/empresa-libre-develop/static;
    }

}

Nota el cambio de puerto de escucha (listen 8000), el valor del puerto en uwsgi_pass y los cambios en las rutas de los logs y static. Guarda los cambios.

Ahora vamos a copiar el service empresalibre a empresatest

sudo cp /etc/systemd/system/empresalibre.service /etc/systemd/system/empresapruebas.service

Y editalo

sudo vim /etc/systemd/system/empresapruebas.service

para que quede con las nuevas rutas.

[Unit]
Description=uWSGI instance to serve Empresa Libre Develop

[Service]
ExecStart=/usr/bin/uwsgi /home/empresa/empresa-libre-develop/app/main.ini

[Install]
WantedBy=multi-user.target

Te recomendamos no activar (enable) para que arranque al inicio, como el servidor de producción, si no que solo lo inicies cuando quieras hacer alguna prueba.

sudo systemctl start empresapruebas

Por ultimo reinicia nginx

sudo systemctl restart nginx

IMPORTANTE: Antes de entrar a uno u otro servidor, producción o pruebas, cierra siempre tu sessión de usuario.

Ahora debes de poder entrar en la misma IP pero con el puerto 8000

Para usar las plantillas de LibreOffice, hay que instalar:

sudo pacman -S libreoffice-still ttf-freefont ttf-liberation libepoxy