Backup automático no cPanel com Cron Job

O Facebook e suas novidades na F8 Developer Conference
26 de Março de 2015
Wunderlist – To-do list eficiente e sem frescuras
13 de Maio de 2015

Backup automático no cPanel com Cron Job

Aprenda a configurar um full backup no cPanel utilizando cron job

Esses dias GANHEI um bom tempo pesquisando sobre a possibilidade de automatizar um backup dos meus sites e dos meus clientes no cPanel, de forma que nem eu nem os clientes tivessem que acessar o cPanel e gerar o backup.

Pesquisei em fóruns, grupos e até mesmo no fórum do cPanel, mas estava realmente uma dificuldade encontrar algo que funcionasse da forma que eu queria:

  1. Gerar backup dos arquivos e da base de dados.
  2. Copiar este backup para uma pasta específica dentro da minha hospedagem para que eu possa baixar via FTP.
  3. Apagar o arquivo a cada 15 dias, deixando apenas o mais novo.

Realizar estes procedimentos em um dia e hora específico da semana

Como gero esse backup automático no cPanel?

Vamos trabalhar com um arquivo PHP, responsável pelo código que realiza a conexão, cria e apaga o backup, vou chamar este arquivo de backup.php.

Também vamos precisar criar uma tarefa Cron Job no cPanel, se você possui uma revenda deverá criar uma tarefa em cada conta, se possui um VPS poderá configurar via SSH, no meu caso é uma revenda, sendo assim adicionei para cada conta um cron job, nada de drama, depois de pronto fica ótimo e otimiza seu tempo.

Nosso arquivo backup.php está configurado para realizar o backup na pasta /public_html/backup/ então pode criar ela.

Após criar esta pasta você pode realizar o upload do arquivo backup.php para a pasta home em seu servidor (não na www), se tiver dúvidas entra no seu cPanel e olha na sidebar da esquerda, lá diz qual sua pasta home.

Após subir este arquivo determine a permissão 750 para ele.

A parte do nosso arquivo já foi feita, agora precisamos criar a tarefa cron job para isso faça:

  1. Entre no cPanel
  2. Na seção AVANÇADA vá em “Tarefas Cron
  3. Atualize seu e-mail para que receba um alerta sempre que o CRON JOB rodar (não obrigatório)
  4. Em “Minuto” defina em qual minuto será realizado o seu backup
  5. Em “Hora” defina em qual hora será realizado o seu backup
  6. Em “Dia Útil” defina em qual dia será realizado o seu backup
    • 0 = domingo
    • 1 = segunda
    • 2 = terça
    • 3 = quarta
    • 4 = quinta
    • 5 = sexta
    • 6 = sábado)
  7. Na linha de comando insira o PATH do seu SCRIPT, “/usr/local/bin/php /home/nome-da-sua-home/backup.php”
  8. Clique em “Adicionar Novo Trabalho Cron” e sua configuração de backup estará pronta.

Observação 1: Este espaço no PATH após é necessário por conta do meu PHP 5.2, se tiverem problemas leiam esse link.

Observação 2: Tive alguns bugs quando a senha do cPanel e ou FTP continham caracteres especiais, caso tenham esse tipo de problemas utilizem senhas alfanuméricas apenas.

 

–> Este tutorial você também pode ler aqui

CÓDIGO BACKUP.PHP

<?php
/*
cPanel Backup Script
This script will auto create backup file, transfer to FTP server
By Michael Phan @ sondaika.com
*/

// Change to your information

$cpanel_user = “USUÁRIO DO CPANEL”; // change to your cpanel user
$cpanel_password = “SENHA DO CPANEL”; // change to your cpanel password
$domain = “DOMINIO.COM”; // your domain
$email_to_report = “SEUEMAIL@SEUEMAIL.COM”; // Your email to receive notification when the script finish backup. Leave it blank if you dont want to receive notification.
$ftp = true; // transfer to FTP server or not
$ftpserver = “DOMINIO FTP”; // your ftp server address
$ftpusername = “USUÁRIO DO FT”; // your ftp username
$ftppassword = “SENHA DO FTP”; // your ftp password
$ftpdirectory = “/public_html/backup/”; // your backup directory
$daytostore = 7; // how many days do you want to store the backup file, the files which older than this number of day will be deleted

//This part is option, the bellow information is work for almost user
$ftpport = “21”; // default port for FTP connection of most hosting providers now
$theme = “x3”; // change to your cpanel theme name, default is most popular theme now named paper_lantern
$secure = false; // use https or not

// =================================================================================
// ========= do not change anything bellow unless you are a master of PHP ==========
// =================================================================================

// Backup

$auth = base64_encode(“$cpanel_user” . “:” . “$cpanel_password”);

if ($secure) {
$url = “ssl://” . $domain;
$port = 2083;
} else {
$url = $domain;
$port = 2082;
}

$socket = fsockopen($url, $port);
if (!$socket) {
exit(“Failed to open socket connection.”);
}

if ($ftp) {
$params = “dest=ftp&server=$ftpserver&user=$ftpusername&pass=$ftppassword&port=$ftpport&rdir=$ftpdirectory&submit=Generate Backup”;
} else {
$params = “submit=Generate Backup”;
}

fputs($socket, “POST /frontend/” . $theme . “/backup/dofullbackup.html?” . $params . ” HTTP/1.0\r\n”);
fputs($socket, “Host: $domain\r\n”);
fputs($socket, “Authorization: Basic $auth\r\n”);
fputs($socket, “Connection: Close\r\n”);
fputs($socket, “\r\n”);

while (!feof($socket)) {
$response = fgets($socket, 4096);
echo $response;
}

fclose($socket);

// delete old file from ftp if FTP set to true

if ($ftp) {
// set up basic connection
$conn_id = ftp_connect($ftpserver);

// login with username and password
$login_result = ftp_login($conn_id, $ftpusername, $ftppassword);

if ($login_result) {

$filelistname = ftp_nlist($conn_id, $ftpdirectory);

foreach ($filelistname as $key => $value) {
$file = $ftpdirectory . $value;
$mdftime = ftp_mdtm($conn_id, $file);
if (($value!==”.”) && ($value !==”..”) && ((time() – $mdftime) > $daytostore * 86400)) {
// try to delete $file
if (ftp_delete($conn_id, $file)) {
echo “$file deleted successful\n”;
} else {
echo “could not delete $file\n”;
}
}
}

// close the connection
ftp_close($conn_id);
}
else {
echo “FTP connection Failed”;
}

}

// send report email

if ($email_to_report !== “”) {
$attime = date(‘d-m-Y H:i:s’);
$to = $email_to_report;
$subject = ‘Auto backup for ‘ . $domain . ‘ at ‘ . $attime . ‘ successful.’;
$message = ‘Auto backup for ‘ . $domain . ‘ at ‘ . $attime . ‘ successful.’;
$headers = ‘From: autobackupreport@’ . $domain . “\r\n” .
‘Reply-To: autobackupreport@’ . $domain . “\r\n” .
‘X-Mailer: PHP/’ . phpversion();

mail($to, $subject, $message, $headers);
}

?>

–> Este tutorial você também pode ler aqui

27 Comentários

  1. fabrice disse:

    Oi Bruno,
    Gostei do post, da dica e da qualidade das explicações. Agora é só aplicar.

  2. Ricardo disse:

    Bruno, muito bom seu post.

    Mas como faria para salvar esse backup no AWS S3?

    Obrigado!

    • Bruno Riggs disse:

      Ricardo, este script PHP é elaborado para enviar o backup à um serviço de FTP, se o AWS possuir conexão FTP você pode colocar as informações de conexão do FTP e gerar a cópia, mas não sei se o AWS tem FTP. Acredito que em qualquer serviço que possua FTP você consiga utilizar este recurso.

  3. Olá bruno, vi uma pergunta sua em outro post sobre esse assunto, e agora encontrei aqui e pelo que pude reparar você conseguiu fazer funcionar. tenho uma dúvida aqui, esse backup que o script gera é um backup completo incluindo o mysql ? Ele gera um arquivo zip em uma determinada pasta no diretório /home ? são alguma dúvidas que tenho aqui, pois tenho muitos sites e preciso ter segurança disso. Obrigado. So mais um detalhe, tenho um outro software que faz backup do ftp para meu pc, então pensei em jogar a tarefa cron para as 6 da manhã e deixar a tarefa na minha maquina agendada para as 6:30h que ai copia para meu pc o backup gerado pelo servidor. Seria isso ou o script salva já automatico no meu computador?

  4. Amigo o e-mail a cima está com problemas, então se puder me responder pelo e-mail do gmail agradeço, estou precisando de uma ajudinha para gerar esse backup. Obrigado.

    • Bruno Riggs disse:

      Jeferson, desta forma que foi configurado ele gera um backup em formato compactado de toda sua pasta HOME, ou seja, ele vai pegar todas as pastas de banco de dados, e-mails, public_html, cgi, e por ai vai. É de fato um backup FULL. Após gerar esse backup você pode baixar para o FTP.

      • Olá Bruno venho tirar mais uma dúvida aqui sobre esse assunto. É somente eu copiar esse script ou preciso mudar as aspas, pois aqui as aspas duplas contam como erro no dreamweaver. Obriagado

        • Bruno Riggs disse:

          Neste caso eu te aconselho a testar, mas acredito que você tenha que mudar as aspas sim, infelizmente o WordPress aqui deu uma editada, mas antes tente usar outro editor de texto que não seja o Dreamweaver, tente o sublime-text ou notepad++. Valeu.

  5. Está dando um erro na linha 82 if (($value!==”.”) && ($value !==”..”) && ((time() – $mdftime) > $daytostore * 86400))

  6. Amigo se eu lhe mandar o arquivo você vão da uma olhadinha nessa linha. ou então mande um link de um que tenha para eu fazer o download, cara estou tentando e pra falar a verdade já baixei vários de outros lugares só que o deles não tem diretório para ficar o arquivo de backup então não seu se está funcionando ou não, pois o arquivo eu não encontro. Se puder da uma ajuda ai amigo, estou precisando disso faz tempo e ainda não consegui. Obrigado.
    jefmachia@gmail.com ou jeferson@techmach.com.br

  7. Bruno consegui fazer funcionar, arranquei aquela linha lá que estava dando erro, mas aquela linha é a que apaga o backup existente poderia apenas verificar no seu codigo o erro que estava dando aqui para ver se resolvo esse pedacinho vou te mostrar a parte de cortei e funcionou, ai se puder dar uma olhadinha no seu código e me passar essa linha agradeço.

    if (($value!==”.”) && ($value !==”..”) && ((time() – $mdftime) > $daytostore * 86400)) {
    // try to delete $file
    if (ftp_delete($conn_id, $file)) {
    echo “$file deleted successfuln”;
    } else {
    echo “could not delete $filen”;
    }
    }

  8. Obrigado Bruno, está funcionando show de bola agora depois que me mandou…Abração

  9. Marcos disse:

    opa preciso de um help esstou com problemas nesse codigo php no caractere @ dos emails e usuario de ftp

  10. alberto disse:

    amigo, estou tendo um problema com o “@”. Na minha senha do ftp tem o arroba e ta dando erro de sintax, como resolver sem trocar a senha?

  11. edgar disse:

    Já tentei de diversas formas e scripts similares, mas não consegui fazer funcionar.

    Sempre recebo a mensagem:
    Warning: fsockopen(): unable to connect to xxxx.com.br:2082 (Connection refused) in /home/xxxxx/backup3.php on line 45
    Failed to open socket connection… Bailing out!n

    obs: xxxxx – informações protegida!

    Pode me ajudar?

  12. Andreas Barbeiro disse:

    Bruno e galera, tudo bem? Estou com um problema no meu código quando subi no server:

    Warning: fsockopen(): unable to connect to ssl://meudominio.com.br:2083 (Connection refused) in /home/domain/public_html/backup/backup.php on line 57
    Failed to open socket connection.

    Eu tenho pela Locaweb. O que me disseram pelo que avaliaram é que preciso de um IP dedicado e um certificado próprio.
    Não sei se seria porque o servidor é compartilhado.
    O código está exatamente igual a este acima. Coloquei e testei todos os itens (username, password, ftp, etc). Alguém consegue me ajudar?
    Abs!

    • Bruno Riggs disse:

      Olha, você vai me desculpar, mas em se tratando de LOCAWEB eu duvidaria de tudo. Tudo o que funciona bem em outros servidores, no deles dá problema, nunca indico. Testei o código novamente aqui e funcionou de boa. Pelo que entendo esse fsockopen() significa que o servidor não te dá permissão para salvar nessa pasta.

  13. josemar disse:

    boa tarde, o meus arquivo esta dando este erro o que pode ser ja que eu copiei ele exatamente igual acima, meu servidor é da hostgator
    Parse error: syntax error, unexpected ‘@’ in /home/phoenixc/BackupAuto2.php on line 13

  14. Ricardo disse:

    Ola bruno,
    Estou tendo o seguinte problema:
    Parse error: syntax error, unexpected ‘:’ in /home/…/public_html/backup.php on line 35

    35 $url = “ssl://” . $domain;

    Não vejo erro, mas… como resolver?

  15. Luiz disse:

    Boa tarde,

    Segui todos os procedimentos e estou tendo o seguinte erro: “Parse error: syntax error, unexpected T_VARIABLE in /home/meudominio/backup.php on line 32

    Linha 32: $auth = base64_encode(“$cpanel_user” . “:” . “$cpanel_password”);

    Antes estava reclamando do ‘@’ usado com o meu email na linha 13 (no campo $email_to_report = “”;) e resolvi deixar em branco.

    Erro anterior:
    PHP Parse error: syntax error, unexpected ‘@’ in /home/meudominio/backup.php on line 13

  16. Luiz disse:

    Meu PHP é o 5.2

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *