4.2 KiB
4.2 KiB
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 'TU_PASSWORD_FUERTE';"
psql -c "CREATE DATABASE saludut_db OWNER saludut_user;"
exit
3) Subir codigo
mkdir -p /opt/saludut/backend /opt/saludut/frontend
tar -czf saludut-backend.tar.gz --exclude="node_modules" --exclude=".env" backend
tar -czf saludut-frontend.tar.gz --exclude="node_modules" saludut-inpec
scp -C saludut-backend.tar.gz root@tu-servidor:/opt/saludut/
scp -C saludut-frontend.tar.gz root@tu-servidor:/opt/saludut/
En el servidor:
tar -xzf /opt/saludut/saludut-backend.tar.gz -C /opt/saludut/
tar -xzf /opt/saludut/saludut-frontend.tar.gz -C /opt/saludut/
4) Inicializar esquema y datos
Este repo no incluye el esquema base (tablas usuario, rol, autorizacion, etc). Restaura tu dump base primero.
Luego ejecuta los SQL que si estan en el repo, en este orden:
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
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
Si tu esquema tiene restricciones, ajusta el orden de los inserts para respetar las FK.
5) Backend (.env)
Crear backend/.env en el servidor:
DB_HOST=127.0.0.1
DB_PORT=5432
DB_USER=saludut_user
DB_PASSWORD=TU_PASSWORD_FUERTE
DB_NAME=saludut_db
JWT_SECRET=CAMBIA_ESTE_SECRETO
JWT_EXPIRES_IN=24h
PORT=3000
SOFFICE_PATH=/usr/bin/soffice
PYTHON_PATH=python3
6) Crear usuario admin (manual)
Generar hash bcrypt:
node /opt/saludut/backend/src/generate-hash.js
Luego en PostgreSQL:
SELECT id_rol FROM rol WHERE nombre_rol = 'administrador';
INSERT INTO usuario
(username, email, password_hash, nombre_completo, id_rol, activo, fecha_creacion)
VALUES
('admin', 'admin@saludut.local', '<HASH_BCRYPT>', 'Administrador Sistema', <ID_ROL>, true, NOW());
Si tu esquema tiene columnas obligatorias adicionales, completa esos campos.
7) Backend (instalar y correr)
cd /opt/saludut/backend
npm ci --omit=dev
node src/server.js
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
8) Frontend (build)
cd /opt/saludut/saludut-inpec
npm ci
npm run build
El build queda en saludut-inpec/dist/saludut-inpec/.
9) Configurar API base (sin localhost)
El frontend lee la base desde window.__SALUDUT_CONFIG__:
<script>
window.__SALUDUT_CONFIG__ = {
apiBaseUrl: '/api'
};
</script>
Si el backend esta en otro dominio, cambia apiBaseUrl antes de publicar.
10) Nginx + SSL (ejemplo)
server {
listen 80;
server_name saludut.tu-dominio.com;
root /var/www/saludut;
index index.html;
location / {
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Luego:
rc-service nginx start
certbot --nginx -d saludut.tu-dominio.com
Desarrollo
cd backend
npm install
node src/server.js
cd saludut-inpec
npm install
npm run start