diff --git a/Instalar.md b/Instalar.md index 22d5b94..6913391 100644 --- a/Instalar.md +++ b/Instalar.md @@ -21,3 +21,582 @@ La máquina virtual la puedes descargar desde [nuestras documentación](https:// 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 agregamos un nuevo usuario + + useradd -m empresa + +Establece su contraseña + + passwd empresa + +Instala sudo + + pacman -S sudo + +Agrega al nuevo usuario como sudo + + nano /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 + + nano /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. + + nano /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. + + nano .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