Essa é uma revisão anterior do documento!
Instalação diretamente no servidor
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)
- Atualizar repositórios através do comando
sudo apt-get update
- IMPORTANTE! Instalar e configurar o NTP
- Exemplo para Ubuntu 16.04:
sudo timedatectl set-timezone America/Sao_Paulo sudo timedatectl set-ntp on
- Aguardar um minuto e verificar status de sincronização através do comando
timedatectl
- Instalar o Nginx (versão 1.10.3 ou superior)
- Insira o seguinte comando:
sudo apt-get install nginx
- Instalar o MongoDB (versão 3.2 ou superior)
- Para instalar utilizando o Ubuntu
- 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
- 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
- Inicie o serviço do MongoDB através dos comandos:
sudo systemctl enable mongod sudo systemctl start mongod
- Para instalar em sistemas operacionais diferentes do Ubuntu, veja a documentação em https://docs.mongodb.com/manual/installation/
- Atenção! Não alterar a porta padrão 27017
- Instalar NodeJS (versão 8.17.0)
- Para instalar utilizando o Ubuntu
- Insira os seguintes comandos:
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install -y nodejs
- Para instalar em sistemas operacionais diferentes do Ubuntu, veja a documentação em https://nodejs.org/en/download/package-manager/
- Instalar pacotes essenciais do Ubuntu:
sudo apt-get install build-essential
- Instalar o PM2 através do comando:
sudo npm install pm2 -g
- Instalar o extrator de .ZIP através do comando:
sudo apt-get install unzip
- 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/
- Atenção! O arquivo .ZIP pode ser baixado através da conta da Anlix através da opção “Ferramentas”
- No diretório extraído do Flashman, execute o seguinte comando:
npm install
- 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; }
- O trecho de código acima pode ser configurado a partir do comando
nano /etc/nginx/sites-available/default
- Substitua a variável “server_name” pelo domínio completo de seu servidor
- Recarregue o serviço Nginx através do comando:
sudo systemctl reload nginx
- 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
- Siga os passos informados pelo comando certbot –nginx
- Mais informações sobre o certbot em: https://certbot.eff.org/
- 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
- Substitua o valor «meuflashmandeexemplo.dominio.com» pelo domínio completo de seu servidor cujo o certificado foi gerado
- Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
- Substitua o «usuário» pelo usuário do sistema que irá executar o servidor do Flashman (exemplo: localuser)
- 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>>
- Verifique se o arquivo «caminho completo»/flashman/scripts/cert-deploy-hook.sh possui permissões de execução
- Substitua o valor “meuflashmandeexemplo.dominio.com” pelo domínio completo de seu servidor cujo o certificado foi gerado
- Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
- Substitua o «usuário» pelo usuário do sistema que irá executar o servidor do Flashman (exemplo: localuser)
- 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" }] }
- Substitua o «caminho completo» pelo caminho até o diretório raiz do Flashman.
- No diretório principal do Flashman, inicie o serviço através do comando
pm2 start environment.config.json
- Verifique se o serviço está em execução através do comando:
pm2 status
- 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