DEV Community

Cover image for Instalação e configuração do Strapi com Amazon Linux 2023
Marcelo Albuquerque
Marcelo Albuquerque

Posted on

1

Instalação e configuração do Strapi com Amazon Linux 2023

Nunca havia utilizado o Strapi de forma efetiva anteriormente, apenas realizei pequenos testes para tentar entender sua lógica. A instalação no ambiente local não oferece nenhum "desafio" por assim dizer, basta seguir a documentação oficial e nenhum problema deve surgir.

A coisa começa a ganhar contornos complexos de fato, no ambiente de produção, que é o foco desta documentação que vos escrevo.

Como em produção trabalho constantemente com o ambiente da AWS, esta documentação é focada no Amazon Linux 2023, que podemos simplesmente considerá-la como uma distribuição Linux desenvolvida pela AWS, bem como a Amazon Linux 2. São sistemas desenvolvidos para se integrarem de forma otimizada a serviços da AWS. Porém, nada impede que possamos utilizar esta documentação em outros ambientes como o Ubuntu, basta seguir a mesma lógica.

E preciso dizer que uma das maiores motivações que tive para escrever esta documentação, foi justamente a falta de uma documentação oficial bem detalhada focada em ambientes de produção. Chega a ser curioso e acredito não ser algo exclusivo do Strapi, mas me estranha uma ferramenta tão popular falhar nesse aspecto. Devemos lembrar que o Strapi possuí uma solução gerenciada, porém, os valores podem afastar e até assustar a maioria dos interessados.

Preparação do ambiente

Usuário

Vamos começar falando sobre o usuário. Na Amazon Linux 2023, bem como, na Amazon Linux 2 o usuário padrão é o "ec2-user" e é justamente com esse usuário que realizaremos todas as configurações, não sendo necessário mudar para o "root" ou criar algum outro usuário.

Servidor Web

Aqui estamos utilizando o NGINX que pode ser facilmente instalado com o gerenciador de pacotes dnf :

sudo dnf install nginx
Enter fullscreen mode Exit fullscreen mode

Node.js

Vamos utilizar o Node.js que também pode ser facilmente instalado com o gerenciador de pacotes dnf :

sudo dnf install nodejs
Enter fullscreen mode Exit fullscreen mode

Estrutura de pastas

Tenho o costume de criar a estrutura de pastas para o NGINX em /var/www , porém, pode ser que você estruture em outro local. Caso queira utilizar a estrutura deste exemplo, basta seguir:

sudo mkdir /var/www
Enter fullscreen mode Exit fullscreen mode

Agora podemos navegar até a pasta www :

cd /var/www
Enter fullscreen mode Exit fullscreen mode

Vamos criar a pasta para nosso projeto:

sudo mkdir strapiapp.com.br
Enter fullscreen mode Exit fullscreen mode

A aplicação será executada pelo usuário atual, porém, como estamos trabalhando com os diretórios de sistema, utilizamos o comando sudo para criar as pastas necessárias. Portanto, devemos alterar o owner do diretório do projeto para que todas as execuções não necessitem do comando sudo .

sudo chown ec2-user:ec2-user strapiapp.com.br
Enter fullscreen mode Exit fullscreen mode

Também vamos definir permissões para o diretório do projeto:

sudo chmod 775 strapiapp.com.br
Enter fullscreen mode Exit fullscreen mode

E finalmente navegamos até o diretório do projeto:

cd strapiapp.com.br
Enter fullscreen mode Exit fullscreen mode

O resultado é a seguinte estrutura de diretórios: /var/www/strapiapp.com.br .

Instalação do Strapi

Vamos instalar a última versão do Strapi a partir do diretório atual:

npx create-strapi-app@latest .

## Observer que não estamos utilizando o comando sudo

# 'npx' executa o comando de um pacote npm
# 'create-strapi-app' é o pacote Strapi
# '@latest' indica que vamos instalar a última versão do Strapi
# '.' informo que desejo utilizar o diretório atual para a instalação sem a necessidade de criar um novo diretório e informar o nome do projeto
Enter fullscreen mode Exit fullscreen mode

Caso ainda não tenha o pacote create-strapi-app instalado, será informado que é necessário realizar sua instalação:

Need to install the following packages:
  create-strapi-app@4.10.2
Ok to proceed? (y)
Enter fullscreen mode Exit fullscreen mode

Basta confirmar e seguir.

Após o processo de instalação do pacote ser finalizada, necessitamos informar as configurações do nosso projeto.

Para este projeto estou trabalhando com um Banco de Dados MySQL configurado e instalado em outro host. A primeira questão é referente ao modo de configuração, e aqui seleciono o modo "Custom (manual settings)", pois pretendo configurar esse projeto manualmente.

? Choose your installation type (Use arrow keys)
  Quickstart (recommended)
❯ Custom (manual settings)

# A diferença entre esses modos é que no "Quickstart (recommended)" uma base de dados (SQLite) é criada localmente para facilitar a criação do projeto. Porém, estamos falando de configurar um projeto em Produção e essa configuração básica não atende nossas necessidades.
Enter fullscreen mode Exit fullscreen mode

Em seguida somos questionados sobre a nossa preferência de linguagem entre "Javascript" e "Typescript":

? Choose your preferred language
  JavaScript
❯ TypeScript

# Aqui estou selecionando Typescript por uma preferência estritamente pessoal, selecione a linguagem que lhe trouxer mais conforto.
Enter fullscreen mode Exit fullscreen mode

Agora somos questionados sobre qual banco de dados vamos utilizar:

? Choose your default database client
  sqlite
  postgres
❯ mysql

# Como informei anteriormente, já possuo um cliente MySQL previamente configurado em outro host, então simplesmente seleciono a opção "mysql"
Enter fullscreen mode Exit fullscreen mode

Informe o nome do seu banco de dados utilizado para o projeto:

? Database name: strapi_app

# Previamente criei uma base de dados com o nome "strapi_app"
Enter fullscreen mode Exit fullscreen mode

Informe o host de seu banco de dados:

? Host: host.domain.us-east-1.rds.amazonaws.com

# Observe que o domínio "host.domain.us-east-1.rds.amazonaws.com" é apenas um exemplo, informe aqui o host do seu banco de dados.
Enter fullscreen mode Exit fullscreen mode

Informe a porta de comunicação:

? Port: (3306)

# A porta de comunicação padrão é a 3306, informe outro valor caso seja o seu caso.
Enter fullscreen mode Exit fullscreen mode

Agora informe o usuário de seu banco de dados:

? Username: admin

# Aqui informo que o nome do usuário é admin, informe o valor correto para seu caso.
Enter fullscreen mode Exit fullscreen mode

Senha de acesso ao banco de dados:

? Password: ******
Enter fullscreen mode Exit fullscreen mode

Informe se sua conexão de banco de dados possuí SSL:

? Enable SSL connection: (y/N) N

# No meu caso, não utilizo SSL para me comunicar com o bando de dados.
Enter fullscreen mode Exit fullscreen mode

O processo de instalação será iniciado:

Creating a project with custom database options.
Creating a new Strapi application at /var/www/strapiapp.com.br.
Creating files.
Enter fullscreen mode Exit fullscreen mode

Ao final do processo, caso tudo tenha transcorrido corretamente, receberemos a seguinte mensagem:

Dependencies installed successfully.
Initialized a git repository.


Your application was created at /var/www/strapiapp.com.br.

Available commands in your project:

  yarn develop
  Start Strapi in watch mode. (Changes in Strapi project files will trigger a server restart)

  npm run start
  Start Strapi without watch mode.

  npm run build
  Build Strapi admin panel.

  npm run strapi
  Display all available commands.

You can start by doing:

  cd /var/www/strapiapp.com.br
  npm run develop
Enter fullscreen mode Exit fullscreen mode

Trabalhando com o Strapi

Algo que também me incomodou em relação a documentação e tutoriais espalhados pela internet é a falta de uma análise mais técnica em relação ao Strapi, ou seja, como de fato ele funciona, como ele pode me ajudar em um ambiente local, e principalmente como ele deve ser instalado e configurado em um ambiente de produção.

Como o Strapi funciona?

De uma forma simples e direta, para que você consiga estruturar um projeto utilizando o Strapi, você sempre irá executá-lo no modo "develop" e após ter criado toda estrutura utilizando o "Content-Type Builder" é que vamos gerar o "Build" para enfim rodarmos em produção no modo "start".

Você não conseguirá criar nenhum "Content-Type" no modo "start", caso tente, receberá a seguinte mensagem:

The autoReload feature is required to use this plugin. Start your server with `strapi develop`
Enter fullscreen mode Exit fullscreen mode

Primeiros passos

Mesmo sem termos criado nenhum "Content-Type", podemos gerar o build inicial para termos acesso a área administrativa:

npm run build
Enter fullscreen mode Exit fullscreen mode

E enfim, executamos o comando para executar de fato o Strapi:

npm run start
Enter fullscreen mode Exit fullscreen mode

O Strapi será executado na porta 1337 .

Configurando Proxy Reverso no NGINX

Aqui vou deixar um exemplo simples de como configurar um proxy reverso com redirecionamento automático para https .

server {
    listen 80;
    listen [::]:80;

    if ($host = 'strapiapp.com.br') {
        return 301 https://strapiapp.com.br$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name strapiapp.com.br;
    root /var/www/strapiapp.com.br;

    ssl_certificate "/etc/letsencrypt/live/strapiapp.com.br/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/strapiapp.com.br/privkey.pem";

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:1337;

    }
}
Enter fullscreen mode Exit fullscreen mode

Criando um serviço utilizando Systemd

Para que a execução do Strapi seja automática, ela deve ser controlada pelo sistema e não pela interação com o terminal de comandos, portanto, vou detalhar os passos para que seja criado um serviço "Systemd" que irá persistir mesmo após a reinicialização do sistema.

Diretório que armazena os serviços "Systemd":

/lib/systemd/system
Enter fullscreen mode Exit fullscreen mode

Vamos navegar até esse diretório:

cd /lib/systemd/system
Enter fullscreen mode Exit fullscreen mode

Vamos criar um arquivo para armazenar as informações de execução desse serviço:

sudo nano strapi_strapiapp-com-br.service
Enter fullscreen mode Exit fullscreen mode

O arquivo deve conter as seguintes informações:

[Unit]
Description=Strapi systemd service for project: strapiapp-com-br
Documentation=https://docs.strapi.io/dev-docs/deployment

[Service]
Type=simple
WorkingDirectory=/var/www/strapiapp.com.br
User=ec2-user
Environment="NODE_ENV=production"
ExecStart=/usr/bin/npm run start
Environment=CI=true
Restart=always

[Install]
WantedBy=multi-user.target
Enter fullscreen mode Exit fullscreen mode

Agora podemos ativar esse serviço para que sua execução seja persistente:

sudo systemctl enable strapi_strapiapp-com-br
Enter fullscreen mode Exit fullscreen mode

E finalmente podemos excutar o Strapi através do "Systemd":

sudo systemctl start strapi_strapiapp-com-br
Enter fullscreen mode Exit fullscreen mode

Finalizado!

Esta é uma documentação técnica que abrange os principais pontos para executar o Strapi em um ambiente de produção. Espero que tenha sido útil pra você, qualquer coisa me chama para um bate-papo!

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay