Essa é uma revisão anterior do documento!


Sistemas operacionais testados: Ubuntu 16.04 e 18.04

Requisitos de hardware: Processador quad core (i5 ou superior). 8GB RAM. 50GB HDD disponíveis.

Requisito de rede: IP real público (Será necessário para os aplicativos FlashApp acessarem o roteador de qualquer rede)

Requisitos de Domínio: Criar um mapeamento de domínio para o IP escolhido. (Exemplo: flashman.provedor.com.br)


  1. Atualizar repositórios através do comando
    sudo apt-get update
  2. IMPORTANTE! Instalar e configurar o NTP
    1. Exemplo para Ubuntu 16.04:
      sudo timedatectl set-timezone America/Sao_Paulo
      sudo timedatectl set-ntp on
    2. Aguardar um minuto e verificar status de sincronização através do comando
      timedatectl
  3. Instalar o Nginx (versão 1.10.3 ou superior)
    1. Insira o seguinte comando:
      sudo apt-get install nginx
  4. Instalar o MongoDB (versão 3.2 ou superior)
    1. Para instalar utilizando o Ubuntu
      1. Insira os seguintes comandos para Ubuntu 18.04:
        sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
        echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
        sudo apt-get update
        sudo apt-get install -y mongodb-org
      2. Insira os seguintes comandos para Ubuntu 16.04:
        sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
        echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
        sudo apt-get update
        sudo apt-get install -y mongodb-org
    2. Inicie o serviço do MongoDB através dos comandos:
      sudo systemctl enable mongod
      sudo systemctl start mongod
    3. Para instalar em sistemas operacionais diferentes do Ubuntu, veja a documentação em https://docs.mongodb.com/manual/installation/
    4. Atenção! Não alterar a porta padrão 27017
  5. Instalar NodeJS (versão 8.17.0)
    1. Para instalar utilizando o Ubuntu
      1. Insira os seguintes comandos:
        curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
        sudo apt-get install -y nodejs
      2. Para instalar em sistemas operacionais diferentes do Ubuntu, veja a documentação em https://nodejs.org/en/download/package-manager/
  6. Instalar pacotes essenciais do Ubuntu:
    sudo apt-get install build-essential
  7. Instalar o PM2 através do comando:
    sudo npm install pm2 -g
  8. Instalar o extrator de .ZIP através do comando:
    sudo apt-get install unzip
  9. Extraia o arquivo .ZIP do pacote contendo o Flashman no diretório de sua preferência. Como exemplo eis o comando:
    mkdir ./flashman
    unzip flashman.zip -d ./flashman/
  10. Atenção! O arquivo .ZIP pode ser baixado através da conta da Anlix através da opção “Ferramentas”
  11. No diretório extraído do Flashman, execute o seguinte comando:
    npm install
  12. Configure o Nginx para receber e autorizar a comunicação HTTPS com o Flashman através do seguinte trecho de código de exemplo:
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
    
        server_name meuflashmandeexemplo.dominio.com;
    
        location / {
            proxy_redirect http:// https://;
    
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
    
            proxy_pass http://localhost:8000;
            proxy_http_version 1.1;
    
            proxy_cache_bypass $http_upgrade;
    
        }
    
        client_max_body_size 32M;
    }
    1. O trecho de código acima pode ser configurado a partir do comando
      nano /etc/nginx/sites-available/default
    2. Substitua a variável “server_name” pelo domínio completo de seu servidor
    3. Recarregue o serviço Nginx através do comando:
      sudo systemctl reload nginx
  13. Use o gerador de certificados gratuitos Certbot para gerar o certificado HTTPS para o Flashman. Siga os passos:
    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install python-certbot-nginx
    
    sudo certbot --nginx
    1. Siga os passos informados pelo comando certbot –nginx
    2. Mais informações sobre o certbot em: https://certbot.eff.org/
  14. Após gerar o certificado no passo anterior, insira uma cópia diretamente no diretório raiz do Flashman através dos comandos:
    cp /etc/letsencrypt/live/<<meuflashmandeexemplo.dominio.com>>/fullchain.pem <<caminho completo>>/flashman/certs/cert.pem
    cp /etc/letsencrypt/live/<<meuflashmandeexemplo.dominio.com>>/privkey.pem <<caminho completo>>/flashman/certs/key.pem
    chown <<usuário>> <<caminho completo>>/flashman/certs/cert.pem <<caminho completo>>/flashman/certs/key.pem
    chmod 400 <<caminho completo>>/flashman/certs/cert.pem <<caminho completo>>/flashman/certs/key.pem
    1. Substitua o valor «meuflashmandeexemplo.dominio.com» pelo domínio completo de seu servidor cujo o certificado foi gerado
    2. Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
    3. Substitua o «usuário» pelo usuário do sistema que irá executar o servidor do Flashman (exemplo: localuser)
  15. Insira a seguinte linha no final do arquivo /etc/letsencrypt/renewal/meuflashmandeexemplo.dominio.com.conf :
    renew_hook = <<caminho completo>>/flashman/scripts/cert-deploy-hook.sh <<caminho completo>>/flashman/certs meuflashmandeexemplo.dominio.com <<usuário>>
    1. Verifique se o arquivo «caminho completo»/flashman/scripts/cert-deploy-hook.sh possui permissões de execução
    2. Substitua o valor “meuflashmandeexemplo.dominio.com” pelo domínio completo de seu servidor cujo o certificado foi gerado
    3. Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
    4. Substitua o «usuário» pelo usuário do sistema que irá executar o servidor do Flashman (exemplo: localuser)
  16. Abra o arquivo environment.config.json e adicione a variável FLM_CERT_MQTT_DIR com o caminho para o certificado certbot recém gerado. Exemplo:
    {
      "apps": [{
          "name": "flashman",
          "script": "bin/www",
          "log_date_format": "YYYY-MM-DD HH:mm Z",
          "autorestart": true,
          "env": {
            "production": true,
            "TZ": "America/Sao_Paulo",
            "FLM_IMG_RELEASE_DIR": "./public/firmwares/",
            "FLM_ALLOW_DEV_UPDATE_REST_DATA": false,
            "FLM_MONGODB_HOST": "localhost",
            "FLM_ADM_USER": "admin",
            "FLM_ADM_PASS": "flashman",
            "FLM_CERT_MQTT_DIR": "<<caminho completo>>/flashman/certs"
          },
          "error_file": "/dev/stderr",
          "out_file": "/dev/stdout",
          "exec_mode": "cluster"
        }]
    }
    1. Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
  17. No diretório principal do Flashman, inicie o serviço através do comando
    pm2 start environment.config.json
  18. Verifique se o serviço está em execução através do comando:
    pm2 status
  19. Deixe o serviço do Flashman auto renicializável através dos comandos executados no diretório principal do Flashman:
    pm2 startup
    pm2 save

Opcional: Backup dos dados na nuvem da Anlix

Atenção! Entre em contato com a Anlix para obter os tokens de backup de dados na nuvem

O script de backup de dados do Flashman na nuvem da Anlix está localizado em:

<<caminho completo>>/flashman/scripts/backup-flashman-onpremise-db.sh

O script de recuperação de dados do Flashman na nuvem da Anlix está localizado em:

<<caminho completo>>/flashman/scripts/restore-flashman-onpremise-db.sh

Opcional: Replicação de instâncias do Flashman para escalabilidade do serviço

Atenção! Essa configuração deve ser feita com o acompanhamento da equipe técnica da Anlix. Necessário apenas em casos de alta carga de rede

- Instale o proxy HAProxy para balanceamento de requisições MQTTS

sudo apt-get install haproxy

- Instale o banco de dados em memória Redis

sudo apt-get install redis-server

- Habilite os serviços instalados

sudo systemctl enable haproxy
sudo systemctl enable redis-server

- Instale pelo menos dois diretórios adicionais com o flashman. Exemplo:

Atenção! O número de diretórios não deverá ser maior que o número de núcleos de processamento

mkdir ./flashman-2
unzip flashman.zip -d ./flashman-2/
mkdir ./flashman-3
unzip flashman.zip -d ./flashman-3/

- Atualize os diretórios adicionais criados. Exemplo:

cd ./flashman-2
git fetch
git reset --hard
git checkout <ULTIMA VERSAO DISPONIVEL>
npm install
cd ../flashman-3
git fetch
git reset --hard
git checkout <ULTIMA VERSAO DISPONIVEL>
npm install

- Aplique as seguintes configurações em cada arquivo enviroment.config.json presente em cada diretório criado

Atenção! Caso a chave não exista no arquivo, você poderá criá-la.

"name": <<nome do diretorio>>,
"FLM_IMG_RELEASE_DIR": "<<caminho completo>>/flashman/public/firmwares/",
"FLM_CERT_MQTT_DIR": "<<caminho completo>>/flashman/certs",
"FLM_WEB_PORT": <<porta>>,
"FLM_SCHEDULER_ACTIVE": false,
"FLM_DISABLE_AUTO_UPDATE": "true",
"FLM_USE_MQTT_PERSISTENCE": true

- Substitua o «nome do diretorio» pelo nome do diretório criado. Exemplo: flashman-2

- Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.

- Substitua o «porta» pelo valor 8000 + número do diretório flashman. Exemplo: 8002

- Edite os arquivos mqtts-port.json presentes em cada diretório flashman para um valor 10000 + número do diretório flashman

- Edite o arquivo de configuração do HAProxy para o seguinte formato. Lembre de alterar onde estiver marcado

global
  nbproc 4
  cpu-map  1 0
  cpu-map  2 1
  #ADICIONE MAIS CPUS AQUI CASO SEJA POSSIVEL
  #cpu-map  3 2
  #cpu-map  4 3
  # ulimit-n 500000
  maxconn 40000
  # maxpipes 40000
  # tune.maxaccept 8000
  tune.ssl.cachesize 1000000
  tune.ssl.default-dh-param 2048
  log /dev/log local0 info
  chroot /var/lib/haproxy
  stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
  user haproxy
  group haproxy
  daemon

defaults
  log global
  mode tcp
  option dontlognull
  option redispatch
  maxconn 40000
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

listen mqtt
  bind *:<**porta MQTTS designada para o provedor**>
  mode tcp
  # Use this to avoid the connection loss when client subscribed for a topic and its idle for sometime
  option clitcpka # For TCP keep-alive
  timeout client 3h # By default TCP keep-alive interval is 2hours in OS kernel, 'cat /proc/sys/net/ipv4/tcp_keepalive_time'
  timeout server 3h # By default TCP keep-alive interval is 2hours in OS kernel
  option tcplog
  balance leastconn
  server flashman-2 localhost:<**porta criada no passo anterior**> check
  server flashman-3 localhost:<**porta criada no passo anterior**> check

- Edite o arquivo de configuração Nginx para balancear a carga HTTPS. Edite onde estiver marcado conforme abaixo.

upstream backend {
    ip_hash;
    server localhost:<** porta web configurada ao editar o arquivo enviroment.config.json **>;
    server localhost:<** porta web configurada ao editar o arquivo enviroment.config.json **>;
}

# INSIRA O BLOCO ABAIXO DENTRO DA CHAVE SERVER

location ~* ^/deviceinfo/syn/ {
   proxy_redirect http:// https://;

   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-NginX-Proxy true;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection 'upgrade';
   proxy_set_header Host $host;

   proxy_pass http://backend;
   proxy_http_version 1.1;

   proxy_cache_bypass $http_upgrade;
}

- Edite o arquivo environment.config.json no diretório flashman principal, alterando as seguintes chaves:

"FLM_CERT_MQTT_DIR": "<<caminho completo>>/flashman/certs",
"FLM_SCHEDULER_ACTIVE": true,
"FLM_DISABLE_AUTO_UPDATE": "true",
"FLM_USE_MQTT_PERSISTENCE": true

- Edite o arquivo mqtts-port.json para um porta alta diferente do porta MQTTS designada para o provedor