Cómo instalar SuiteCRM en Rocky Linux 9

SuiteCRM es una solución de código abierto para la gestión de las relaciones con los clientes escrita en PHP. Es una bifurcación del popular software SugarCRM después de que SugarCRM dejara de publicar su edición comunitaria. Se utiliza para crear un repositorio central para todos los datos de tus clientes, con el fin de obtener información que puedas utilizar para mejorar y cultivar tus relaciones comerciales.

Algunas de sus funciones son Almacenamiento de documentos, Marketing por correo electrónico, Calendario, Integración con redes sociales, Gestión de territorios, Segmentación, Automatización del marketing, Calificación de clientes potenciales, Integración con el chat interno, Atención al cliente, CRM social, Automatización de Sales-force, Campañas de marketing, CRM móvil e Informes. Se puede integrar con servicios de retransmisión SMTP de terceros como Mandrill, SendGrid, Amazon SES, etc. Puedes instalar plugins para ampliar la funcionalidad de SuiteCRM. Se puede integrar con aplicaciones de terceros como Mautic, Facebook, Twitter, MailChimp, Zoom, Quickbooks, DocuSign, etc.

En este post, aprenderás a instalar SuiteCRM utilizando el servidor web Nginx y Let’s Encrypt SSL en un servidor Rocky Linux 9.

Requisitos previos

  • Un servidor con Rocky Linux 9.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) como suitecrm.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

SuiteCRM 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)
    Drop-In: /usr/lib/systemd/system/nginx.service.d
             ??php-fpm.conf
     Active: active (running) since Thu 2023-05-18 22:32:50 UTC; 4s ago
       Docs: http://nginx.org/en/docs/
    Process: 3955 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 3957 (nginx)
      Tasks: 2 (limit: 5922)
     Memory: 2.1M
        CPU: 6ms
     CGroup: /system.slice/nginx.service
             ??3957 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??3958 "nginx: worker process"

Paso 3 – Instalar PHP y sus extensiones

Necesitamos instalar PHP 8.1 para que SuiteCRM 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 versiones 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.1 de Remi.

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

Instala PHP y las extensiones requeridas por SuiteCRM.

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

Verifica la instalación.

$ php --version
PHP 8.1.19 (cli) (built: May 10 2023 13:43:03) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.19, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.19, Copyright (c), by Zend Technologies

Habilita e inicia el servicio PHP-FPM.

$ sudo systemctl enable php-fpm --now

Paso 4 – Instalar MySQL

Rocky Linux 9 incluye la última versión de MySQL. Puedes instalarlo 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 5 – 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 suitecrm;

Crea una cuenta de usuario SQL.

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

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

mysql> GRANT ALL PRIVILEGES ON suitecrm.* TO 'suiteuser'@'localhost';

Elimina los privilegios del usuario.

mysql> FLUSH PRIVILEGES;

Sal del intérprete de comandos.

mysql> exit

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 suitecrm.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/suitecrm.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
.....
Sun 2023-05-21 06:32:00 UTC 9h left       Sat 2023-05-21 18:04:05 UTC 2h 59min ago  snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-05-21 06:43:20 UTC 9h left       Sat 2023-05-21 10:49:23 UTC 10h ago       apt-daily-upgrade.timer   apt-daily-upgrade.service
Sun 2023-05-21 09:00:06 UTC 11h left      Sat 2023-05-21 20:58:06 UTC 5min ago      apt-daily.timer           apt-daily.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 SuiteCRM

Crea el directorio raíz web para SuiteCRM.

$ sudo mkdir /var/www/html/suitecrm -p

Cambia al directorio raíz web.

$ cd /var/www/html/suitecrm

Descarga la versión SuiteCRM 8.x. Coge el enlace a la última versión de la página de descargas de SuiteCRM.

$ sudo wget https://suitecrm.com/download/140/suite83/562304/suitecrm-8-3-0.zip

Extrae los ficheros del archivo.

$ sudo unzip -q suitecrm*.*

Elimina el archivo zip.

$ sudo rm suitecrm-8-3-0.zip

Establece los permisos de archivo y la propiedad de usuario correctos para el usuario Nginx. Configura también el archivo bin/console ejecutable para ejecutar la consola de SuiteCRM.

$ sudo find . -type d -not -perm 2755 -exec chmod 2755 {} \;
$ sudo find . -type f -not -perm 0644 -exec chmod 0644 {} \;
$ sudo find . ! -user nginx -exec chown nginx:nginx {} \;
$ sudo chmod +x bin/console

Paso 8 – Configurar SELinux

Cambia el contexto de seguridad de archivos para SuiteCRM.

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

Aplica la política.

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

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 9 – Configurar Nginx y PHP

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
...

A continuación, descomenta la línea de propietario, grupo y permiso por defecto del archivo socket y modifícalos 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.
; 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 solicite.

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

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

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

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

PHP establece por defecto el límite de tamaño de archivo para la biblioteca multimedia en 2 MB. Ejecuta los siguientes comandos para aumentar el límite de tamaño de archivo a 25 MB.

$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 25M/g' /etc/php.ini
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 25M/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

Configurar Nginx

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

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

Pega en él el siguiente código.

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

    root /var/www/html/suitecrm/public;
    error_log /var/log/nginx/suitecrm.error.log;
    access_log /var/log/nginx/suitecrm.access.log;
    client_max_body_size 25M;

    index index.php index.html index.htm;

    ssl_certificate      /etc/letsencrypt/live/suitecrm.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/suitecrm.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/suitecrm.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    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;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    # Don't log favicon
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # Deny all attempts to access hidden files/folders such as .htaccess, .htpasswd, .DS_Store (Mac), etc...
    location ~ /\. {
        deny all;
    }

    # A long browser cache lifetime can speed up repeat visits to your page
    location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
        expires           360d;
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  suitecrm.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/suitecrm/public. En versiones anteriores de SuiteCRM (7.x), era /var/www/html/suitecrm. El directorio public se introdujo con la versión SuiteCRM 8.x.

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 y acceder a SuiteCRM

Hay dos formas de instalar SuiteCRM. El primer método es utilizar el instalador web y el segundo consiste en utilizar la línea de comandos de la consola de SuiteCRM.

Método 1 – Asistente Web

Abre la URL https://suitecrm.example.com en el navegador y se te presentará el asistente de instalación.

Asistente de configuración de SuiteCRM

Introduce la URL, las credenciales de la base de datos y la información de acceso a tu cuenta de administrador. Introduce localhost como nombre de host y 3306 como puerto de la base de datos. Pulsa el botón Continuar para abrir la página de inicio de sesión.

Página de inicio de sesión de SuiteCRM

Introduce los datos de tu cuenta y haz clic en el botón Iniciar sesión para abrir el panel de SuiteCRM.

Panel de SuiteCRM

Las versiones anteriores de SuiteCRM te daban la opción de configurar el proveedor de correo electrónico durante la configuración. Ahora ya no es así. Para configurar el proveedor de correo electrónico, haz clic en el menú desplegable Administrador en la esquina superior derecha y haz clic en la opción Admin.

Opción Menú Admin de SuiteCRM

Accederás al siguiente Panel de Administración de SuiteCRM.

Panel de administración de SuiteCRM

Haz clic en el enlace Configuración de correo electrónico para abrir la página de proveedores de correo electrónico.

Configuración del correo electrónico de SuiteCRM

Si utilizas Gmail o Microsoft Exchange, puedes utilizar los botones dedicados para configurarlos. Para nuestro tutorial, estamos utilizando Amazon SES. Si quieres que tus usuarios utilicen tu configuración SMTP, puedes activar la opción para ello. Haz clic en el botón Enviar correo de prueba para abrir la siguiente ventana emergente e introduce un identificador de correo electrónico en el que quieras recibir el correo de prueba.

Mensaje emergente de prueba de SuiteCRM

Pulsa el botón Enviar para enviar un correo electrónico de prueba. Si recibes el siguiente correo electrónico, significa que tu configuración funciona correctamente.

Email de prueba de SuiteCRM

Haz clic en el botón Guardar en la parte superior de la página de configuración del correo electrónico para guardar la configuración. Ya puedes empezar a utilizar SuiteCRM para gestionar tus clientes y tu negocio.

Método 2 – Consola de comandos de SuiteCRM

Cambia al directorio de SuiteCRM.

$ cd /var/www/html/suitecrm

Ejecuta el siguiente comando para instalar SuiteCRM.

$ sudo ./bin/console suitecrm:app:install -u "admin_username" -p "admin_password" -U "db_user" -P "db_password" -H "localhost" -N "dbname" -S "https://suitecrm.example.com" -d "yes" -Z "3306"

Si no quieres los datos de demostración, puedes omitir la bandera d "yes" en el comando anterior.

Incluso puedes ejecutar el instalador sin proporcionar ninguna variable. En ese caso, te pedirá la información.

$ sudo ./bin/console suitecrm:app:install

Abre la URL https://suitecrm.example.com en tu navegador y abre la página de acceso y procede a partir de ahí.

Paso 11 – Configurar Cron Jobs

SuiteCRM necesita cron jobs para funcionar correctamente. Edita el archivo crontab del usuario nginx. Rocky Linux utiliza por defecto el editor Vim. El siguiente comando abrirá el crontab en el editor Nano, que es más fácil de usar.

$ sudo EDITOR=nano crontab -e -u nginx

Añade la siguiente línea al final del archivo.

*    *    *    *    *     cd /var/www/html/suitecrm/public/legacy; php -f cron.php > /dev/null 2>&1

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

Conclusión

Con esto concluye el tutorial sobre la instalación de SuiteCRM utilizando el servidor Nginx con Let’s Encrypt SSL en una máquina Rocky Linux 9. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...