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.
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.
Visita la URL https://strapi.example.com/admin
para crear un usuario administrador.
Rellena tus datos de administrador y haz clic en el botón Comencemos para acceder a la pantalla del panel de control del administrador.
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.