Go to file
2026-01-02 16:00:09 -05:00
backend cambios 2026-01-02 16:00:09 -05:00
saludut-inpec cambios 2026-01-02 16:00:09 -05:00
.gitignore desarrollo 2025-12-16 19:33:09 -05:00
backend.tar.gz Cambios subidos a server V2 2025-12-31 07:27:45 -05:00
README.md Version final 2025-12-31 15:42:40 -05:00

Saludut

Frontend Angular (saludut-inpec) + backend Node.js (backend) + PostgreSQL + Python + LibreOffice.

Produccion (Alpine 3.21)

1) Preparar servidor

apk add nginx certbot certbot-nginx nftables rsync nodejs npm \
  postgresql postgresql-client python3 py3-pip libreoffice
rc-update add postgresql default
rc-service postgresql setup
rc-service postgresql start

2) Crear BD y usuario

su - postgres
psql -c "CREATE USER saludut_user WITH PASSWORD 'jhyutfgv7745676tfbhjgf687yu87';"
psql -c "CREATE DATABASE saludut_db OWNER saludut_user;"
exit
psql -U postgres -d postgres -c "ALTER ROLE postgres WITH PASSWORD 'JKHUG9876hBhjhvjjhldfuy345trgfdf';"
HBA=$(psql -U postgres -d postgres -Atc "show hba_file"); cp "$HBA" "$HBA.bak"; sed -i 's/\btrust\b/scram-sha-256/g' "$HBA"; rc-service postgresql reload

3) Subir codigo (desde tu maquina)

mkdir -p /opt/saludut/backend
tar -czf backend.tar.gz \
  --exclude="node_modules" \
  --exclude=".env" \
  --exclude="backend.tar.gz" \
  .

scp -C backend.tar.gz root@autorizacion.saludut.com:/opt/saludut/

En el servidor:

tar -xzf /opt/saludut/backend.tar.gz -C /opt/saludut/

4) Inicializar esquema minimo

Ejecuta el script minimo (schema + roles base):

psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/insert.sql

El admin se crea automaticamente al iniciar el backend si defines ADMIN_USER y ADMIN_PASS en el .env.

Opcional: cargar datos masivos desde archivos:

psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/establecimiento.sql
psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/paciente.sql
psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/ingreso.sql

Opcional (solo si quieres cargar CUPS por SQL y no por la UI):

psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/cups_schema.sql
psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/cups_referencia.sql
psql -U saludut_user -d saludut_db -f /opt/saludut/backend/src/cups_cubiertos.sql

5) Backend (.env)

Crear backend/.env en el servidor:

DB_HOST=127.0.0.1
DB_PORT=5432
DB_USER=saludut_user
DB_PASSWORD=jhyutfgv7745676tfbhjgf687yu87
DB_NAME=saludut_db
JWT_SECRET=jhyutfgv7745676tfbhjgf687yu87
JWT_EXPIRES_IN=24h
PORT=3000
SOFFICE_PATH=/usr/bin/soffice
PYTHON_PATH=python3
ADMIN_USER=admin
ADMIN_PASS=admin123
ADMIN_EMAIL=admin@saludut.com
ADMIN_NAME=Administrador Sistema

6) Backend (instalar y correr)

cd /opt/saludut/backend
npm ci --omit=dev
node src/server.js

6.1) OpenRC (servicio backend)

cat <<'EOF' > /etc/init.d/saludut-backend
#!/sbin/openrc-run

name="saludut-backend"
description="Backend Node para Saludut"
directory="/opt/saludut/backend"
command="/usr/bin/node"
command_args="src/server.js"
command_background="yes"
pidfile="/run/${RC_SVCNAME}.pid"
output_log="/var/log/saludut-backend.log"
error_log="/var/log/saludut-backend.err"

depend() {
  need net
}
EOF

chmod +x /etc/init.d/saludut-backend
rc-update add saludut-backend default
rc-service saludut-backend start

7) Frontend + Nginx (deploy)

7.1) Acceso SSH y paquetes base

sed -i 's/#Port 22/Port 48952/g' /etc/ssh/sshd_config
rc-service sshd restart
ssh -p 48952 root@autorizacion.saludut.com
apk add nginx certbot certbot-nginx nftables rsync

7.2) Publicar scripts (nftables + frontend)

# Ejecutar publishNftables.sh
head -n1 ./scripts/publishNftables.sh | cat -A
sed -i 's/\r$//' ./scripts/publishNftables.sh
sed -i '1s|^.*$|#!/usr/bin/env bash|' ./scripts/publishNftables.sh
chmod +x ./scripts/publishNftables.sh
file ./scripts/publishNftables.sh
bash ./scripts/publishNftables.sh

# Ejecutar publish.sh
head -n1 ./scripts/publish.sh | cat -A
sed -i 's/\r$//' ./scripts/publish.sh
sed -i '1s|^.*$|#!/usr/bin/env bash|' ./scripts/publish.sh
chmod +x ./scripts/publish.sh
file ./scripts/publish.sh
bash ./scripts/publish.sh

7.3) Nginx HTTP + certbot

# Ejecutar el nginx de autorizacion.saludut.com
scp -P 48952 scripts/vhost/autorizacion.saludut.com.conf root@autorizacion.saludut.com:/etc/nginx/http.d/

server {
  listen 80;
  listen [::]:80;

  server_name autorizacion.saludut.com;

  client_max_body_size 60m;

  root /var/www/autorizacion.saludut.com/htdocs;
  index index.html;

  location / {
    try_files $uri $uri/ /index.html;
  }

  location /api/ {
    client_max_body_size 60m;

    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
  }

  error_page 404 /index.html;
}

rc-service nginx start
sudo certbot --nginx -d autorizacion.saludut.com

7.4) Nginx HTTPS (redirect + SSL)

scp -P 48952 scripts/vhost/autorizacion.saludut.com.conf root@autorizacion.saludut.com:/etc/nginx/http.d/

server {
  listen 80;
  listen [::]:80;
  server_name autorizacion.saludut.com;

  return 301 https://$host$request_uri;
}

server {
  http2 on;
  listen 443 ssl;
  listen [::]:443 ssl;

  server_name autorizacion.saludut.com;

  client_max_body_size 60m;

  # Ojo: Angular esta dentro de /browser
  root /var/www/autorizacion.saludut.com/htdocs/browser;
  index index.html;

  location / {
    try_files $uri $uri/ /index.html;
  }

  location /api/ {
    client_max_body_size 60m;

    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
  }

  error_page 404 /index.html;

  ssl_certificate /etc/letsencrypt/live/autorizacion.saludut.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/autorizacion.saludut.com/privkey.pem;
}

nginx -t && rc-service nginx restart

7.5) Python venv (scripts)

set -e

# 1) Paquetes base para Python + compilacion (Alpine)
apk add --no-cache \
  python3 py3-pip py3-virtualenv \
  build-base python3-dev musl-dev \
  libffi-dev openssl-dev \
  openblas-dev lapack-dev gfortran \
  postgresql-dev

# 2) Crear entorno virtual "general" para SaludUT
mkdir -p /opt/saludut
python3 -m venv /opt/saludut/venv
. /opt/saludut/venv/bin/activate

# 3) Actualizar pip y herramientas
python -m pip install --upgrade pip setuptools wheel

# 4) Librerias recomendadas (Excel + pandas + postgres + .env + utilidades comunes)
pip install   pandas   numpy   openpyxl   xlsxwriter   xlrd   python-dotenv   psycopg2-binary   requests   pytz   python-dateutil   tqdm

# (Opcional util si en algun punto generas PDF con python)
pip install reportlab || true

# 5) Probar que todo importa bien
/opt/saludut/venv/bin/python -c "import pandas as pd; import openpyxl; import psycopg2; import dotenv; print('OK: pandas/openpyxl/psycopg2/dotenv')"

# 6) Actualizar .env para que Node use el Python del venv
#    (cambia PYTHON_PATH=python3 -> PYTHON_PATH=/opt/saludut/venv/bin/python)
sed -i 's|^PYTHON_PATH=.*|PYTHON_PATH=/opt/saludut/venv/bin/python|g' /opt/saludut/backend/.env

# 7) Reiniciar backend y ver errores
rc-service saludut-backend restart || true
sleep 1
tail -n 80 /var/log/saludut-backend.err || true

7.6) LibreOffice + fuentes (opcional)

set -e

apk update
apk add --no-cache \
  libreoffice \
  fontconfig \
  ttf-dejavu \
  ttf-liberation \
  font-noto \
  font-noto-cjk \
  poppler-utils \
  python3 py3-pip \
  py3-pandas py3-openpyxl py3-psycopg2 py3-dateutil py3-dotenv

# cache de fuentes (clave para que no salgan cuadritos)
fc-cache -f -v

# por si tu codigo usa librerias extra (opcional)
pip3 install --break-system-packages --upgrade pip
pip3 install --break-system-packages pdfplumber pypdf reportlab pillow

# verificacion
python3 -c "import pandas, openpyxl, dotenv; print('OK', pandas.__version__, openpyxl.__version__, dotenv.__version__)"

7.7) OCR (PDF real + escaneado) con Tesseract (Alpine)

Instalacion OCR en Alpine (servidor)
Si el backend dice "OCR no disponible", instala esto en Alpine:

# 1) Paquetes del sistema (OCR + deps de Python)
apk update
apk add --no-cache \
  tesseract-ocr \
  tesseract-ocr-data-spa \
  tesseract-ocr-data-eng \
  python3 py3-pip py3-virtualenv \
  build-base python3-dev musl-dev \
  libffi-dev openssl-dev zlib-dev \
  jpeg-dev tiff-dev freetype-dev lcms2-dev openjpeg-dev

# 2) Venv (si ya tienes /opt/saludut/venv, solo activalo)
python3 -m venv /opt/saludut/venv
. /opt/saludut/venv/bin/activate

# 3) Librerias Python usadas por el extractor
pip install --upgrade pip
pip install pdfplumber pymupdf pytesseract pillow

En backend/.env agrega (o ajusta):

PYTHON_PATH=/opt/saludut/venv/bin/python
TESSERACT_PATH=/usr/bin/tesseract
TESSDATA_PREFIX=/usr/share/tessdata

Verificacion:

tesseract --list-langs | grep spa
/opt/saludut/venv/bin/python -c "import pytesseract; print(pytesseract.get_tesseract_version())"

Reinicia el backend:

rc-service saludut-backend restart