Como instalar o Strapi CMS no Rocky Linux 9
Strapi é um sistema de gerenciamento de conteúdo (CMS) de código aberto e headless, construído com a linguagem de programação JavaScript. Como outros CMS sem cabeça, o Strapi não vem com um frontend pronto para uso. Ele usa uma API para seu frontend que permite construir o site usando frameworks populares como React e Next.js. Baseado em um sistema de plugins, Strapi é um CMS flexível cujo painel de administração e API são extensíveis - e cujas partes são personalizáveis para atender a qualquer caso de uso. Strapi também possui um sistema de usuário integrado para gerenciar detalhadamente o que os administradores e usuários finais têm acesso.
Neste tutorial, você aprenderá como instalar a versão comunitária do Strapi CMS em um servidor Rocky Linux 9 junto com o Nginx como servidor proxy reverso.
Pré-requisitos
Um servidor rodando Rocky Linux 9 com no mínimo 2 GB de RAM e 1 CPU Core.
Um usuário não root com privilégios sudo.
Um nome de domínio totalmente qualificado (FQDN) como strapi.example.com
.
Certifique-se de que tudo esteja atualizado.
$ sudo dnf update
Poucos pacotes que seu sistema precisa.
$ sudo dnf install wget curl nano unzip yum-utils -y
Alguns desses pacotes podem já estar instalados em seu sistema.
Passo 1 - Configurar Firewall
O primeiro passo é configurar o firewall. Rocky Linux usa Firewalld Firewall. Verifique o status do firewall.
$ sudo firewall-cmd --state
running
O firewall funciona com zonas diferentes, e a zona pública é a zona padrão que usaremos. Liste todos os serviços e portas ativos no firewall.
$ sudo firewall-cmd --permanent --list-services
Deve mostrar a seguinte saída.
cockpit dhcpv6-client ssh
Strapi precisa de portas HTTP e HTTPS para funcionar. Abri-los.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Recarregue o firewall para aplicar as alterações.
$ sudo firewall-cmd --reload
Liste todos os serviços novamente.
$ sudo firewall-cmd --permanent --list-services
Você deve obter a seguinte saída.
cockpit dhcpv6-client http https ssh
Passo 2 – Instalar e configurar o PostgreSQL
Strapi funciona com PostgreSQL 11 e superior. Rocky Linux 9 vem com PostgreSQL 13 por padrão. Usaremos o PostgreSQL 15 em nosso tutorial.
Execute o seguinte comando para adicionar a chave GPG do PostgreSQL.
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Instale o arquivo RPM do repositório PostgreSQL.
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Desative o módulo PostgreSQL integrado.
$ sudo dnf -qy module disable postgresql
Agora você pode instalar o PostgreSQL usando o comando abaixo.
$ sudo dnf install -y postgresql15-server
Inicialize o banco de dados.
$ sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
Habilite o serviço PostgreSQL.
$ sudo systemctl enable postgresql-15
Inicie o serviço PostgreSQL.
$ sudo systemctl start postgresql-15
Verifique o status do serviço 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 "
Inicie o shell do PostgreSQL.
$ sudo -i -u postgres psql
Crie o banco de dados Strapi.
postgres=# CREATE DATABASE strapidb;
Crie o usuário Strapi e escolha uma senha forte.
postgres-# CREATE USER strapiuser WITH PASSWORD 'Your_Password';
Mude o proprietário do banco de dados para o usuário Strapi.
postgres-# ALTER DATABASE strapidb OWNER TO strapiuser;
Saia do shell.
postgres-# \q
Verifique se suas credenciais funcionam.
$ psql --username strapiuser --password --host localhost strapidb
Password:
psql (15.1)
Type "help" for help.
strapidb=>
Saia do shell digitando \q
.
Etapa 3 – Instale o Node.js
Rocky Linux 9 vem com Node v16, que está desatualizado. Instalaremos a versão LTS mais recente do Node, que é v18 no momento em que este tutorial foi escrito.
Obtenha o instalador do Node v18 em Nodesource.
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
Instale o Node.js.
$ sudo dnf install nodejs -y
Verifique a versão do Node.js.
$ node -v
v18.13.0
Passo 4 - Instale o Strapi
Execute o seguinte comando para instalar o Strapi.
$ npx create-strapi-app@latest howtoforge-project
Need to install the following packages:
[email
Ok to proceed? (y) y
Digite y
para prosseguir com a instalação. A seguir, você será solicitado a escolher o tipo de instalação. Escolha Personalizado para prosseguir e responder às perguntas da seguinte maneira.
? 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
Dependendo de seus requisitos, você pode escolher Typescript ou JavaScript como linguagem para Strapi.
Assim que a instalação for concluída, você estará pronto para construir seu projeto Strapi.
Mude para o diretório do projeto.
$ cd howtoforge-project
Execute o seguinte comando para construir o projeto, incluindo a interface de administração do Strapi.
$ NODE_ENV=production npm run build
Inicie o servidor Strapi usando o seguinte comando.
$ node ~/howtoforge-project/node_modules/.bin/strapi start
Seu aplicativo deve estar visível na URL http://
. Mas primeiro, abra a porta no firewall.
$ sudo firewall-cmd --permanent --add-port=1337/tcp
$ sudo firewall-cmd --reload
Depois de abrir o URL, você deverá obter a seguinte tela.
Pressione Ctrl + C no terminal para parar o servidor. Você deve excluir a regra do firewall porque não precisaremos dela.
$ sudo firewall-cmd --permanent --remove-port=1337/tcp
$ sudo firewall-cmd --reload
Passo 5 - Instalar e configurar PM2
Em vez de iniciar o servidor manualmente, podemos usar PM2 (Process Manager 2) para gerenciar o processo e criar um serviço systemd para o mesmo.
Mude para o diretório inicial.
$ cd ~
Instale PM2.
$ sudo npm install pm2@latest -g
Crie e abra o arquivo de configuração PM2 para edição.
$ sudo nano ecosystem.config.js
Cole o seguinte conteúdo no arquivo. Certifique-se de inserir o nome do diretório correto junto com as credenciais do 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',
},
},
],
};
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar.
Execute sua instância do Strapi em segundo plano usando PM2.
$ pm2 start ecosystem.config.js
Você obterá a seguinte saída.
-------------
__/""""\____/"\____________/"\____/"""_____
_\/"/////////"_\/""________/""__/"///////"___
_\/"_______\/"_\/"//"____/"//"_\///______\//"__
_\/""""\/__\/"\///"/"/_\/"___________/"/___
_\/"/////////____\/"__\///"/___\/"________/"//_____
_\/"_____________\/"____\///_____\/"_____/"//________
_\/"_____________\/"_____________\/"___/"/___________
_\/"_____________\/"_____________\/"__/"""""_
_\///______________\///______________\///__\///////////////__
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 ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Os aplicativos executados no PM2 são reiniciados automaticamente se travarem ou forem mortos.
Crie um script systemd de inicialização usando o seguinte comando.
$ pm2 startup
Você obterá a seguinte saída.
[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
Copie o comando da saída acima e execute-o.
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot
Você obterá a seguinte saída.
-------------
__/""""\____/"\____________/"\____/"""_____
_\/"/////////"_\/""________/""__/"///////"___
_\/"_______\/"_\/"//"____/"//"_\///______\//"__
_\/""""\/__\/"\///"/"/_\/"___________/"/___
_\/"/////////____\/"__\///"/___\/"________/"//_____
_\/"_____________\/"____\///_____\/"_____/"//________
_\/"_____________\/"_____________\/"___/"/___________
_\/"_____________\/"_____________\/"__/"""""_
_\///______________\///______________\///__\///////////////__
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
Salve a lista de processos PM2.
$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/navjot/.pm2/dump.pm2
Seu serviço Strapi agora está sendo executado em segundo plano no modo de produção.
Etapa 6 - Instale o Nginx
Rocky Linux 9 vem com uma versão mais antiga do Nginx. Você precisa baixar o repositório oficial do Nginx para instalar a versão mais recente.
Crie e abra o arquivo /etc/yum.repos.d/nginx.repo
para criar o repositório Nginx oficial.
$ sudo nano /etc/yum.repos.d/nginx.repo
Cole o seguinte código nele.
[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
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Instale o servidor Nginx.
$ sudo dnf install -y nginx
Verifique a instalação.
$ nginx -v
nginx version: nginx/1.22.1
Habilite e inicie o servidor Nginx.
$ sudo systemctl enable nginx --now
Verifique o status do 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"
Passo 7 – Instalar SSL
Precisamos instalar o Certbot para gerar o certificado SSL.
Usaremos o instalador do pacote Snapd para isso. Como o Rocky Linux não vem com ele, instale o instalador Snapd. Requer que o repositório EPEL funcione.
$ sudo dnf install -y epel-release
Instale o Snapd.
$ sudo dnf install -y snapd
Habilite e inicie o serviço Snap.
$ sudo systemctl enable snapd --now
Instale o pacote principal do Snap e certifique-se de que sua versão do Snapd esteja atualizada.
$ sudo snap install core && sudo snap refresh core
Crie os links necessários para que o 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
Emita o seguinte comando para instalar o Certbot.
$ sudo snap install --classic certbot
Use o comando a seguir para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin
.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifique a instalação.
$ certbot --version
certbot 2.2.0
Execute o seguinte comando para gerar um certificado SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d strapi.example.com
O comando acima fará download de um certificado para o diretório /etc/letsencrypt/live/strapi.example.com
em seu servidor.
Gere um certificado do grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Para verificar se a renovação SSL está funcionando bem, faça uma simulação do processo.
$ sudo certbot renew --dry-run
Se você não encontrar erros, está tudo pronto. Seu certificado será renovado automaticamente.
Etapa 8 – Configurar o Nginx
Abra o arquivo /etc/nginx/nginx.conf
para edição.
$ sudo nano /etc/nginx/nginx.conf
Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;
.
server_names_hash_bucket_size 64;
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Crie e abra o arquivo /etc/nginx/conf.d/strapi.conf
para edição.
$ sudo nano /etc/nginx/conf.d/strapi.conf
Cole o seguinte código nele.
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;
}
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar.
Verifique a sintaxe do arquivo de configuração 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
Reinicie o serviço Nginx.
$ sudo systemctl restart nginx
Agora você pode acessar o Strapi CMS através da URL https://strapi.example.com
. Você verá a página a seguir que mostra que o Strapi está rodando em modo de produção.
Visite o URL https://strapi.example.com/admin
para criar um usuário administrador.
Preencha seus dados de administrador e clique no botão Vamos começar para prosseguir para a tela do painel do administrador.
A partir daqui, você pode começar a criar conteúdo no Strapi.
Passo 9 - Atualizar Strapi
O primeiro passo para atualizar o Strapi é parar o servidor.
$ cd ~
$ pm2 stop ecosystem.config.js
Mude para o diretório do projeto e abra o arquivo package.json
para edição.
$ cd howtoforge-project
$ nano package.json
Atualize todos os números de versão do pacote Strapi para a versão estável mais recente do Strapi. Você pode obter a versão mais recente disponível na página de lançamentos do GitHub do 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"
},
Aqui você precisa alterar 4.5.5
para a versão estável mais recente. Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar.
Instale a versão atualizada.
$ npm install
Reconstrua o painel de administração.
$ NODE_ENV=production npm run build
Inicie o servidor novamente.
$ cd ~
$ pm2 start ecosystem.config.js
Sua instalação do Strapi agora está atualizada e funcionando.
Conclusão
Isso conclui nosso tutorial sobre como instalar o Strapi CMS em um servidor Rocky Linux 9 junto com o Nginx como servidor proxy reverso. Se você tiver alguma dúvida, poste-a nos comentários abaixo.