• Tutorial
  • Instalação via Docker (NovoSGA 2.2.6 + Painel Web 2.1 + Triagem Web 2.1)

Olá a todos,
Irei compartilhar um passo a passo completo que fiz para Instalação do NovoSGA v2.2.6 com a compilação do Painel e Triagem Web nas versões 2.1, tudo rodando em Docker no Sistema Operacional Linux Debian 12.

Verifique atualizações do Sistema

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get clean && sudo apt dist-upgrade -y && sudo apt-get autoremove

Instale ferramentas básicas

sudo apt-get install net-tools wget git curl -y

Instale o Docker

sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Instalação e configuração do NovoSGA

Crie a pasta para o NovoSGA, Painel-Web e Triagem-Web

mkdir novosga-docker
mkdir novosga-docker/painel-web/
mkdir novosga-docker/triagem-web/
cd novosga-docker

Arquivo .env

Para a criação do envfile você precisará possuir algumas informações:

1. APP_SECRET

Necessita ser gerado de modo que seja uma string segura, aleatória e hexadecimal com 64 caracteres, para isto utilize o comando:
openssl rand -hex 32

Salve o código gerado, pois ele será utilizado para o APP_SECRET no .env

2. MERCURE_JWT_SECRET e MERCURE_PUBLISHER_JWT_KEY

2.1 Assim como no passo anterior a SECRET e KEY precisa ser gerado de modo que seja uma string segura, aleatória e hexadecimal com 64 caracteres, o comando para gerar é o mesmo, mas deve ser diferente do APP_SECRET, o código gerado será utilizado tanto para MERCURE_JWT_SECRET quanto para MERCURE_PUBLISHER_JWT_KEY (ambos utilizam a mesma chave).
openssl rand -hex 32

Salve o código gerado, pois ele será utilizado para MERCURE_JWT_SECRET e MERCURE_PUBLISHER_JWT_KEY no .env

3. MERCURE_JWT_TOKEN

3.1 Para gerar o TOKEN de validação, acesse o site: https://jwt.io/ e clique na opção "JWT ENCODER"
No campo HEADER preencha:

{
  "alg": "HS256",
  "typ": "JWT"
}

No Campo PAYLOAD preencha:

{
  "mercure": {
    "publish": ["*"]
  }
}

No Campo Sign JWT: Secret preencha com o código gerado para MERCURE_JWT_SECRET:

Copie e salve o código gerado, ele será utilizado no .env para MERCURE_JWT_TOKEN


Agora que você já gerou todas as informações necessárias, crie o arquivo ENV
nano .env

Copie e Cole o conteúdo abaixo e substitua as informações geradas nos passos anteriores e modifique as informações necessárias

DB_ROOT_PASSWORD=SuaSenhaROOTdoBancoDeDados123
DB_NAME=novosgaDB
DB_USER=novosga
DB_PASSWORD=SenhaDoUsuáriodoBanco
APP_ENV=prod
APP_SECRET=<cole_aqui_a_chave_aleatória_segura_criada_para:APP_SECRET>
MERCURE_URL=http://mercure:3000/.well-known/mercure
MERCURE_PUBLIC_URL=http://<SEU_HOST_ou_IP_do_SERVIDOR>:3000/.well-known/mercure
MERCURE_JWT_TOKEN=<insira_o_TOKEN_gerado_no_JWT.IO>
MERCURE_JWT_SECRET=<cole_aqui_o_SECRET/KEY_gerado>
MERCURE_PUBLISHER_JWT_KEY=<cole_aqui_o_SECRET/KEY_gerado>

** IMPORTANTE: O arquivo env não pode conter espaços ao final de cada linha, bem como não pode conter <enter> entre as linhas**

Para salvar e sair do nano utilize:

CTRL + O
CRTL + X

Próximo arquivo será o docker-compose.yml

Crie o arquivo

nano docker-compose.yml

Cole o conteúdo abaixo no arquivo, você não precisará alterar nada nele, todas as variáveis serão preenchidas com base no arquivo .env criado anteriormente.

services:
  db:
    image: mariadb:10.6
    container_name: novosga-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      TZ: 'America/Sao_Paulo'
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - novosga_net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  mercure:
    image: novosga/mercure:v0.11
    container_name: novosga-mercure
    restart: always
    ports:
      - "3000:3000"
    networks:
      - novosga_net
    environment:
      SERVER_NAME: ":3000"
      MERCURE_JWT_SECRET: ${MERCURE_JWT_SECRET}
      MERCURE_PUBLISHER_JWT_KEY: ${MERCURE_JWT_SECRET}
      MERCURE_EXTRA_DIRECTIVES: "allow_anonymous 1; anonymous 1; cors_origins *"
      TZ: 'America/Sao_Paulo'

  novosga:
    image: novosga/novosga:2.2.6
    restart: always
    container_name: novosga
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
      mercure:
        condition: service_started
    ports:
      - "80:80"
    networks:
      - novosga_net
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./painel-web:/var/www/html/public/painel
      - ./triagem-web:/var/www/html/public/triagem
    environment:
      APP_ENV: ${APP_ENV}
      APP_SECRET: ${APP_SECRET}
      DATABASE_URL: "mysql://${DB_USER}:${DB_PASSWORD}@db:3306/${DB_NAME}?charset=utf8mb4&serverVersion=10.6"
      TZ: 'America/Sao_Paulo'
      APP_LANGUAGE: 'pt_BR'
      MERCURE_PUBLISH_URL: ${MERCURE_URL}
      MERCURE_PUBLIC_URL: ${MERCURE_PUBLIC_URL}
      MERCURE_JWT_TOKEN: ${MERCURE_JWT_TOKEN}
      MERCURE_JWT_SECRET: ${MERCURE_JWT_SECRET}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/login"]
      interval: 30s
      timeout: 5s
      retries: 5

volumes:
  db_data:

networks:
  novosga_net:
    driver: bridge

Para salvar e sair do nano utilize:

CTRL + O
CRTL + X

Por último crie o arquivo default.conf ele será responsável por configurar as rotas internas do sistema no Nginx

nano default.conf

Copie e Cole o conteúdo abaixo, da mesma forma, não será necessário alterar nada no arquivo.

  server {
    listen [::]:80 default_server;
    listen 80 default_server;
    server_name _;
    client_max_body_size 100M;
    client_body_buffer_size 128k;

    sendfile off;
    tcp_nodelay on;
    absolute_redirect off;

    root /var/www/html/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }
	
    # Mapeamento para Painel-Web
    location /painel {
	alias /var/www/html/public/painel/;
	index index.html;
	try_files $uri $uri/ /index.html;
    }
	
    # Mapeamento para Triagem-Web
    location /triagem {
	alias /var/www/html/public/triagem/;
	index index.html;
	try_files $uri $uri/ /index.html;
    }

    # Pass the PHP scripts to PHP-FPM listening on php-fpm.sock
    location ~ ^/index\.php(/|$) {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }

    # Set the cache-control headers on assets to cache for 5 days
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
        expires 5d;
    }

    # Deny access to . files, for security
    location ~ /\. {
        log_not_found off;
        deny all;
    }

    # Allow fpm ping and status from localhost
    location ~ ^/(fpm-status|fpm-ping)$ {
        access_log off;
        allow 127.0.0.1;
        deny all;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_pass unix:/run/php-fpm.sock;
    }
}

Para salvar e sair do nano utilize:

CTRL + O
CRTL + X

Instalar as dependências e ferramentas para Build do Painel Web e Triagem Web

sudo apt update
sudo apt install -y build-essential wget curl git zlib1g-dev libssl-dev \
    libbz2-dev libreadline-dev libsqlite3-dev libncurses5-dev libffi-dev xz-utils
cd /tmp
wget https://nodejs.org/dist/v18.19.0/node-v18.19.0-linux-x64.tar.xz
tar -xf node-v18.19.0-linux-x64.tar.xz
sudo mv node-v18.19.0-linux-x64 /opt/nodejs
export PATH=/opt/nodejs/bin:$PATH
source ~/.bashrc
cd /tmp
wget https://nodejs.org/dist/v12.22.12/node-v12.22.12-linux-x64.tar.xz
tar -xf node-v12.22.12-linux-x64.tar.xz
sudo mv node-v12.22.12-linux-x64 /opt/nodejs12
export PATH=/opt/nodejs12/bin:$PATH
sudo rm -rf /opt/nodejs/lib/node_modules/npm
sudo ln -sf /opt/nodejs/bin/node /usr/bin/node
cd /tmp
curl -L https://registry.npmjs.org/npm/-/npm-9.2.0.tgz -o npm-9.2.0.tgz
tar -xzf npm-9.2.0.tgz
cd package
sudo /opt/nodejs/bin/node bin/npm-cli.js install -g .
cd /tmp
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar -xzf Python-2.7.18.tgz
cd Python-2.7.18
./configure --prefix=/opt/python2.7
make -j$(nproc)
sudo make install
sudo ln -sf /opt/python2.7/bin/python2 /usr/local/bin/python
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo /opt/python2.7/bin/python2 get-pip.py

PAINEL-APP v2.1

Clone o diretório oficial do Painel-App

git clone --branch v2.1 https://github.com/novosga/panel-app.git
cd panel-app
npm ci
npm run build:web

Mova ou Copie os arquivos gerados no build:web, (eles estão na pasta dist/web) para a pasta novosga-docker/painel-web/


TRIAGE-APP v2.1

Clone o diretório oficial do Triage-App

git clone --branch v2.1 https://github.com/novosga/triage-app.git
cd triage-app
npm install -g yarn
rm -rf node_modules package-lock.json yarn.lock
yarn install
yarn build:web

Mova ou Copie os arquivos gerados no build:web, (eles estão na pasta dist/web) para a pasta novosga-docker/triagem-web/


Para levantar os Conteiners via docker execute

sudo docker compose up -d

Criar dados iniciais do Sistema

sudo docker ps
sudo docker exec -it novosga sh

Execute dentro do contêiner "novosga"

php bin/console doctrine:migrations:migrate --no-interaction
php bin/console novosga:install
exit

** Durante o passo php bin/console novosga:install, você irá criar os dados de acesso inicial do sistema, após isto você poderá criar/alterar estas configurações pela interface do NovoSGA**

Isto irá levantar o NovoSGA na versão atual 2.2.6, Triagem Web na versão 2.1 e Painel Web na versão 2.1 acessíveis em:

NovoSGA:      http://<seu_host> ou http://<ip_servidor>
Painel:       http://<seu_host>/painel ou http://<ip_servidor>/painel
Triagem:      http://<seu_host>/triagem ou http://<ip_servidor>/triagem

Pronto, agora com todos os sistemas levantados, é possível fazer as demais configurações necessarias para a configuração do Triagem e do Painel.

Com estes passos eu consegui instalar e configurar corretamente o NovoSGA 2.2.6, e ainda realizar os Builds do Painel e Triagem na versão 2.1, sem a necessidade de modificações nos fontes clonados.

No meu ambiente a única "modificação" foi na questão da persistência das configurações do Painel e Triagem, sendo injetados através de um .js e um .json, que se for de interesse posso descrever neste modelo de passo-a-passo.

Quanto à modificações de interface, integração com outros Painéis/Triagem ou mesmo os builds de executáveis (Windows), ou mesmo a implantação em ambiente Windows, não saberei como proceder.

Espero ter colaborado de alguma forma, um abraço
Oberdan Gomes

14 dias depois