# Deploy servidor Linux
[ToC]
### Conectando-se ao servidor via ssh
==Um usuário com permissões sudo é necessária==
```
ssh nome_do_usuario@ip_do_servidor:porta
```
Após digitar o comando acima, o terminal irá requisitar a senha do usuário para completar a conexão. Lembrando que o input da senha não mostra nenhum caractere na tela.
```
Password:
```
## Instalando o Anaconda
O Anaconda é um gerenciador das versões de Python. Usando-o conseguimos diminuir a dificuldade da configuração de ambiente para rodar o código na máquina. Neste [link](https://docs.anaconda.com/anaconda/install/) é possível obter informações mais detalhadas de como instalar esta ferramenta.
### Passo 1: Instalando dependências do Anaconda
Alguns pacotes para linux são necessários para a instalação do Anaconda. Rode o script abaixo.
```bash
$ sudo apt install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
```
### Passo 2: Fazendo o download do Anaconda
Faça o download do instalador rodando o comando abaixo.
> Nota: Este comando irá fazer o download do arquivo no diretório que ele for rodado
```bash
$ wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
```
### Passo 3: Verifique a integridade do arquivo
Para verificar a integridade do arquivo baixado pelo comando acima, rode:
```
$ sha256sum ./Anaconda3-2020.02-Linux-x86_64.sh
```
O terminal irá imprimir um texto na tela que deve-se parecer com este:
```
2b9f088b2022edb474915d9f69a803d6449d5fdb4c303041f60ac4aefcc208bb Anaconda3-2020.02-Linux-x86_64.sh
```
### Passo 4: Rodando o script de instalação
```bash
$ bash ./Anaconda3-2020.02-Linux-x86_64.sh
```
O script imprimirá algo deste tipo na tela:
```
Welcome to Anaconda3 2020.02
In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
```
Pressione `ENTER` para continuar. Para fazer o scroll na licensa, aparte `ENTER` repetidas vezes até que apareça algo similar a isso:
```
Do you approve the license terms? [yes|no]
```
Digite `yes` e aperte `ENTER`. Em seguida, ele requisitará a localidade que você deseja instalar a ferramenta.
```
Anaconda3 will now be installed into this location:
/home/linuxize/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
```
Apenas aperte `ENTER` para confirmar a localização padrão. A instalação pode levar um tempo e quando finalizado, irá perguntar se vc deseja rodar o comando `conda init`.
```bash
Installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
```
Digite `yes` e pressione `ENTER`. Ele adicionará o comando `conda` no `PATH` do seu sistema. Agora rode o comando abaixo para conseguir usar o comando nesta mesma sessão:
```bash
source ~/.bashrc
```
Para verificar a instalação, digite `conda` no seu terminal. Após estes passos completos pode remover o script de instalação do Anaconda:
```
rm -rf ./Anaconda3-2020.02-Linux-x86_64.sh
```
## :page_with_curl: Fazendo o download do repositório
### Verificando instalação do `git`
Verifique se o `git` está instalado nesta distribuição.
```bash
$ git --version
```
Caso algo deste tipo seja imprimido na tela:
```bash
Output
git version 2.25.1
```
O git já está instalado. Caso não, rode os comandos abaixo em sequência:
```bash
sudo apt update
sudo apt install git
```
### Clonando o repositório
Vá até o gitlab e copie o link HTTPS do código.

Apões clicar no botão digite:
```
git clone
```
e logo em seguida aperte `CTRL+V` ou `CTRL+SHIFT+V` para colar o link no terminal.
```bash
$ git clone https://gitlab.com/flexmedia-tracking/app_flexmedia_track.git
```
Aperte `ENTER`. O git irá requisitar seu usuário e senha. Verifique se o download foi concluído.
```bash
$ ls
```
Um diretório com o nome do projeto deve ser imprimido na tela.
## Instalando Python 3.6
Para o projeto da Flexmedia feito usando o framework Django versão 2.0, é necessário instalar o Python versão 3.6 usando do Anaconda.
### Passo 1: Instalando a ambientação Python 3.6
Vá até o diretório do projeto clonado no passo anterior e rode o seguinte comando:
```sh
conda create -n py36 python=3.6 anaconda
```
Substitua `py36` por um nome de sua escolha. Este será o ambiente usado para as instalações dos pacotes do projeto.
Depois de criado, ative a nova ambientação:
```
conda activate py36
```
Caso seu terminal tenha o seguinte formato, quer dizer que o ambiente foi ativado com sucesso:
```
(py36) $ _
```
Verifique a versão atual de python digitando o comando abaixo:
```
(py36) $ python -V
```
Este comando deve ter uma saída semelhante a abaixo:
```
Python 3.6.x
```
aonde `x` é o número da subversão.
### Passo 2: Instalando os pacotes do projeto
Tenha certeza de se encontrar na pasta raiz do projeto e digite o comando abaixo:
```sh
cd requirements
```
Instale os pacotes necessários para rodar o projeto com este comando:
```
pip install -r production.txt
```
Caso aconteça algum erro, tente novamente da seguinte forma:
```
pip3 install -r production.txt
```
Caso o erro persista, por favor verifique as instalações do Anaconda e da versão de Python 3.6.
## :floppy_disk: Instalando banco de dados MySQL
### Passo 1: Instalando
```sh
$ sudo apt install mysql-server
```
### Passo 2: Configurando o banco de dados
Para novas instalações do MySQL, é necessário rodar o script de segurança básico.
```sh
sudo mysql_secure_installation
```
Isso o levará por uma série de prompts onde você pode fazer algumas alterações nas opções de segurança da instalação do MySQL. O primeiro prompt perguntará se você gostaria de configurar o plugin Validate Password, que pode ser usado para testar a força da senha de novos usuários do MySQL antes de considerá-los válidos.
Se você optar por configurar o plugin Validate Password, qualquer usuário MySQL que você criar e autenticar com uma senha deverá ter uma senha que satisfaça a política selecionada. O nível de política mais forte - que você pode selecionar inserindo 2 - exigirá que as senhas tenham pelo menos oito caracteres e incluam uma mistura de letras maiúsculas, minúsculas, numéricos e caracteres especiais:
```bash
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
```
Independentemente de você escolher configurar o Validate Password Plugin, o próximo prompt será para definir uma senha para o usuário root do MySQL. Digite e confirme uma senha segura de sua escolha:
```sh
# Output
Please set the password for root here.
New password:
Re-enter new password:
```
Se você usou o plugin Validate Password, receberá um feedback sobre a força da sua nova senha. Em seguida, o script perguntará se você deseja continuar com a senha que acabou de inserir ou se deseja inserir uma nova. Supondo que você esteja satisfeito com a força da senha que acabou de inserir, digite `Y` para continuar o script:
```sh
# Output
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
```
A partir daí, você pode pressionar `Y` e, em seguida, `ENTER` para aceitar os padrões para todas as perguntas subsequentes. Isso removerá alguns usuários anônimos e o banco de dados de teste, desabilitará logins de root remotos e carregará essas novas regras para que o MySQL respeite imediatamente as alterações feitas.
Assim que o script for concluído, sua instalação do MySQL estará segura. Agora você pode prosseguir para a criação de um usuário de banco de dados dedicado com o cliente MySQL.
### Passo 3: Criação de um usuário MySQL dedicado e concessão de privilégios
Após a instalação, o MySQL cria uma conta de usuário root que você pode usar para gerenciar seu banco de dados. Este usuário tem privilégios totais sobre o servidor MySQL, o que significa que ele tem controle total sobre cada banco de dados, tabela, usuário e assim por diante. Por isso, é melhor evitar o uso dessa conta fora das funções administrativas. Esta etapa descreve como usar o usuário `root` do MySQL para criar uma nova conta de usuário e conceder privilégios a ela.
Em sistemas Ubuntu que executam MySQL `5.7` (e versões posteriores), o usuário root do MySQL é configurado para autenticar usando o plug-in `auth_socket` por padrão em vez de uma senha. Este plug-in requer que o nome do usuário do sistema operacional que invoca o cliente MySQL corresponda ao nome do usuário MySQL especificado no comando, então você deve invocar mysql com privilégios sudo para obter acesso ao usuário `root` do MySQL:
```sh
sudo mysql
```
>Nota: Se você instalou o MySQL com outro tutorial e habilitou a autenticação de senha para root, você precisará usar um comando diferente para acessar o shell do MySQL. O seguinte irá executar seu cliente MySQL com privilégios de usuário regulares e você só obterá privilégios de administrador no banco de dados por meio da autenticação:
>```mysql -u root -p```
Depois de ter acesso ao prompt do MySQL, você pode criar um novo usuário com uma instrução CREATE USER. Eles seguem esta sintaxe geral:
```sql
CREATE USER 'nome_do_usuario'@'host' IDENTIFIED WITH authentication_plugin BY 'senha';
```
Depois de CREATE USER, você especifica um nome de usuário. Isso é imediatamente seguido por um sinal ``@`` e, em seguida, o nome do host a partir do qual o usuário se conectará. Se você planeja acessar este usuário localmente de seu servidor Ubuntu, você pode especificar localhost. Colocar o nome de usuário e o host entre aspas simples nem sempre é necessário, mas fazer isso pode ajudar a evitar erros.
Você tem várias opções quando se trata de escolher o plug-in de autenticação do usuário. O plugin auth_socket mencionado anteriormente pode ser conveniente, pois fornece segurança forte sem exigir que usuários válidos digitem uma senha para acessar o banco de dados. Mas também evita conexões remotas, o que pode complicar as coisas quando programas externos precisam interagir com o MySQL.
Como alternativa, você pode deixar de fora a parte `WITH authentication plugin` da sintaxe para que o usuário se autentique com o plug-in padrão do MySQL, caching_sha2_password. A documentação do MySQL recomenda este plugin para usuários que desejam efetuar login com uma senha devido aos seus fortes recursos de segurança.
Execute o seguinte comando para criar um usuário que se autentica com caching_sha2_password. Certifique-se de alterar ==sammy== para seu nome de usuário e senha preferidos para uma senha forte de sua escolha:
```sql
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
```
Depois de criar seu novo usuário, você pode conceder a ele os privilégios apropriados. A sintaxe geral para conceder privilégios de usuário é a seguinte:
```sql
GRANT PRIVILEGE ON database.table TO 'nome_do_usuario'@'host';
```
O valor `PRIVILEGE` neste comando de exemplo define quais ações o usuário tem permissão para executar no banco de dados e na tabela especificados. Você pode conceder vários privilégios ao mesmo usuário em um comando, separando cada um com uma vírgula. Você também pode conceder privilégios a um usuário globalmente inserindo asteriscos (*) no lugar dos nomes do banco de dados e das tabelas. No SQL, os asteriscos são caracteres especiais usados para representar “todos” os bancos de dados ou tabelas.
Porém este comando dará permissão apenas a uma tabela. Para propósitos deste tutorial, iremos rodar o comando abaixo para que o usuário tenha permissões plenas no banco de dados:
```sql
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
```
Depois disso, é uma boa prática executar o comando `FLUSH PRIVILEGES`. Isso irá liberar qualquer memória que o servidor armazenou em cache como resultado das instruções `CREATE USER` e `GRANT` anteriores:
```sql
FLUSH PRIVILEGES;
```
Em seguida, você pode sair do cliente MySQL:
```sql
exit
```
No futuro, para fazer login como seu novo usuário MySQL, você usaria um comando como o seguinte:
```sh
mysql -u sammy -p
```
O sinalizador -p fará com que o cliente MySQL solicite sua senha de usuário MySQL para autenticação.
### Passo 4: Testando o MySQL
Independentemente de como você o instalou, o MySQL deve ter iniciado a execução automaticamente. Para testar isso, verifique seu status.
```sh
sudo systemctl status mysql.service
```
Você verá uma impressão similar a essa:
```sh
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /usr/sbin/mysqld
```
Se o MySQL não estiver em execução, você pode iniciá-lo com `sudo systemctl start mysql`.
## Conectando o projeto ao banco de dados
Para que possamos rodar o projeto, é necessário alterar algumas configurações que possuem informações de conexão ao banco de dados.
### Passo 1: Alterando o arquivo de configuração production.py
Este arquivo conterá as configurações necessárias para o projeto rodar em modo produção. Rode os seguintes comandos para alterar o arquivo:
```
cd si_flexmedia/settings
```
Neste diretório existe o arquivo production.py. Para altera-lo rode:
```
vi production.py
```
Este comando abrirá o editor de texto. Este arquivo conterá as seguintes linhas de código:
```python=
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'flexmedia',
'USER': 'flexmedia',
'PASSWORD': 'NSWFpj17',
'HOST': '',
'PORT': '',
}
}
```
Para editar o arquivo pressione `I`. Navegue e altere as linhas `'USER'` e `'PASSWORD'` com os valores escolhidos durante a instalação do bando de dados MySQL.
Depois de alterado pressione a tecla `ESC`, logo em seguida digite `:`, escreva `wq` e pressione `ENTER`.
O nosso banco de dados ainda se encontra vazio. Para criarmos a estrutura de dados, precisamos executar as migrações do próximo passo.
### Passo 2: Rodando a migração de tabelas
Tenha ceteza de estar na pasta raiz do projeto. Em seguida digite o seguinte comando:
```sh
python ./manage_production.py migrate
```
Caso ocorra algum erro, as migrações de banco estão corrompidas e precisam ser revisadas.
## Nginx
Antes de começar este guia, você deve ter um usuário regular não root com privilégios sudo configurados em seu servidor. Você pode aprender como configurar uma conta de usuário normal seguindo nosso guia de configuração inicial do servidor para Ubuntu 20.04.
Quando você tiver uma conta disponível, faça login como seu usuário não root para começar.
### Passo 1: Instalando o Nginx
Como o Nginx está disponível nos repositórios padrão do Ubuntu, é possível instalá-lo a partir desses repositórios usando o sistema de empacotamento `apt`.
Visto que esta é nossa primeira interação com o sistema de empacotamento apt nesta sessão, vamos atualizar nosso índice de pacote local para que tenhamos acesso às listagens de pacotes mais recentes. Depois, podemos instalar o nginx:
```
sudo apt update
sudo apt install nginx
```
### Passo 2: Ajustando o Firewall
Antes de testar o Nginx, o firewall precisa ser ajustado para permitir o acesso ao serviço. O Nginx se registra como um serviço com o ufw na instalação, tornando mais fácil permitir o acesso ao Nginx.
```bash
sudo ufw app list
```
Você deve obter uma lista dos perfis de aplicativo:
```bash
# Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
```
Conforme demonstrado pela saída, existem três perfis disponíveis para Nginx:
- Nginx Full: este perfil abre a porta 80 (tráfego da web normal e não criptografado) e a porta 443 (tráfego criptografado por TLS / SSL)
- Nginx HTTP: este perfil abre apenas a porta 80 (tráfego da web normal, não criptografado)
- Nginx HTTPS: este perfil abre apenas a porta 443 (tráfego criptografado por TLS / SSL)
É recomendado que você habilite o perfil mais restritivo que ainda permitirá o tráfego que você configurou. No momento, só precisaremos permitir o tráfego na porta 80.
Você pode ativar isso digitando:
```
sudo ufw allow 'Nginx HTTP'
```
Você pode verificar a mudança digitando:
```
sudo ufw status
```
A saída deve ser algo similar a isso:
```
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
```
### Passo 3: Verificando o web server
No final do processo de instalação, o Ubuntu 20.04 inicia o Nginx. O servidor da web já deve estar instalado e funcionando.
Podemos verificar com o sistema init do systemd se o serviço está sendo executado digitando:
```
systemctl status nginx
```
```
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
Docs: man:nginx(8)
Main PID: 2369 (nginx)
Tasks: 2 (limit: 1153)
Memory: 3.5M
CGroup: /system.slice/nginx.service
├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─2380 nginx: worker process
```
Como confirmado por isso, o serviço foi iniciado com sucesso. No entanto, a melhor maneira de testar isso é realmente solicitar uma página do Nginx.
Você pode acessar a página de destino padrão do Nginx para confirmar se o software está funcionando corretamente, navegando até o endereço IP do seu servidor.
Você deve receber a página de destino Nginx padrão:

Agora que você tem seu servidor da web instalado e funcionando, vamos revisar alguns comandos básicos de gerenciamento.
Para parar o seu servidor web, digite:
```
sudo systemctl stop nginx
```
Para iniciar o servidor web, digite:
```
sudo systemctl start nginx
```
Para reiniciar o servidor web, digite:
```
sudo systemctl restart nginx
```
Se você está apenas fazendo alterações na configuração, o Nginx pode recarregar frequentemente sem interromper as conexões. Para fazer isso, digite:
```
sudo systemctl reload nginx
```
## Instalando gunicorn
Para que o projeto se mantenha rodando, precisamos instalar o pacote `gunicorn`. Tenha certeza de se encontrar na pasta raiz do projeto e rode o comando:
```
pip install gunicorn
```
Após a instalação, vá para a pasta `si_flexmedia` e digite o comando:
```
gunicorn --bind 0.0.0.0:8000 wsgi.py
```
### Criando um arquivo de serviço systemd
Crie e abra um arquivo de serviço systemd para Gunicorn com privilégios sudo em seu editor de texto:
```
sudo vi /etc/systemd/system/gunicorn.service
```
Comece com a seção [Unit], que é usada para especificar metadados e dependências. Vamos colocar uma descrição de nosso serviço aqui e dizer ao sistema init para iniciá-lo apenas depois que o objetivo da rede for alcançado:
```sh
[Unit]
Description=gunicorn daemon
After=network.target
```
A seguir, abriremos a seção ``[Service]``. Especificaremos o usuário e o grupo que queremos processar para execução. Daremos à nossa conta de usuário regular a propriedade do processo, uma vez que ela possui todos os arquivos relevantes. Daremos a propriedade do grupo ao grupo www-data para que o Nginx possa se comunicar facilmente com o Gunicorn.
Em seguida, mapearemos o diretório de trabalho e especificaremos o comando a ser usado para iniciar o serviço. Nesse caso, teremos que especificar o caminho completo para o executável Gunicorn, que está instalado em nosso ambiente virtual. Iremos ligá-lo a um soquete Unix dentro do diretório do projeto, já que o Nginx está instalado no mesmo computador. Isso é mais seguro e rápido do que usar uma porta de rede. Também podemos especificar quaisquer ajustes opcionais do Gunicorn aqui. Por exemplo, especificamos 3 processos de trabalho neste caso:
```sh
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/nome_do_usuario_do_sistema/si_flexmedia_track
ExecStart=/home/nome_do_usuario_do_sistema/.conda/envs/py36/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/nome_do_usuario_do_sistema/si_flexmedia_track/si_flexmedia_track.sock wsgi.py:application
```
:::info
Os valores ==nome_do_usuario_do_sistema== devem ser substituidos pelos valores reais, assim como o valor ==py36== deve ser substituido pelo real nome do ambiente criado.
:::
Por fim, adicionaremos uma seção ``[Install]``. Isso dirá ao systemd a que link este serviço se o habilitarmos para iniciar na inicialização. Queremos que este serviço seja iniciado quando o sistema multiusuário regular estiver instalado e funcionando:
```sh
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
Com isso, nosso arquivo de serviço systemd está completo. Salve e feche agora.
Agora podemos iniciar o serviço Gunicorn que criamos e habilitá-lo para que comece na inicialização:
```sh
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
```
## Configurando Proxy Pass Nginx
Agora que o Gunicorn está configurado, precisamos configurar o Nginx para passar o tráfego para o processo.
Comece criando e abrindo um novo bloco de servidor no diretório de sites disponíveis do Nginx:
```
sudo vi /etc/nginx/sites-available/myproject
```
Dentro, abra um novo bloco `server`. Começaremos especificando que este bloco deve escutar na porta normal 80 e que deve responder ao nome de domínio ou endereço IP de nosso servidor:
```
server {
listen 80;
server_name server_domain_or_IP;
}
```
A seguir, diremos ao Nginx para ignorar quaisquer problemas em encontrar um favicon. Também diremos onde encontrar os ativos estáticos que coletamos em nosso diretório `~/si_flexmedia_tracking/static`. Todos esses arquivos têm um prefixo URI padrão de “/ static”, portanto, podemos criar um bloco de localização para corresponder a essas solicitações:
```
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/nome_do_usuario/si_flexmedia_tracking;
}
}
```
Por fim, criaremos um bloco de localização / {} para corresponder a todas as outras solicitações. Dentro desse local, incluiremos o arquivo `proxy_params` padrão incluído na instalação do Nginx e, em seguida, passaremos o tráfego para o soquete que nosso processo Gunicorn criou:
```
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/nome_do_usuario/si_flexmedia_tracking;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/nome_do_usuario/si_flexmedia_tracking/myproject.sock;
}
}
```
Salve e feche o arquivo quando terminar. Agora, podemos ativar o arquivo vinculando-o ao diretório `sites-enabled`:
```
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
```
Teste a configuração do Nginx para erros de sintaxe digitando:
```
sudo nginx -T
```
Se nenhum erro for relatado, vá em frente e reinicie o Nginx digitando:
```
sudo systemctl restart nginx
```
{"metaMigratedAt":"2023-06-15T20:17:26.414Z","metaMigratedFrom":"Content","title":"Deploy servidor Linux","breaks":true,"contributors":"[{\"id\":\"ab1f4b6e-50ed-431b-af0e-8ee7bd5fa47a\",\"add\":27571,\"del\":3060}]"}