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