Ricerca nel sito web

Come installare Strapi CMS su Rocky Linux 9


Strapi è un sistema di gestione dei contenuti (CMS) open source e headless, costruito con il linguaggio di programmazione JavaScript. Come altri CMS headless, Strapi non viene fornito con un frontend pronto all'uso. Utilizza un'API per il suo frontend che ti consente di creare il sito Web utilizzando framework popolari come React e Next.js. Basato su un sistema di plugin, Strapi è un CMS flessibile il cui pannello di amministrazione e API sono estensibili e ogni parte è personalizzabile per adattarsi a qualsiasi caso d'uso. Strapi dispone anche di un sistema utente integrato per gestire in dettaglio ciò a cui hanno accesso gli amministratori e gli utenti finali.

In questo tutorial imparerai come installare la versione community di Strapi CMS su un server Rocky Linux 9 insieme a Nginx come server proxy inverso.

Prerequisiti

    Un server che esegue Rocky Linux 9 con un minimo di 2 GB di RAM e 1 CPU Core.

    Un utente non root con privilegi sudo.

    Un nome di dominio completo (FQDN) come strapi.example.com.

    Assicurati che tutto sia aggiornato.

    $ sudo dnf update
    

    Pochi pacchetti di cui il tuo sistema ha bisogno.

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

    Alcuni di questi pacchetti potrebbero essere già installati sul tuo sistema.

Passaggio 1: configurare il firewall

Il primo passo è configurare il firewall. Rocky Linux utilizza Firewalld Firewall. Controlla lo stato del firewall.

$ sudo firewall-cmd --state
running

Il firewall funziona con zone diverse e la zona pubblica è quella predefinita che utilizzeremo. Elenca tutti i servizi e le porte attive sul firewall.

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

Dovrebbe mostrare il seguente output.

cockpit dhcpv6-client ssh

Strapi ha bisogno delle porte HTTP e HTTPS per funzionare. Aprili.

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

Ricaricare il firewall per applicare le modifiche.

$ sudo firewall-cmd --reload

Elenca nuovamente tutti i servizi.

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

Dovresti ottenere il seguente output.

cockpit dhcpv6-client http https ssh

Passaggio 2: installare e configurare PostgreSQL

Strapi funziona con PostgreSQL 11 e versioni successive. Rocky Linux 9 viene fornito con PostgreSQL 13 per impostazione predefinita. Utilizzeremo PostgreSQL 15 per il nostro tutorial.

Esegui il comando seguente per aggiungere la chiave GPG PostgreSQL.

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

Installa il file RPM del repository PostgreSQL.

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

Disabilita il modulo PostgreSQL integrato.

$ sudo dnf -qy module disable postgresql

Ora puoi installare PostgreSQL utilizzando il comando seguente.

$ sudo dnf install -y postgresql15-server

Inizializzare il database.

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

Abilita il servizio PostgreSQL.

$ sudo systemctl enable postgresql-15

Avvia il servizio PostgreSQL.

$ sudo systemctl start postgresql-15

Controlla lo stato del servizio 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 "

Avvia la shell PostgreSQL.

$ sudo -i -u postgres psql

Creare il database Strapi.

postgres=# CREATE DATABASE strapidb;

Crea l'utente Strapi e scegli una password complessa.

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

Cambiare il proprietario del database nell'utente Strapi.

postgres-# ALTER DATABASE strapidb OWNER TO strapiuser;

Esci dalla conchiglia.

postgres-# \q

Verifica che le tue credenziali funzionino.

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

strapidb=>

Esci dalla shell digitando \q.

Passaggio 3: installare Node.js

Rocky Linux 9 viene fornito con Node v16 che è obsoleto. Installeremo l'ultima versione LTS di Node che è v18 al momento della stesura di questo tutorial.

Prendi il programma di installazione di Node v18 da Nodesource.

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

Installa Node.js.

$ sudo dnf install nodejs -y

Verifica la versione di Node.js.

$ node -v
v18.13.0

Passaggio 4: installare Strapi

Eseguire il comando seguente per installare Strapi.

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

Inserisci y per procedere con l'installazione. Successivamente, ti verrà chiesto di scegliere il tipo di installazione. Scegli Personalizzato per procedere e rispondere alle domande come segue.

? 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

A seconda delle tue esigenze, puoi scegliere Typescript o JavaScript come linguaggio per Strapi.

Una volta completata l'installazione, sei pronto per realizzare il tuo progetto Strapi.

Passa alla directory del progetto.

$ cd howtoforge-project

Esegui il comando seguente per creare il progetto, inclusa l'interfaccia utente di amministrazione Strapi.

$ NODE_ENV=production npm run build

Avviare il server Strapi utilizzando il comando seguente.

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

La tua applicazione dovrebbe essere visibile sull'URL http://:1337. Ma prima apri la porta nel firewall.

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

Una volta aperto l'URL, dovresti visualizzare la seguente schermata.

Premi Ctrl + C nel terminale per arrestare il server. Dovresti eliminare la regola del firewall perché non ne avremo bisogno.

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

Passaggio 5: installare e configurare PM2

Invece di avviare manualmente il server, possiamo utilizzare PM2 (Process Manager 2) per gestire il processo e creare un servizio systemd per lo stesso.

Passa alla directory home.

$ cd ~

Installa PM2.

$ sudo npm install pm2@latest -g

Crea e apri il file di configurazione PM2 per la modifica.

$ sudo nano ecosystem.config.js

Incolla il seguente contenuto nel file. Assicurati di inserire il nome della directory corretto insieme alle credenziali 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',
      },
    },
  ],
};

Salva il file premendo Ctrl + X e inserendo Y quando richiesto una volta terminato.

Esegui la tua istanza Strapi in background utilizzando PM2.

$ pm2 start ecosystem.config.js

Otterrai il seguente output.

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

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


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

Le applicazioni in esecuzione su PM2 si riavviano automaticamente se si bloccano o vengono interrotte.

Crea uno script systemd di avvio utilizzando il comando seguente.

$ pm2 startup

Otterrai il seguente output.

[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 il comando dall'output precedente ed eseguilo.

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

Otterrai il seguente output.

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

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


                          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

Salvare l'elenco dei processi PM2.

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

Il tuo servizio Strapi ora è in esecuzione in background in modalità produzione.

Passaggio 6: installare Nginx

Rocky Linux 9 viene fornito con una versione precedente di Nginx. È necessario scaricare il repository ufficiale Nginx per installare la versione più recente.

Crea e apri il file /etc/yum.repos.d/nginx.repo per creare il repository Nginx ufficiale.

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

Incolla al suo interno il seguente codice.

[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

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Installa il server Nginx.

$ sudo dnf install -y nginx

Verificare l'installazione.

$ nginx -v
nginx version: nginx/1.22.1

Abilita e avvia il server Nginx.

$ sudo systemctl enable nginx --now

Controlla lo stato del server.

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

Passaggio 7: installare SSL

Dobbiamo installare Certbot per generare il certificato SSL.

Per questo utilizzeremo il programma di installazione del pacchetto Snapd. Poiché Rocky Linux non viene fornito con esso, installa il programma di installazione Snapd. Per funzionare richiede l'archivio EPEL.

$ sudo dnf install -y epel-release

Installa Snapd.

$ sudo dnf install -y snapd

Abilita e avvia il servizio Snap.

$ sudo systemctl enable snapd --now

Installa il pacchetto Snap core e assicurati che la tua versione di Snapd sia aggiornata.

$ sudo snap install core && sudo snap refresh core

Crea i collegamenti necessari affinché Snapd funzioni.

$ 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

Emettere il comando seguente per installare Certbot.

$ sudo snap install --classic certbot

Utilizzare il comando seguente per garantire che il comando Certbot possa essere eseguito creando un collegamento simbolico alla directory /usr/bin.

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

Verificare l'installazione.

$ certbot --version
certbot 2.2.0

Esegui il comando seguente per generare un certificato SSL.

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

Il comando precedente scaricherà un certificato nella directory /etc/letsencrypt/live/strapi.example.com sul tuo server.

Genera un certificato gruppo Diffie-Hellman.

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

Per verificare se il rinnovo SSL funziona correttamente, esegui un test del processo.

$ sudo certbot renew --dry-run

Se non vedi errori, è tutto a posto. Il tuo certificato si rinnoverà automaticamente.

Passaggio 8: configurare Nginx

Apri il file /etc/nginx/nginx.conf per modificarlo.

$ sudo nano /etc/nginx/nginx.conf

Aggiungi la seguente riga prima della riga include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Crea e apri il file /etc/nginx/conf.d/strapi.conf per la modifica.

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

Incolla al suo interno il seguente codice.

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

Salva il file premendo Ctrl + X e inserendo Y quando richiesto una volta terminato.

Verifica la sintassi del file di configurazione 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

Riavvia il servizio Nginx.

$ sudo systemctl restart nginx

Ora puoi accedere a Strapi CMS tramite l'URL https://strapi.example.com. Verrà visualizzata la pagina seguente che mostra che Strapi è in esecuzione in modalità produzione.

Visita l'URL https://strapi.example.com/admin per creare un utente amministratore.

Inserisci i tuoi dettagli di amministratore e fai clic sul pulsante Iniziamo per procedere alla schermata del dashboard dell'amministratore.

Da qui in poi puoi iniziare a creare contenuti su Strapi.

Passaggio 9: aggiorna Strapi

Il primo passo per aggiornare Strapi è arrestare il server.

$ cd ~
$ pm2 stop ecosystem.config.js

Passa alla directory del progetto e apri il file package.json per la modifica.

$ cd howtoforge-project
$ nano package.json

Aggiorna tutti i numeri di versione del pacchetto Strapi all'ultima versione stabile di Strapi. È possibile ottenere l'ultima versione disponibile dalla pagina delle versioni GitHub di Strapi.

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

Qui devi cambiare 4.5.5 all'ultima versione stabile. Salva il file premendo Ctrl + X e inserendo Y quando richiesto una volta terminato.

Installa la versione aggiornata.

$ npm install

Ricostruisci il pannello di amministrazione.

$ NODE_ENV=production npm run build

Avviare nuovamente il server.

$ cd ~
$ pm2 start ecosystem.config.js

La tua installazione Strapi è ora aggiornata e funzionante.

Conclusione

Con questo si conclude il nostro tutorial sull'installazione di Strapi CMS su un server Rocky Linux 9 insieme a Nginx come server proxy inverso. Se avete domande, pubblicatele nei commenti qui sotto.

Articoli correlati: