Cómo instalar Strapi CMS en Rocky Linux 9

Strapi es un Sistema de Gestión de Contenidos (SGC) de código abierto, construido con el lenguaje de programación JavaScript. Al igual que otros CMS sin cabeza, Strapi no viene con un frontend de fábrica. Utiliza una API para su interfaz que te permite construir el sitio web utilizando marcos populares como React y Next.js. Basado en un sistema de plugins, Strapi es un CMS flexible cuyo panel de administración y API son extensibles, y cada una de sus partes es personalizable para adaptarse a cualquier caso de uso. Strapi también tiene un sistema de usuarios integrado para gestionar en detalle a qué tienen acceso los administradores y los usuarios finales.

En este tutorial, aprenderás a instalar la versión comunitaria de Strapi CMS en un servidor Rocky Linux 9 junto con Nginx como servidor proxy inverso.

Requisitos previos

  • Un servidor que ejecute Rocky Linux 9 con un mínimo de 2 GB de RAM y 1 núcleo de CPU.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) como strapi.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 -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

Strapi 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 y configurar PostgreSQL

Strapi funciona con PostgreSQL 11 y superiores. Rocky Linux 9 viene con PostgreSQL 13 por defecto. Nosotros utilizaremos PostgreSQL 15 para nuestro tutorial.

Ejecuta el siguiente comando para añadir la clave GPG de PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Instala el archivo RPM del repositorio PostgreSQL.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Desactiva el módulo incorporado de PostgreSQL.

$ sudo dnf -qy module disable postgresql

Ahora, puedes instalar PostgreSQL utilizando el siguiente comando.

$ sudo dnf install -y postgresql15-server

Inicializa la base de datos.

$ sudo /usr/pgsql-15/bin/postgresql-15-setup initdb

Habilita el servicio PostgreSQL.

$ sudo systemctl enable postgresql-15

Inicia el servicio PostgreSQL.

$ sudo systemctl start postgresql-15

Comprueba el estado del servicio PostgreSQL.

$ sudo systemctl status postgresql-15
? postgresql-15.service - PostgreSQL 15 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2023-02-01 13:21:27 UTC; 41min ago
       Docs: https://www.postgresql.org/docs/15/static/
    Process: 53088 ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 53093 (postmaster)
      Tasks: 7 (limit: 5727)
     Memory: 45.7M
        CPU: 1.112s
     CGroup: /system.slice/postgresql-15.service
             ??53093 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
             ??53094 "postgres: logger "
             ??53095 "postgres: checkpointer "
             ??53096 "postgres: background writer "
             ??53098 "postgres: walwriter "
             ??53099 "postgres: autovacuum launcher "
             ??53100 "postgres: logical replication launcher "

Inicia el intérprete de comandos PostgreSQL.

$ sudo -i -u postgres psql

Crea la base de datos Strapi.

postgres=# CREATE DATABASE strapidb;

Crea el usuario Strapi y elige una contraseña segura.

postgres-# CREATE USER strapiuser WITH PASSWORD 'Your_Password';

Cambia el propietario de la base de datos por el usuario Strapi.

postgres-# ALTER DATABASE strapidb OWNER TO strapiuser;

Sal del intérprete de comandos.

postgres-# \q

Comprueba que tus credenciales funcionan.

$ psql --username strapiuser --password --host localhost strapidb
Password:
psql (15.1)
Type "help" for help.

strapidb=>

Sal del intérprete de comandos escribiendo \q.

Paso 3 – Instala Node.js

Rocky Linux 9 viene con Node v16, que está obsoleto. Instalaremos la última versión LTS de Node, que es la v18 en el momento de escribir este tutorial.

Coge el instalador de Node v18 de Nodesource.

$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -

Instala Node.js.

$ sudo dnf install nodejs -y

Verifica la versión de Node.js.

$ node -v
v18.13.0

Paso 4 – Instala Strapi

Ejecuta el siguiente comando para instalar Strapi.

$ npx create-strapi-app@latest howtoforge-project
Need to install the following packages:
  [email protected]
Ok to proceed? (y) y

Introduce y para proceder a la instalación. A continuación, se te pedirá que elijas el tipo de Instalación. Elige Personalizada para proceder y responde a las preguntas que se te plantean a continuación.

? Choose your installation type Custom (manual settings)
? Choose your preferred language JavaScript
? Choose your default database client postgres
? Database name: strapidb
? Host: 127.0.0.1
? Port: 5432
? Username: strapiuser
? Password: Your_Password
? Enable SSL connection: No

Dependiendo de tus necesidades, puedes elegir Typescript o JavaScript como lenguaje para Strapi.

Una vez completada la instalación, estás listo para construir tu proyecto Strapi.

Cambia al directorio del proyecto.

$ cd howtoforge-project

Ejecuta el siguiente comando para construir el proyecto, incluyendo la interfaz de usuario Strapi Admin.

$ NODE_ENV=production npm run build

Inicia el servidor Strapi con el siguiente comando.

$ node ~/howtoforge-project/node_modules/.bin/strapi start

Tu aplicación debería ser visible en la URL http://<yourserverIP>:1337. Pero antes, abre el puerto en el cortafuegos.

$ sudo firewall-cmd --permanent --add-port=1337/tcp
$ sudo firewall-cmd --reload

Una vez abierta la URL, deberías obtener la siguiente pantalla.

Strapi CMS Inicio

Pulsa Ctrl + C en el terminal para detener el servidor. Deberías eliminar la regla del cortafuegos porque no la necesitaremos.

$ sudo firewall-cmd --permanent --remove-port=1337/tcp
$ sudo firewall-cmd --reload

Paso 5 – Instalar y configurar PM2

En lugar de iniciar el servidor manualmente, podemos utilizar PM2 (Process Manager 2) para gestionar el proceso y crear un servicio systemd para el mismo.

Cambia al directorio de inicio.

$ cd ~

Instala PM2.

$ sudo npm install pm2@latest -g

Crea y abre el archivo de configuración de PM2 para editarlo.

$ sudo nano ecosystem.config.js

Pega el siguiente contenido en el archivo. Asegúrate de introducir el nombre correcto del directorio junto con las credenciales Postgres.

module.exports = {
  apps: [
    {
      name: 'strapi',
      cwd: '/home/navjot/howtoforge-project',
      script: 'npm',
      args: 'start',
      env: {
        NODE_ENV: 'production',
        DATABASE_HOST: 'localhost',
        DATABASE_PORT: '5432',
        DATABASE_NAME: 'strapidb',
        DATABASE_USERNAME: 'strapiuser',
        DATABASE_PASSWORD: 'Your_Password',
      },
    },
  ],
};

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

Ejecuta tu instancia Strapi en segundo plano utilizando PM2.

$ pm2 start ecosystem.config.js

Obtendrás el siguiente resultado.

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/home/navjot/.pm2
[PM2] PM2 Successfully daemonized
[PM2][WARN] Applications strapi not running, starting...
[PM2] App [strapi] launched (1 instances)
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id  ? name      ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu      ? mem      ? user     ? watching ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0   ? strapi    ? default     ? N/A     ? fork    ? N/A      ? 0s     ? 0    ? online    ? 0%       ? 0b       ? navjot   ? disabled ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Las aplicaciones que se ejecutan con PM2 se reinician automáticamente si se bloquean o mueren.

Crea un script systemd de inicio utilizando el siguiente comando.

$ pm2 startup

Obtendrás el siguiente resultado.

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot

Copia el comando de la salida anterior y ejecútalo.

$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot

Obtendrás el siguiente resultado.

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=navjot
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/home/navjot/.local/bin:/home/navjot/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/navjot/.pm2
PIDFile=/home/navjot/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-navjot.service
Command list
[ 'systemctl enable pm2-navjot' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-navjot.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-navjot...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-navjot.service → /etc/systemd/system/pm2-navjot.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

Guarda la lista de procesos PM2.

$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/navjot/.pm2/dump.pm2

Ahora tu servicio Strapi se está ejecutando en segundo plano en modo de producción.

Paso 6 – 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.22.1

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; vendor preset: disabled)
     Active: active (running) since Wed 2023-02-01 15:01:29 UTC; 7s ago
       Docs: http://nginx.org/en/docs/
    Process: 4637 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 4638 (nginx)
      Tasks: 2 (limit: 10884)
     Memory: 1.9M
        CPU: 8ms
     CGroup: /system.slice/nginx.service
             ??4638 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??4639 "nginx: worker process"

Paso 7 – 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. Necesita el repositorio EPEL para funcionar.

$ sudo dnf install -y epel-release

Instala Snapd.

$ sudo dnf install -y snapd

Activa e inicia el servicio Snap.

$ sudo systemctl enable snapd --now

Instala el paquete principal de Snap, 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.2.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 strapi.example.com

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

Genera un certificado de grupo Diffie-Hellman.

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

Para comprobar si la renovación SSL funciona correctamente, realiza una ejecución en seco del proceso.

$ sudo certbot renew --dry-run

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

Paso 8 – Configurar Nginx

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.

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

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

Pega en él el siguiente código.

server {
  # Redirect any http requests to https
  listen         80;
  listen         [::]:80;
  server_name    strapi.example.com;
  return 301     https://$host$request_uri;
}

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

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

  # TLS configuration
  ssl_certificate           /etc/letsencrypt/live/strapi.example.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/strapi.example.com/privkey.pem;
  ssl_trusted_certificate   /etc/letsencrypt/live/strapi.example.com/chain.pem;
  ssl_protocols             TLSv1.2 TLSv1.3;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_session_cache         shared:SSL:50m;
  ssl_session_timeout       1d;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  location / {
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header	    X-Forwarded-Host $http_host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass              http://127.0.0.1:1337;
  }
}

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

Comprueba 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

Ahora puedes acceder a Strapi CMS a través de la URL https://strapi.example.com. Verás la siguiente página que muestra que Strapi se está ejecutando en modo de producción.

Producción Strapi Inicio

Visita la URL https://strapi.example.com/admin para crear un usuario administrador.

Página de creación de usuario Strapi Admin

Rellena tus datos de administrador y haz clic en el botón Comencemos para acceder a la pantalla del panel de control del administrador.

Panel de control Strapi Admin

A partir de aquí, puedes empezar a crear contenido en Strapi.

Paso 9 – Actualizar Strapi

El primer paso para actualizar Strapi es detener el servidor.

$ cd ~
$ pm2 stop ecosystem.config.js

Cambia al directorio del proyecto y abre el archivo package.json para editarlo.

$ cd howtoforge-project
$ nano package.json

Actualiza todos los números de versión de los paquetes de Strapi a la última versión estable de Strapi. Puedes obtener la última versión disponible en la página de versiones de Strapi en GitHub.

"devDependencies": {},
  "dependencies": {
    "@strapi/strapi": "4.5.5",
    "@strapi/plugin-users-permissions": "4.5.5",
    "@strapi/plugin-i18n": "4.5.5",
    "pg": "8.6.0"
  },

Aquí tienes que cambiar 4.5.5 a la última versión estable. Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

Instala la versión actualizada.

$ npm install

Reconstruye el panel de administración.

$ NODE_ENV=production npm run build

Arranca de nuevo el servidor.

$ cd ~
$ pm2 start ecosystem.config.js

Tu instalación de Strapi ya está actualizada y funcionando.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de Strapi CMS en un servidor Rocky Linux 9 junto con Nginx como servidor proxy inverso. Si tienes alguna pregunta, publícala en los comentarios más abajo.

También te podría gustar...