Cómo instalar Strapi CMS en Ubuntu 22.04

Strapi es un Sistema de Gestión de Contenidos (CMS) de código abierto y sin cabecera, construido con JavaScript. Al igual que otros CMS sin cabeza, Strapi no viene con un frontend de fábrica. Utiliza una API para su interfaz, lo 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 Ubuntu 22.04, junto con Nginx como servidor proxy inverso.

Requisitos previos

  • Un servidor con Ubuntu 22.04.
  • 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 apt update
    $ sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -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. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Deberías obtener la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instalar y configurar PostgreSQL

Strapi funciona con PostgreSQL 11 y superiores. Ubuntu 22.04 viene con PostgreSQL 14 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

Añade el repositorio APT a tu lista de fuentes.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Actualiza el repositorio del sistema.

$ sudo apt update

Ahora, puedes instalar PostgreSQL utilizando el comando siguiente.

$ sudo apt install postgresql postgresql-contrib

El paquete postgresql-contrib contiene algunas utilidades adicionales.

Comprueba el estado del servicio PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2022-12-28 18:03:03 UTC; 17s ago
   Main PID: 4119 (code=exited, status=0/SUCCESS)
        CPU: 2ms

Dec 28 18:03:03 strapi systemd[1]: Starting PostgreSQL RDBMS...
Dec 28 18:03:03 strapi systemd[1]: Finished PostgreSQL RDBMS.

Verás que el servicio está activado y en ejecución por defecto.

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 (Ubuntu 15.1-1.pgdg22.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

strapidb=>

Sal del intérprete de comandos escribiendo \q.

Paso 3 – Instala Node.js

Ubuntu 22.04 incluye Node v12, 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 -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh

Ejecuta el script de instalación.

$ sudo bash nodesource_setup.sh

Instala Node.js.

$ sudo apt install nodejs

Comprueba la versión de Node.js.

$ node -v
v18.12.1

Elimina el archivo de instalación.

$ rm nodesource_setup.sh

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 ufw allow 1337

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 ufw delete allow 1337

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/my-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    ? 4824     ? 0s     ? 0    ? online    ? 0%       ? 31.9mb   ? 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

Guarda la lista de procesos PM2.

$ pm2 save

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

Paso 6 – Instalar Nginx

Ubuntu 22.04 incluye una versión antigua de Nginx. Para instalar la última versión, necesitas descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
	| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.22.1

Iniciar el servidor Nginx.

$ sudo systemctl start nginx

Paso 7 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Ubuntu o descargar la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Ubuntu 22.04 viene con Snapd instalado por defecto. Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada. Asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

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

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

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

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

Introduce 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 Ubuntu 22.04 y Nginx como servidor proxy inverso. Si tienes alguna pregunta, publícala en los comentarios más abajo.

También te podría gustar...