Deploy, Configuración, Mantenimiento e Integración con Superset y JasperReport
Marcelo Denis
Líder de Proyecto
mdenis@codelab.com.py
odelab S.A
17 de diciembre del 2024
1. Introducción
2. Arquitectura del Sistema
3. Estructura del Código
4. Proceso de Implementación
6. Mantenimiento
8. Reportes y Dashboard
5. Configuración de Servidores
7. Integración con SuperSet
9. Resumen
Sistema empleado para el registro y monitoreo de pacientes diagnosticados con cáncer de mama.
Arquitectura del sistema
Descripción de la estructura del backend, frontend y la comunicación entre ambos componentes.
Estructura del código
Localización de la definición de los componentes y la organización de los proyectos.
Proceso de despliegue
Procedimientos detallados para la configuración y despliegue del sistema en un servidor.
Configuración de servidores y mantenimiento
Requerimientos mínimos, copias de seguridad automáticas y gestión de logs.
Integración con SuperSet y reportes
Procedimiento para la configuración e integración de dashboards y reportes en el sistema.
La arquitectura del sistema se basa en el patrón de arquitectura orientada a servicios web, donde se tienen proyectos backend y frontend independientes.
Repositorio
https://gitlab.com/citycancerdigital/backend-service.
Carpetas principales:
models: Representación de las tablas de la base de datos.resources: Lógica de negocio.swagger: Documentación de la API.dao: Acceso a los datos.database: Scripts SQL iterativos.Archivos clave:
app.py: Arranque principal del backend.requirements.txt: Dependencias del sistema.Dockerfile: Definición para el despliegue y construcción de imágenes.Repositorio
https://gitlab.com/citycancerdigital/frontend-service.
Carpetas principales:
src: Código fuente del frontend (Vue.js y Quasar).public: Recursos estáticos (imágenes, íconos)Archivos clave:
quasar.config.js: Configuración del framework.Dockerfile: Despliegue del frontend.index.html: Punto de entrada principal.package.json: Dependencias y scripts del proyecto.El servidor debe tener instalado las siguientes herramientas:
Una vez seleccionado el directorio de trabajo, se debe seguir los siguientes pasos para arrancar el sistema:
1. Generar Nombre de Dominio para el Acceso al Sistema.
EJemplo: https://www.cuidasoft.org
2. Generar Imágenes Docker de Backend y Frontend.
1. Backend
> git clone https://gitlab.com/citycancerdigital/backend-service.git
> pip install - requirements.txt
> docker build -t registry.gitlab.com/citycancerdigital/backend-service:<RELEASE|BRANCH>
Para la generación de imágenes se debe clonar los repositorios, restaurar las dependencias y generar las imágenes docker.
2. Frontend
> git clone https://gitlab.com/citycancerdigital/frontend-service.git
> npm install
> docker build -t registry.gitlab.com/citycancerdigital/frontend-service:<RELEASE|BRANCH>
3. Disponibilización de las Imágenes Docker al Servidor
Si no se tiene configurado CI/CD en gitlab, se debe realizar lo siguiente para disponibilizar las imágenes docker al servidor que levantará los servicios de BD, backend y frontend.
GitLab provee un mecanismo para automatizar la creación de las imágenes docker emplenado su repositorio. Mas detalle de como implementarlo en:
https://docs.gitlab.com/ee/ci/
Backend
> docker save -o ccan_backend.tar registry.gitl ab.com/citycancerdigital/backend-service:<RELEASE|BRANCH>
> scp ccan_backend.tar <USER>@<IP_O_DNS_SERVER>:/home/docker_images
> ssh <USER>@<IP_O_DNS_SERVER>
> sudo docker load -i /home/docker_images/ccan_backend.tar
Frontend
> docker save -o ccan_backend.tar registry.gitlab. com/citycancerdigital/frontend-service:<RELEASE|BR ANCH>
> scp ccan_frontend.tar <USER>@<IP_O_DNS_SERVER>:/home/docker_images
> ssh <USER>@<IP_O_DNS_SERVER>
> sudo docker load -i /home/docker_images/ccan_frontend.tar
4. Generación Externa de las Imágenes Docker
services:
db:
image: postgres:14
environment:
#POSTGRES_USER: cuidasoft
POSTGRES_PASSWORD: cuidasot123
POSTGRES_DB: cuidasoft
TZ: America/Bogota
ports:
- "5432:5432"
volumes:
- ./postgres:/var/lib/postgresql/data
- ./database/:/docker-entrypoint-initdb.d/:ro
networks:
- backend
5. Configurar docker compose
En el fichero docker-compose.yml...
backend:
image: registry.gitlab.com/citycancerdigital/backend-service:<RELEASE|BRANCH>
environment:
DB_USERNAME: 'postgres'
DB_PASSWORD: 'cuidasoft123'
DB_HOST: 'db'
DB_DATABASE: 'cuidasoft'
DB_SCHEMA: 'public'
DB_PORT: '5432'
TZ: America/Bogota
ports:
- "5000:5000"
networks:
- backend
- frontend
depends_on:
- db
links:
- db
volumes:
- uploaded_files:/usr/src/app/static/uploaded_files
5. Configurar docker compose
frontend:
image: registry.gitlab.com/citycancerdigital/frontend-service:<RELEASE|BRANCH>
environment:
TZ: America/Bogota
BACKEND_URL: <NOMBRE_DOMINIO_SERVIDOR>/api
# Port 9000 mapped to the web server to avoid conflicts with the host's
ports:
- "9000:80"
networks:
- frontend
depends_on:
- backend
volumes:
- "./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro"
- "./bin/40-process-envars.sh:/docker-entrypoint.d/40-process-envars.sh:ro"
5. Configurar docker compose
en el fichero ./nginx/default.conf...
server {
listen 80;
server_name localhost;
client_body_buffer_size 50M;
client_max_body_size 50M;
large_client_header_buffers 4 16k;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /api {
proxy_pass http://backend:5000/api;
}
}
5. Configurar docker compose
en el fichero ./bin/40-process-envars.sh...
#!/bin/bash
if [ "$STATIC_BACKEND_URL" != "" ]; then
sed -i 's|STATIC_BACKEND_URL:"[a-zA-Z0-9\/:-_.&?]\+",|STATIC_BACKEND_URL:"'"$STATIC_BACKEND_URL"'",|g' /usr/share/nginx/html/assets/auth.*.js
fi
if [ "$BACKEND_URL" != "" ]; then
sed -i 's|BACKEND_URL:"[a-zA-Z0-9\/:-_.&?]\+",|BACKEND_URL:"'"$BACKEND_URL"'",|g' /usr/share/nginx/html/assets/auth.*.js
fi
5. Configurar docker compose
networks:
frontend:
backend:
volumes:
uploaded_files:
driver: local
driver_opts:
type: none
o: bind
device: /home/cuidasoft/uploaded-deploy/uploaded_file
5. Configurar docker compose
Una vez verificadas las configuraciones deseadas se debe iniciar los contenedores con el siguiente comando:
> docker compose up -d
El servicio podrá ser accedido a través de: http://<IP_SERVIDOR|NOMBRE_DOMINIO>:80
Los contenedores se pueden detener con el siguiente comando:
> docker compose down
5. Administración de Contenedores
| Test | Producción | |
|---|---|---|
| Memoria | 4GB | 8GB |
| CPU | Compartido 2 núcleos | Dedicado 4 nucleos |
| Almacenamiento | 250GB | 1TB |
| Sistema Operativo | Linux compatible con Docker | Linux compatible con Docker |
| Dominios | 2 dominios (aplicación y superset) | 2 dominios (aplicación y superset) |
| Certificado SSL | 2 | 2 |
Se recomienda realizar un backup semanal de los datos, esto incluye:
Se puede implementar mediante un script que se ejecute periódicamente vía crontab.
> sudo su
> crontab -e
> 0 3 * * 5 /home/cuidasoft/cuidasoft-deploy/script_backup_db_files.sh
#!/bin/bash
# Variables del fichero destino
DATE=$(date +%Y%m%d)
BACKUP_PATH="/home/cuidasoft/cuidasoft-deploy/backups/${DATE}/"
# Ejecutar creación del directorio
mkdir $BACKUP_PATH
# Variables para el backup de BD
CONTAINER_NAME="cuidasoft-deploy-db-1"
DB_USER="postgres"
DB_NAME="cuidasoft"
BACKUP_FILE="${BACKUP_PATH}backup_${DB_NAME}_${DATE}.sql"
# Variables para la compresión del directorio
DIRECTORY_PATH="/home/cuidasoft/cuidasoft-deploy/uploaded_files"
DIRECTORY_BACKUP_FILE="${BACKUP_PATH}directory_backup_${DATE}.tar.gz"
# Ejecutar copia de seguridad
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -d $DB_NAME > $BACKUP_FILE
# Verificar el Éxito de la copia de seguridad
if [ $? -eq 0 ]; then
echo "Copia de seguridad de BD exitosa. Archivo: $BACKUP_FILE"
else
echo "¡Error! La copia de seguridad de BD ha fallado."
fi
# Comprimir el directorio
tar -czvf $DIRECTORY_BACKUP_FILE $DIRECTORY_PATH
# Verificar el éxito de la compresión del directorio
if [ $? -eq 0 ]; then
echo "Compresión del directorio exitosa. Archivo: $DIRECTORY_BACKUP_FILE"
else
echo "¡Error! La compresión del directorio ha fallado."
fi
Se pueden visualizar a través de los logs de cada contenedor mediante:
Frontend
> docker logs -f <NOMBRE_CONTENEDOR_FRONTEND>
Backend
> docker logs -f <NOMBRE_CONTENEDOR_BACKEND>
Para el caso del backend, los logs se almacenan en un fichero diario en un directorio llamado “logs” ubicado en la raíz del código fuente del contenedor backend.
services:
superset:
build:
context: ./superset
dockerfile: dockerfile
environment:
- ADMIN_USERNAME=admin
- ADMIN_EMAIL=admin@superset.com
- ADMIN_PASSWORD=admin
ports:
- '8088:8088'
volumes:
- superset:/app/superset_home
volumes:
superset:
external: false
En el fichero docker-compose.yml...
En el folder superset se encuentran los siguientes ficheros:
En el fichero dockerfile...
FROM apache/superset:3.1.0
USER root
ENV ADMIN_USERNAME $ADMIN_USERNAME
ENV ADMIN_EMAIL $ADMIN_EMAIL
ENV ADMIN_PASSWORD $ADMIN_PASSWORD
COPY ./superset-init.sh /superset-init.sh
RUN chmod +x /superset-init.sh
COPY superset_config.py /app/
ENV SUPERSET_CONFIG_PATH /app/superset_config.py
USER superset
ENTRYPOINT [ "/superset-init.sh" ]
En el fichero superset-init.sh...
#!/bin/bash
# create Admin user, you can read these values from env or anywhere else possible
superset fab create-admin --username "$ADMIN_USERNAME" --firstname Superset --lastname Admin --email "$ADMIN_EMAIL" --password "$ADMIN_PASSWORD"
# Upgrading Superset metastore
superset db upgrade
# Load examples
superset load_examples
# setup roles and permissions
superset superset init
# Starting server
/bin/sh -c /usr/bin/run-server.sh
En el fichero superset_config.py...
SESSION_COOKIE_SAMESITE = None
ENABLE_PROXY_FIX = True
PUBLIC_ROLE_LIKE_GAMMA = True
FEATURE_FLAGS = {
"EMBEDDED_SUPERSET": True,
"HORIZONTAL_FILTER_BAR": True,
"SSH_TUNNELING": True,
"ENABLE_TEMPLATE_PROCESSING": True
}
CORS_OPTIONS = {
'supports_credentials': True,
'allow_headers': ['*'],
'resources':['*'],
'origins': ['*']
}
SECRET_KEY='q8FfRww3uCBD/XI/qdAw3JwNJfkLsK1CqXTNEJx3fRYj3b+Nz6TfKIJa'
CSRF_ENABLED = False
WTF_CSRF_ENABLED = False
TALISMAN_ENABLED = False
LANGUAGES = {
"en": {"flag": "us", "name": "English"},
"es": {"flag": "es", "name": "Spanish"},
}
# Variables de entorno desde el backend
SUPERSET_URL: https://dashboard.cuidasoft.org
SUPERSET_USERNAME: cuidasoftco
SUPERSET_PASSWORD: cuidasoftco
SUPERSET_DASHBOARD_ID: 01868858-898b-413f-9fc7-cd9f3a59f019
Los reportes son diseñados en JasperReports.
Las fuentes de los reportes se encuentran en el fichero "reports" de las fuentes del backend.
Los reportes son generados por el proyecto del backend en tiempo de ejecución.
Nuevos reportes deberán ser agregados en esa ubicación.
Los dashboard deberán ser diseñados en la herramienta de SuperSet.
Cada dashboard genera un codigo identificador que deberá ser usado en la aplicación del frontend para integrarlo a CUIDASOFT.