Cómo instalar OpenEMR en Rocky Linux 9

OpenEMR es una historia clínica electrónica y una herramienta de gestión de consultas médicas de código abierto. Está certificada por la Oficina del Coordinador Nacional de Tecnología de la Información Sanitaria (ONC) y ofrece historiales médicos integrados, gestión de consultas, programación, facturación electrónica, internacionalización, asistencia gratuita y mucho más. Puede realizar un seguimiento de los datos demográficos de los pacientes, programar citas, mantener historiales médicos extremadamente detallados con informes de laboratorio, medicamentos y procedimientos, realizar un seguimiento de sus recetas, ayudar con la facturación médica, generar informes detallados y soporte multilingüe.

En este tutorial, aprenderás a instalar el software OpenEMR en un servidor que ejecute Rocky Linux 9.

Requisitos previos

  • Un servidor con Rocky Linux 9.
  • Un usuario sudo no root.
  • Un nombre de dominio completo (FQDN) como openemr.example.com.
  • Asegúrate de que todo está actualizado.
    $ sudo dnf update
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Paso 1 – Configurar el Cortafuegos

El primer paso es configurar el cortafuegos. Rocky Linux utiliza el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

El cortafuegos funciona con diferentes zonas, y la zona pública es la que utilizaremos por defecto. Enumera todos los servicios y puertos activos en el cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Debería mostrar la siguiente salida.

cockpit dhcpv6-client ssh

OpenEMR necesita los puertos HTTP y HTTPS para funcionar. Ábrelos.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Recarga el cortafuegos para aplicar los cambios.

$ sudo firewall-cmd --reload

Vuelve a listar todos los servicios.

$ sudo firewall-cmd --permanent --list-services

Deberías obtener el siguiente resultado.

cockpit dhcpv6-client http https ssh

Paso 2 – Instalar Nginx

Rocky Linux 9 viene con una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Crea y abre el archivo /etc/yum.repos.d/nginx.repo para crear el repositorio oficial de Nginx.

$ sudo nano /etc/yum.repos.d/nginx.repo

Pega en él el siguiente código.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Instala el servidor Nginx.

$ sudo dnf install -y nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.24.0

Habilita e inicia el servidor Nginx.

$ sudo systemctl enable nginx --now

Comprueba el estado del servidor.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Thu 2023-06-15 10:20:00 UTC; 1s ago
       Docs: http://nginx.org/en/docs/
    Process: 1411 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 1412 (nginx)
      Tasks: 2 (limit: 5922)
     Memory: 1.9M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??1412 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??1413 "nginx: worker process"

Paso 3 – Instalar MySQL

Rocky Linux 9 incluye la última versión de MySQL. Puedes instalarla con un solo comando.

$ sudo dnf install mysql-server

Comprueba la versión de MySQL.

$ mysql --version
mysql  Ver 8.0.32 for Linux on x86_64 (Source distribution)

Activa e inicia el servicio MySQL.

$ sudo systemctl enable mysqld --now

Ejecuta el script de instalación segura de MySQL.

$ sudo mysql_secure_installation

Se te pedirá que instales el Componente Validar Contraseña. Comprueba la seguridad de las contraseñas utilizadas en MySQL. Pulsa Y para instalarlo. A continuación, se te pedirá que establezcas el nivel de la política de validación de contraseñas. Elige 2, ya que es el más fuerte.

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

A continuación, se te pedirá que establezcas una nueva contraseña de root. Introduce la contraseña de acuerdo con los requisitos especificados anteriormente. Introduce Y cuando se te pida para continuar con la contraseña raíz elegida.

Please set the password for root here.

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

A continuación, introduce Y para eliminar los usuarios anónimos, desautorizar los inicios de sesión remotos de root, eliminar la base de datos de prueba y recargar las tablas de privilegios.

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done!

Paso 4 – Configurar MySQL

Accede al shell de MySQL. Introduce tu contraseña de root cuando se te solicite.

$ sudo mysql -u root -p

Crea una base de datos de prueba.

mysql> CREATE DATABASE openemr;

Crea una cuenta de usuario SQL.

mysql> CREATE USER 'openemruser'@'localhost' IDENTIFIED BY 'Your_password2';

Concede al usuario todos los privilegios sobre la base de datos.

mysql> GRANT ALL PRIVILEGES ON openemr.* TO 'openemruser'@'localhost';

Elimina los privilegios del usuario.

mysql> FLUSH PRIVILEGES;

Sal del intérprete de comandos.

mysql> exit

Paso 5 – Instalar PHP y sus extensiones

Necesitamos instalar PHP 8.2 para que OpenEMR funcione. El primer paso es coger el repositorio Epel.

$ sudo dnf install epel-release -y

A continuación, instala el repositorio Remi.

$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

Comprueba si hay extensiones de PHP disponibles.

$ dnf module list php -y
Name                                   Stream                   Profiles                                        Summary                  
php                                    8.1                      common [d], devel, minimal                      PHP scripting language   

Remi's Modular repository for Enterprise Linux 9 - x86_64
Name                                   Stream                   Profiles                                        Summary                 
php                                    remi-7.4                 common [d], devel, minimal                      PHP scripting language   
php                                    remi-8.0                 common [d], devel, minimal                      PHP scripting language   
php                                    remi-8.1                 common [d], devel, minimal                      PHP scripting language   
php                                    remi-8.2                 common [d], devel, minimal                      PHP scripting language   

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

La versión por defecto es la 8.1. Habilita el repositorio PHP 8.2 de Remi.

$ sudo dnf module reset php -y
$ sudo dnf module enable php:remi-8.2

Instala PHP y las extensiones requeridas por OpenEMR.

$ sudo dnf install php-fpm php-mysql php-bcmath php-xml php-zip php-curl php-mbstring php-gd php-tidy php-intl php-cli php-soap ImageMagick php-ldap

Instala la biblioteca Herramientas TIFF. Esta biblioteca no está disponible en el repositorio base, pero se encuentra en el repositorio CRB (antes Powertools).

$ sudo dnf install libtiff-tools --enablerepo=crb

Verifica la instalación.

$ php --version
PHP 8.2.7 (cli) (built: Jun  6 2023 21:28:56) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies

Habilita e inicia el servicio PHP-FPM.

$ sudo systemctl enable php-fpm --now

Paso 6 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Para ello utilizaremos el instalador de paquetes Snapd. Como Rocky Linux no lo incluye, instala el instalador de Snapd. Requiere para funcionar el repositorio EPEL que instalamos antes para PHP, así que podemos saltarnos el paso.

Instala Snapd.

$ sudo dnf install -y snapd

Activa e inicia el servicio Snap.

$ sudo systemctl enable snapd --now

Instala el paquete Snap core, y asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Crea los enlaces necesarios para que Snapd funcione.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Ejecuta el siguiente comando para instalar Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica la instalación.

$ certbot --version
certbot 2.6.0

Ejecuta el siguiente comando para generar un certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d openemr.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/openemr.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovaciones de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT          LAST                        PASSED       UNIT                      ACTIVATES
-----------------------------------------------------------------------------------------------------------------------------------------
Thu 2023-06-15 12:29:25 UTC 54min left    Thu 2023-06-15 11:18:44 UTC 16min ago    dnf-makecache.timer       dnf-makecache.service
Thu 2023-06-15 12:51:00 UTC 1h 15min left -                           -            snap.certbot.renew.timer  snap.certbot.renew.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 7 – Descarga OpenEMR

Visita la página de descargas de OpenEMR y coge el enlace de la última versión de OpenEMR. Descarga OpenEMR en el servidor.

$ wget https://sourceforge.net/projects/openemr/files/OpenEMR%20Current/7.0.1/openemr-7.0.1.tar.gz

Extrae los archivos.

$ tar -pxzf openemr-7.0.1.tar.gz

Mueve los archivos extraídos al directorio raíz de la web.

$ sudo mv openemr-7.0.1 /var/www/html/openemr

Da permisos al usuario Nginx sobre el directorio raíz web.

$ sudo chown -R nginx:nginx /var/www/html/openemr

Paso 8 – Configurar SELinux

Cambia el contexto de seguridad de archivos para OpenEMR.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/openemr(/.*)?"

Aplica la política.

$ sudo restorecon -Rv /var/www/html/openemr/

Aplica la política para permitir que Nginx dé acceso a MySQL.

$ sudo setsebool -P httpd_can_network_connect_db 1

Aplica la política para permitir que se realicen conexiones a hosts externos. Esto es necesario para enviar correos electrónicos.

$ sudo setsebool -P httpd_can_network_connect 1

Paso 8 – Configurar PHP-FPM

Abre el archivo /etc/php-fpm.d/www.conf.

$ sudo nano /etc/php-fpm.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=www-data y group=www-data en el archivo y cámbialas por nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

Busca las líneas ;listen.owner = nobody, ;listen.group = nobody, y ;listen.mode=0660 en el archivo y cámbialas como se muestra a continuación.

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. The owner
; and group can be specified either by name or by their numeric IDs.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

A continuación, comenta la siguiente línea como se muestra poniendo un punto y coma delante de ella.

;listen.acl_users = apache,nginx

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Aumenta el tiempo de ejecución de PHP-FPM y PHP-CLI a 60 segundos.

$ sudo sed -i 's/max_execution_time = 30/max_execution_time = 60/' /etc/php.ini

Establece el valor de la variable max_input_time en 1.

$ sudo sed -i 's/max_input_time = 60/max_input_time = -1/' /etc/php.ini

Aumenta el límite de memoria para PHP-FPM de 128MB a 512MB.

$ sudo sed -i 's/memory_limit = 128M/memory_limit = 512M/' /etc/php.ini

Aumenta el tamaño de subida de archivos a 30MB.

$ sudo sed -i 's/post_max_size = 8M/post_max_size = 30M/' /etc/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 30M/' /etc/php.ini

Aumenta el número de variables de entrada máximas a 3000.

$ sudo sed -i 's/;max_input_vars = 1000/max_input_vars = 3000/g' /etc/php.ini

Permite acceder, desde la perspectiva de PHP, a archivos locales con sentencias LOAD DATA.

$ sudo sed -i 's/;mysqli.allow_local_infile = On/mysqli.allow_local_infile = On/g' /etc/php.ini

Reinicia el servicio PHP-FPM.

$ sudo systemctl restart php-fpm

Cambia el grupo del directorio de sesiones PHP a Nginx.

$ sudo chgrp -R nginx /var/lib/php/session

Paso 9 – Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/openemr.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/openemr.conf

Pega en él el siguiente código.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  openemr.example.com;

    access_log  /var/log/nginx/openemr.access.log;
    error_log   /var/log/nginx/openemr.error.log;

    # SSL
    ssl_certificate         /etc/letsencrypt/live/openemr.example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/openemr.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/openemr.example.com/chain.pem;
    ssl_session_timeout  1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    # use https://blog.cloudflare.com/announcing-1111 Cloudfare+Apnic labs, It is free and secure
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] valid=300s;

    root /var/www/html/openemr;

    index index.php;

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

    # Pass PHP Scripts To FastCGI Server
    location ~* \.php$ {
        try_files $uri =404;
        fastcgi_index  index.php;
        fastcgi_pass unix:/run/php-fpm/www.sock; # Depends On The PHP Version
        fastcgi_param SCRIPT_FILENAME  $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        include fastcgi_params;
    }

    # deny access to writable files/directories
    location ~* ^/sites/*/(documents|edi|era) {
        deny all;
        return 404;
    }

    # deny access to certain directories
    location ~* ^/(contrib|tests) {
	    deny all;
        return 404;
    }

    # Alternatively all access to these files can be denied
    location ~* ^/(admin|setup|acl_setup|acl_upgrade|sl_convert|sql_upgrade|gacl/setup|ippf_upgrade|sql_patch)\.php {
        deny all;
        return 404;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt  {
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  openemr.example.com;
    return 301   https://$host$request_uri;
}

Observa que el directorio raíz que se utilizará en la configuración de Nginx es /var/www/html/openemr.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Paso 10 – Instalar OpenEMR

Abre la URL https://openemr.example.com en tu navegador y verás la siguiente pantalla de configuración.

Comprobación de la instalación de OpenEMR

Aquí comprueba los permisos de los archivos y confirma si puedes continuar con el paso 1 o no. Si ves la palabra ready en verde, significa que puedes continuar. Pulsa el botón azul para continuar con el paso 1.

Asistente de configuración de la base de datos OpenEMR

En la página siguiente, se te preguntará si quieres que el instalador cree la base de datos o utilice una ya creada. Selecciona la opción Ya he creado la base de datos y pulsa el botón para proceder al paso 2.

Base de datos OpenEMR y detalles de la cuenta

En la página siguiente, introduce las credenciales de la base de datos que configuraste anteriormente en el paso 4. Introduce también las credenciales de tu cuenta de administrador. Asegúrate de que tu nombre de usuario tiene 12 o más caracteres, de lo contrario, aparecerá un error. Aquí puedes activar la autenticación de dos factores (2FA), pero se recomienda configurarla más tarde, después de la instalación. Haz clic en el botón para crear la base de datos y la cuenta de usuario.

OpenEMR Crear Base de Datos y Usuario

La siguiente página mostrará el estado de la instalación y te indicará el nombre de usuario y la contraseña. Pulsa el botón para pasar al paso 4.

OpenEMR Configurar PHP

La siguiente página mostrará los valores recomendados y actuales de tu archivo php.ini. Asegúrate de que los valores actuales satisfacen los requisitos. Por alguna razón, el instalador muestra valores erróneos para la variable max_execution_time aunque la hayas configurado correctamente. Puedes ignorarlo. Puedes verificar los valores actuales utilizando los siguientes comandos.

Verificación de valores PHP de OpenEMR

Cuando estés satisfecho, pulsa el botón para continuar con el paso 5.

Configuración Apache de OpenEMR

El siguiente paso enumera la configuración del servidor Apache, que ignoraremos puesto que estamos utilizando el servidor Nginx. Pulsa el botón para pasar a la página siguiente.

Tema OpenEMR Select

Aquí se te pedirá que selecciones un tema para el panel de administración. Selecciona la opción Mantener actual y pulsa el botón para continuar. Puedes cambiar el tema desde el panel de administración más adelante, pero no podrás ver su aspecto. Si eliges desde la página del instalador, también podrás comprobar cómo quedan antes de seleccionarlos. Nosotros nos quedaremos con el tema por defecto.

Paso final de la instalación de OpenEMR

La última página contiene algunas notas finales sobre el software y las credenciales de la cuenta. Haz clic en el botón Inicio para abrir la página de acceso.

Página de inicio de sesión de OpenEMR

Aparecerá una ventana emergente de registro en OpenEMR para obtener anuncios de su sitio web. Puedes ignorar e introducir tus credenciales y hacer clic en el botón Iniciar sesión para acceder al panel de control.

Panel de OpenEMR

Si no configuraste la autenticación de dos factores durante la instalación, hazlo haciendo clic en el icono del avatar de la parte superior derecha y seleccionando la opción Gestión MFA.

Menú OpenEMR 2FA

En la página siguiente, selecciona el método de autenticación en el menú desplegable y empieza a configurarlo.

Página de tipo 2FA de OpenEMR

A partir de aquí ya puedes empezar a utilizar OpenEMR para gestionar tu negocio sanitario.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de OpenEMR en un servidor Rocky Linux 9. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...