Mudanças entre as edições de "Tutoriais:Implantação resumida"
(20 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
'''PASSO 1''' | '''PASSO 1''' | ||
Criar uma maquina linux debian 7GB de memoria ram e pelo menos 100GB de HD, não faça menos que isso. | Criar uma maquina linux debian 7GB de memoria ram e pelo menos 100GB de HD, não faça menos que isso. Lembre-se de apontar o dominio para o servidor da maquina e vice-versa. Deixa-a no jeito. | ||
'''PASSO 2''' | '''PASSO 2''' | ||
Linha 27: | Linha 27: | ||
'''6 | '''PASSO 6 ''' | ||
obs: Não se esqueça de configurar o Tek-Prot!!! Ou seja o código do usuário da tekapi. | |||
Código fonte da index: | |||
<nowiki> | |||
<?php | |||
function dataVerificacaoExpirada(){ | |||
---------- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- --- | |||
$arquivo = "data_ultima_bloqueio.txt"; | |||
$hora_espera = 2; | |||
if (is_writable($arquivo)) { | |||
$fp = fopen($arquivo, "r+"); | |||
$dataAnterior = fgets($fp, 256); | |||
date_default_timezone_set('America/Sao_Paulo'); | |||
$dataAtual = new DateTime('NOW'); | |||
$dataAnterior = new DateTime($dataAnterior); | |||
$diferenca = $dataAnterior->diff($dataAtual); | |||
$horas = $diferenca->h+($diferenca->days * 24); | |||
if($horas >= $hora_espera){ | |||
return true; | |||
} | |||
fclose($fp); | |||
}else{ | |||
$fp = fopen($arquivo, "a+"); | |||
date_default_timezone_set('America/Sao_Paulo'); | |||
$dataAtual = new DateTime('NOW'); | |||
fwrite($fp, $dataAtual->format('Y-m-d H:i:s')); | |||
fclose($fp); | |||
return true; | |||
} | |||
return false; | |||
} | |||
function gravarUltimaDataValida(){ | |||
$arquivo = "data_ultima_bloqueio.txt"; | |||
if (is_writable($arquivo)) { | |||
$fp = fopen($arquivo, "r+"); | |||
file_put_contents($arquivo, ""); // limpa arquivo | |||
date_default_timezone_set('America/Sao_Paulo'); | |||
$dataAtual = new DateTime('NOW'); | |||
fwrite($fp, $dataAtual->format('Y-m-d H:i:s')); | |||
fclose($fp); | |||
} | |||
} | |||
function gravarSeEcommerceEstaValidoNoArquivo($boolEhValido){ | |||
$arquivoValidacaoTP = "eh-valido-tekprot.txt"; | |||
$boolEhValido = $boolEhValido ? "sim" : "nao"; | |||
if (is_writable($arquivoValidacaoTP)) { | |||
$fp = fopen($arquivoValidacaoTP, "r+"); | |||
file_put_contents($arquivoValidacaoTP, ""); // limpa arquivo | |||
fwrite($fp, $boolEhValido); | |||
fclose($fp); | |||
}else{ | |||
$fp = fopen($arquivoValidacaoTP, "a+"); | |||
fwrite($fp, $boolEhValido); | |||
fclose($fp); | |||
} | |||
} | |||
function lerSeEcommerceEstaValidoNoArquivo(){ | |||
$arquivoValidacaoTP = "eh-valido-tekprot.txt"; | |||
$fp = fopen($arquivoValidacaoTP, "r+"); | |||
$boolEhValido = fgets($fp, 200); | |||
return $boolEhValido == "sim"; | |||
} | |||
// Sim, esse processo ira utilizar o mesmo token para varios clientes, mas nao importa pois ira bloquear os ataques de bots | |||
function gravarUltimoTokenEncriptadoNoArquivoPassandoToken($key, $url, $configToken, $tokenDaApiEncriptado){ | |||
$arquivoToken = "token.txt"; | |||
if (is_writable($arquivoToken)) { | |||
$fp = fopen($arquivoToken, "r+"); | |||
file_put_contents($arquivoToken, ""); // limpa arquivo | |||
fwrite($fp, $tokenDaApiEncriptado); | |||
fclose($fp); | |||
}else{ | |||
$fp = fopen($arquivoToken, "a+"); | |||
fwrite($fp, $tokenDaApiEncriptado); | |||
fclose($fp); | |||
} | |||
} | |||
function buscarUltimoTokenEncriptadoNoArquivo(){ | |||
$arquivoToken = "token.txt"; | |||
$fp = fopen($arquivoToken, "r+"); | |||
$tokenEncriptado = fgets($fp, 1024); | |||
return $tokenEncriptado; | |||
} | |||
function buscaToken($configToken, $url){ | |||
$userData = array("token" => $configToken); | |||
$ch = curl_init($url); | |||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); | |||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($userData)); | |||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |||
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); | |||
$data = curl_exec($ch); | |||
$err = curl_error($ch); | |||
if($err === ""){ | |||
$json = json_decode($data); | |||
if(isset($json->errors)) | |||
return $json->data->token; | |||
else return false; | |||
}else{ | |||
return false; | |||
} | |||
} | |||
function validaIntegracao($configUrlWebservice, $token){ | |||
gravarUltimaDataValida(); | |||
$canal = "ECOMMERCE_MAGENTO"; | |||
$url = $configUrlWebservice. "integracao/tekecommerce/" . $canal ; | |||
$ch = curl_init($url); | |||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); | |||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |||
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer " . $token)); | |||
// Fim - Requisicao | |||
$result = curl_exec($ch); | |||
$err = curl_error($ch); | |||
if($err === ""){ | |||
$json = json_decode($result); | |||
if(isset($json->errors)){ | |||
return $json->data; | |||
}else { | |||
return false; | |||
} | |||
}else{ | |||
return false; | |||
} | |||
} | |||
function liberaMagento(){ | |||
switch($_SERVER['HTTP_HOST']) { | |||
case '35.196.243.242 ': | |||
$mageRunCode = 'base'; | |||
$mageRunType = 'website'; | |||
break; | |||
case 'teksystemcommerce.com.br': | |||
$mageRunCode = 'tc'; | |||
$mageRunType = 'website'; | |||
break; | |||
case 'www.teksystemcommerce.com.br': | |||
$mageRunCode = 'tc'; | |||
$mageRunType = 'website'; | |||
break; | |||
} | |||
$params = $_SERVER; | |||
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = $mageRunCode; | |||
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = $mageRunType; | |||
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params); | |||
/** @var \Magento\Framework\App\Http $app */ | |||
$app = $bootstrap->createApplication('Magento\Framework\App\Http'); | |||
$bootstrap->run($app); | |||
} | |||
function paginaErro($msg){ | |||
echo | |||
'<div class="container"> | |||
<div class="title"> | |||
<h3>AVISO IMPORTANTE</h3> | |||
</div> | |||
<div class="bg-tek"> | |||
<img src="http://teksystemcommerce.com.br/pub/static/version1553773995/frontend/Emthemes/everything_fashionshop/pt_BR/images/logo@2x.svg" width="300px"/> | |||
<p>Este site está temporariamente indisponível !!!</p> | |||
</div> | |||
</div> | |||
<style> | |||
.container{ | |||
border: solid 1px; | |||
margin: 0 20% 0 20%; | |||
text-align: center; | |||
} | |||
.title{ | |||
color: white; | |||
font-size: 19px; | |||
font-family:"Segoe UI", Tahoma, Geneva, Verdana, sans-serif; | |||
background-color: #000; | |||
padding: 1px; | |||
} | |||
p{ | |||
padding: 5% 0 5% 0; | |||
font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; | |||
font-size: 25px; | |||
font-weight:900; | |||
} | |||
img{ | |||
padding-top: 10%; | |||
} | |||
.bg-tek{ | |||
background-color: #59a4f9; | |||
padding-bottom: 1px; | |||
} | |||
@media only screen and (max-width: 767px) { | |||
p{ | |||
padding: 10% 0 0 0; | |||
font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; | |||
font-size: 45px; | |||
font-weight:900; | |||
} | |||
img{ | |||
width: 600px; | |||
} | |||
.container{ | |||
margin: unset; | |||
} | |||
} | |||
</style>'; | |||
} | |||
try { | |||
require __DIR__ . '/app/bootstrap.php'; | |||
} catch (\Exception $e) { | |||
echo <<<HTML | |||
<div style="font:12px/1.35em arial, helvetica, sans-serif;"> | |||
<div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"> | |||
<h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;"> | |||
Autoload error</h3> | |||
</div> | |||
<p>{$e->getMessage()}</p> | |||
</div> | |||
HTML; | |||
exit(1); | |||
} | |||
$key = "0fb32560a639adbb2b05b27f920a3a08"; //encrypitamento do token | |||
$expireCookie = 3600; // expira o cookie em 1h, para fazer uma nova consulta no TEKPROT | |||
$configToken = "b2121-21445-454a-bb67-0f7d622123faf"; //Token do usuario | |||
$configUrlWebservice = "http://ts.teksystem.com.br:9090/api/v1/"; //URL da api | |||
$url = $configUrlWebservice . "auth"; //URL de autenticacao | |||
if(!isset($_COOKIE["token"])){ | |||
$tokenEncriptado = buscarUltimoTokenEncriptadoNoArquivo(); | |||
if($tokenEncriptado != null){ | |||
setcookie("token", buscarUltimoTokenEncriptadoNoArquivo() , -1, '/'); | |||
} | |||
} | |||
if(isset($_COOKIE["token"]) && buscarUltimoTokenEncriptadoNoArquivo() != $_COOKIE["token"]){ | |||
setcookie("token", buscarUltimoTokenEncriptadoNoArquivo(), -1, '/'); | |||
} | |||
if(dataVerificacaoExpirada()){ //licenca invalida | |||
$result = buscaToken($configToken, $url); | |||
$encry = $result . $key ; | |||
$encry = base64_encode($encry); | |||
if($result){ | |||
gravarUltimoTokenEncriptadoNoArquivoPassandoToken($key, $url, $configToken, $encry); | |||
setcookie("token", $encry, -1, '/'); | |||
$result = validaIntegracao($configUrlWebservice, $result); | |||
gravarSeEcommerceEstaValidoNoArquivo($result); | |||
if($result){ | |||
liberaMagento(); | |||
}else{ | |||
paginaErro("Erro de conexao - Liberacao"); | |||
} | |||
}else{ | |||
paginaErro("Erro de conexao - Token"); | |||
} | |||
}elseif (lerSeEcommerceEstaValidoNoArquivo()) { | |||
liberaMagento(); | |||
}else{ | |||
paginaErro("Erro de conexao - Token"); | |||
} | |||
</nowiki> | |||
ALTERE O CONFIG TOKEN: | |||
$configToken = "b2121-21445-454a-bb67-0f7d622123faf"; | |||
'''PASSO 7''' | '''PASSO 7''' | ||
---------- --- | Acesse '''IP-DO-CLIENTE/phpmyadmin''' | ||
Vá no repositorio: http://192.168.254.201/ecommerce-magento/inicializacao-scripts | |||
Rode a sql procedure-implantacao.sql trocando pelas informações da empresa. | |||
Depois rode a limpeza: procedure-limpa-pedidos-produtos.sql | |||
Não se esqueça de colocar HTTP na url do host! | |||
'''PASSO 8''' | |||
Talvez precise instalar o sshpass.. entao olhe o tutorial | |||
'''PASSO 9''' | |||
Configure o backup automatico e aproveite para colocar no cron os scripts necessarios para rotina do magento: | |||
http://tekwiki.teksystem.com.br/~teksys/tekwiki/index.php?title=BACKUP_CRON | |||
'''PASSO 10''' | |||
Adicionar caminho do arquivo e empresa em: | |||
http://192.168.254.201/ecommerce-magento/acesso-ssh-mac-ou-linux/tree/master/Teksystem_scripts | |||
'''PASSO 11''' | |||
Instale o certificado gratuito lets encript: | |||
http://tekwiki.teksystem.com.br/~teksys/tekwiki/index.php?title=Certificado_SSL_GRATUITO_LETS_ENCRIPT | |||
'''ISIRA TODOS COMANDOS DE CRON AUTOMATICAMENTE''' | |||
/home/ecommerce/Teksystem_scripts/ativa-todos-cron-por-tempo.sh | |||
ATENCAO, NECESSARIO INSTALAR O PHP, SOMENTE O PHP SEM APACHE, RODE: | |||
apt-get install php7.0-fpm | |||
Dessa forma ele vai preencher os eventos sem você ter que ficar lembrando, mas note que o cron deve estar limpo de inserir isto pois ele vai duplicar a linha... |
Edição atual tal como às 19h52min de 8 de setembro de 2020
PASSO 1
Criar uma maquina linux debian 7GB de memoria ram e pelo menos 100GB de HD, não faça menos que isso. Lembre-se de apontar o dominio para o servidor da maquina e vice-versa. Deixa-a no jeito.
PASSO 2
Jogue a pasta com scripts Teksystem_Scripts (http://192.168.254.201/ecommerce-magento/infra) na mesma altura onde será inserido o magento2-ready(Codigo fonte do magento)
PASSO 3 Rode o comando para ser possivel utilizar a pasta com scripts:
chmod +x configura_maquina_linux.sh
rode o comando de configuracao da maquina linux
./configura_maquina_linux.sh
PASSO 4
Envie o arquivo do magento zipado pelo filezilla
PASSO 5
Apos enviado o magento e descompacta-lo:
Acesse o arquivo index.php
PASSO 6
obs: Não se esqueça de configurar o Tek-Prot!!! Ou seja o código do usuário da tekapi.
Código fonte da index:
<?php function dataVerificacaoExpirada(){ $arquivo = "data_ultima_bloqueio.txt"; $hora_espera = 2; if (is_writable($arquivo)) { $fp = fopen($arquivo, "r+"); $dataAnterior = fgets($fp, 256); date_default_timezone_set('America/Sao_Paulo'); $dataAtual = new DateTime('NOW'); $dataAnterior = new DateTime($dataAnterior); $diferenca = $dataAnterior->diff($dataAtual); $horas = $diferenca->h+($diferenca->days * 24); if($horas >= $hora_espera){ return true; } fclose($fp); }else{ $fp = fopen($arquivo, "a+"); date_default_timezone_set('America/Sao_Paulo'); $dataAtual = new DateTime('NOW'); fwrite($fp, $dataAtual->format('Y-m-d H:i:s')); fclose($fp); return true; } return false; } function gravarUltimaDataValida(){ $arquivo = "data_ultima_bloqueio.txt"; if (is_writable($arquivo)) { $fp = fopen($arquivo, "r+"); file_put_contents($arquivo, ""); // limpa arquivo date_default_timezone_set('America/Sao_Paulo'); $dataAtual = new DateTime('NOW'); fwrite($fp, $dataAtual->format('Y-m-d H:i:s')); fclose($fp); } } function gravarSeEcommerceEstaValidoNoArquivo($boolEhValido){ $arquivoValidacaoTP = "eh-valido-tekprot.txt"; $boolEhValido = $boolEhValido ? "sim" : "nao"; if (is_writable($arquivoValidacaoTP)) { $fp = fopen($arquivoValidacaoTP, "r+"); file_put_contents($arquivoValidacaoTP, ""); // limpa arquivo fwrite($fp, $boolEhValido); fclose($fp); }else{ $fp = fopen($arquivoValidacaoTP, "a+"); fwrite($fp, $boolEhValido); fclose($fp); } } function lerSeEcommerceEstaValidoNoArquivo(){ $arquivoValidacaoTP = "eh-valido-tekprot.txt"; $fp = fopen($arquivoValidacaoTP, "r+"); $boolEhValido = fgets($fp, 200); return $boolEhValido == "sim"; } // Sim, esse processo ira utilizar o mesmo token para varios clientes, mas nao importa pois ira bloquear os ataques de bots function gravarUltimoTokenEncriptadoNoArquivoPassandoToken($key, $url, $configToken, $tokenDaApiEncriptado){ $arquivoToken = "token.txt"; if (is_writable($arquivoToken)) { $fp = fopen($arquivoToken, "r+"); file_put_contents($arquivoToken, ""); // limpa arquivo fwrite($fp, $tokenDaApiEncriptado); fclose($fp); }else{ $fp = fopen($arquivoToken, "a+"); fwrite($fp, $tokenDaApiEncriptado); fclose($fp); } } function buscarUltimoTokenEncriptadoNoArquivo(){ $arquivoToken = "token.txt"; $fp = fopen($arquivoToken, "r+"); $tokenEncriptado = fgets($fp, 1024); return $tokenEncriptado; } function buscaToken($configToken, $url){ $userData = array("token" => $configToken); $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($userData)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); $data = curl_exec($ch); $err = curl_error($ch); if($err === ""){ $json = json_decode($data); if(isset($json->errors)) return $json->data->token; else return false; }else{ return false; } } function validaIntegracao($configUrlWebservice, $token){ gravarUltimaDataValida(); $canal = "ECOMMERCE_MAGENTO"; $url = $configUrlWebservice. "integracao/tekecommerce/" . $canal ; $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer " . $token)); // Fim - Requisicao $result = curl_exec($ch); $err = curl_error($ch); if($err === ""){ $json = json_decode($result); if(isset($json->errors)){ return $json->data; }else { return false; } }else{ return false; } } function liberaMagento(){ switch($_SERVER['HTTP_HOST']) { case '35.196.243.242 ': $mageRunCode = 'base'; $mageRunType = 'website'; break; case 'teksystemcommerce.com.br': $mageRunCode = 'tc'; $mageRunType = 'website'; break; case 'www.teksystemcommerce.com.br': $mageRunCode = 'tc'; $mageRunType = 'website'; break; } $params = $_SERVER; $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = $mageRunCode; $params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = $mageRunType; $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params); /** @var \Magento\Framework\App\Http $app */ $app = $bootstrap->createApplication('Magento\Framework\App\Http'); $bootstrap->run($app); } function paginaErro($msg){ echo '<div class="container"> <div class="title"> <h3>AVISO IMPORTANTE</h3> </div> <div class="bg-tek"> <img src="http://teksystemcommerce.com.br/pub/static/version1553773995/frontend/Emthemes/everything_fashionshop/pt_BR/images/logo@2x.svg" width="300px"/> <p>Este site está temporariamente indisponível !!!</p> </div> </div> <style> .container{ border: solid 1px; margin: 0 20% 0 20%; text-align: center; } .title{ color: white; font-size: 19px; font-family:"Segoe UI", Tahoma, Geneva, Verdana, sans-serif; background-color: #000; padding: 1px; } p{ padding: 5% 0 5% 0; font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; font-size: 25px; font-weight:900; } img{ padding-top: 10%; } .bg-tek{ background-color: #59a4f9; padding-bottom: 1px; } @media only screen and (max-width: 767px) { p{ padding: 10% 0 0 0; font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; font-size: 45px; font-weight:900; } img{ width: 600px; } .container{ margin: unset; } } </style>'; } try { require __DIR__ . '/app/bootstrap.php'; } catch (\Exception $e) { echo <<<HTML <div style="font:12px/1.35em arial, helvetica, sans-serif;"> <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"> <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;"> Autoload error</h3> </div> <p>{$e->getMessage()}</p> </div> HTML; exit(1); } $key = "0fb32560a639adbb2b05b27f920a3a08"; //encrypitamento do token $expireCookie = 3600; // expira o cookie em 1h, para fazer uma nova consulta no TEKPROT $configToken = "b2121-21445-454a-bb67-0f7d622123faf"; //Token do usuario $configUrlWebservice = "http://ts.teksystem.com.br:9090/api/v1/"; //URL da api $url = $configUrlWebservice . "auth"; //URL de autenticacao if(!isset($_COOKIE["token"])){ $tokenEncriptado = buscarUltimoTokenEncriptadoNoArquivo(); if($tokenEncriptado != null){ setcookie("token", buscarUltimoTokenEncriptadoNoArquivo() , -1, '/'); } } if(isset($_COOKIE["token"]) && buscarUltimoTokenEncriptadoNoArquivo() != $_COOKIE["token"]){ setcookie("token", buscarUltimoTokenEncriptadoNoArquivo(), -1, '/'); } if(dataVerificacaoExpirada()){ //licenca invalida $result = buscaToken($configToken, $url); $encry = $result . $key ; $encry = base64_encode($encry); if($result){ gravarUltimoTokenEncriptadoNoArquivoPassandoToken($key, $url, $configToken, $encry); setcookie("token", $encry, -1, '/'); $result = validaIntegracao($configUrlWebservice, $result); gravarSeEcommerceEstaValidoNoArquivo($result); if($result){ liberaMagento(); }else{ paginaErro("Erro de conexao - Liberacao"); } }else{ paginaErro("Erro de conexao - Token"); } }elseif (lerSeEcommerceEstaValidoNoArquivo()) { liberaMagento(); }else{ paginaErro("Erro de conexao - Token"); }
ALTERE O CONFIG TOKEN:
$configToken = "b2121-21445-454a-bb67-0f7d622123faf";
PASSO 7
Acesse IP-DO-CLIENTE/phpmyadmin
Vá no repositorio: http://192.168.254.201/ecommerce-magento/inicializacao-scripts
Rode a sql procedure-implantacao.sql trocando pelas informações da empresa.
Depois rode a limpeza: procedure-limpa-pedidos-produtos.sql
Não se esqueça de colocar HTTP na url do host!
PASSO 8
Talvez precise instalar o sshpass.. entao olhe o tutorial
PASSO 9
Configure o backup automatico e aproveite para colocar no cron os scripts necessarios para rotina do magento:
http://tekwiki.teksystem.com.br/~teksys/tekwiki/index.php?title=BACKUP_CRON
PASSO 10
Adicionar caminho do arquivo e empresa em:
http://192.168.254.201/ecommerce-magento/acesso-ssh-mac-ou-linux/tree/master/Teksystem_scripts
PASSO 11
Instale o certificado gratuito lets encript:
http://tekwiki.teksystem.com.br/~teksys/tekwiki/index.php?title=Certificado_SSL_GRATUITO_LETS_ENCRIPT
ISIRA TODOS COMANDOS DE CRON AUTOMATICAMENTE
/home/ecommerce/Teksystem_scripts/ativa-todos-cron-por-tempo.sh
ATENCAO, NECESSARIO INSTALAR O PHP, SOMENTE O PHP SEM APACHE, RODE:
apt-get install php7.0-fpm
Dessa forma ele vai preencher os eventos sem você ter que ficar lembrando, mas note que o cron deve estar limpo de inserir isto pois ele vai duplicar a linha...