Criar um backup completo no painel Cpanel automático

Para quem tem revenda de hospedagem, Backup é sempre uma solução e um problema. Solução porque com as ferramentas que o Cpanel oferece, em poucos minutos você pode fazer um backup e restaurar com processo bem simples. O Problema que você nunca sabe como a empresa de hospedagem lida com o armazenamento de backups e isso pode ser uma dor de cabeça.

Há muitos relatos de armazenamento de backup de servidores que foram feitos no mesmo local onde fica hospedado o site, e quando o HD estraga o site e o backup se perdem. Outras empresas disponibilizam apenas 1 Backup. Com ataque de hackers o site pode ter script maliciosos. Muitas vezes a correção demorar para acontecer. Pronto! o novo Backup é gerado como script malicioso junto.

Para ter um pouco de paz com relação aos Backups existe um script famoso criado em 2009 no fórum do Cpanel que infelizmente não foi implementado no painel. Mas que para quem tem revenda de hospedagem é uma solução paliativa para o problema de Backups. Pois a restauração é feita de forma manual. Mas é uma forma de se precaver.

Estes dados que estão no script deve sem alterados:

A senha com caracteres especiais geralmente dão problemas. Você pode criar uma nova conta no Cpanel apenas para o Backup e criar uma senha com números e letras. Busque no painel “Gerenciador de usuários” para adicionar um novo usuário

<?php

// Configurações do cPanel
$cpanel_user = "SEU_USUARIO_CPANEL";
$cpanel_pass = "SUA_SENHA_CPANEL";
$cpanel_host = "SEU_HOST_CPANEL";

// URL para a API de backup completo
$api_url = "https://$cpanel_host:2083/json-api/cpanel?cpanel_jsonapi_version=2&cpanel_jsonapi_func=fullbackup&cpanel_jsonapi_module=Backup&dest=homedir";

// Inicializa cURL
$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERPWD, $cpanel_user . ":" . $cpanel_pass);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

// Executa o request
$response = curl_exec($ch);

// Verifica erros
if (curl_errno($ch)) {
    echo 'Erro no cURL: ' . curl_error($ch);
} else {
    // Verifica o status do request
    $result = json_decode($response, true);
    if (isset($result['cpanelresult']) && $result['cpanelresult']['error'] == 0) {
        echo "Backup iniciado com sucesso!";
    } else {
        echo "Erro ao iniciar o backup: " . $result['cpanelresult']['data']['error'];
    }
}

// Fecha cURL
curl_close($ch);

Receber Notificações por E-mail:

Adicionar um e-mail para receber uma notificação de conclusão do backup pode ser útil. Você pode ajustar o script para enviar um e-mail com o status de conclusão do backup, o que ajudaria a identificar se o processo foi realmente concluído ou se houve algum problema.

Adicione o parâmetro email para receber a notificação:

$api_url = "https://$cpanel_host:2083/json-api/cpanel?cpanel_jsonapi_version=2&cpanel_jsonapi_func=fullbackup&cpanel_jsonapi_module=Backup&dest=homedir&email=seu_email@dominio.com";

Transferir o Backup para Outro Servidor (Usando FTP/SFTP):

Após o backup ser gerado, você pode usar FTP ou SFTP para transferir o arquivo para outro servidor. Aqui está um exemplo simples usando FTP:

Estamos guardando nossos dados no https://www.ftpcloud.com.br/. Consideramos o custo benefícios bom, o melhor preço seria o S3 da Amazon, mas para habilitar o acesso ao FTP ficaria muito caro.

<?php

// Dados do servidor FTP
$ftp_server = "ftp.seudominio.com";
$ftp_username = "usuario";
$ftp_password = "senha";

// Caminho do arquivo de backup no servidor - Exemplo:
$local_file = "/home/user/backups/backup-YYYY-MM-DD.tar.gz";
$remote_file = "/remote/path/backup-YYYY-MM-DD.tar.gz";

// Conecta ao servidor FTP
$conn_id = ftp_connect($ftp_server);

// Faz login
if (@ftp_login($conn_id, $ftp_username, $ftp_password)) {
    echo "Conectado ao servidor FTP.\n";
} else {
    echo "Erro ao conectar ao servidor FTP.\n";
    exit;
}

// Ativa o modo passivo, necessário em alguns servidores FTP
ftp_pasv($conn_id, true);

// Faz upload do arquivo
if (ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
    echo "Arquivo transferido com sucesso.\n";
} else {
    echo "Erro ao transferir o arquivo.\n";
}

// Fecha a conexão FTP
ftp_close($conn_id);

Você deve colocar o script na pasta HOME/NomeUsuario/ do seu servidor

Você precisa dar permissão 750 para o arquivo. Clique no botão direito de seu mouse e escolha mudar permissões (Change Permissions).

Agora precisamos criar a tarefa cron job para agendar a automatização dos nossos Backups. Nós colocamos para executar 1 vez por semana. Acesse seu Cpanel busque por Trabalhos Cron. Você pode também colocar um e-mail para ser notificado da execução dos agendamentos.

Observação: mude o comando para seu usuários de Cpanel. No nosso exemplo o nosso usuário é meusite.

O comando ficará desta forma:

0 	0 	* 	* 	0 	php -f /home/meusite/backup.php

Como fazer para enviar ao Google Drive

Para enviar um backup para o Google Drive automaticamente usando um script PHP, você precisará utilizar a Google Drive API e o OAuth 2.0 para autenticação. O processo é um pouco mais complexo, pois envolve a configuração de credenciais da API e a geração de tokens de autenticação. Aqui estão os passos gerais:

1. Configurar a API do Google Drive:

  1. Criar um Projeto no Google Cloud Console:
  2. Ativar a API do Google Drive:
    • No menu de navegação, acesse “APIs & Serviços” > “Biblioteca”.
    • Pesquise por “Google Drive API” e ative-a.
  3. Criar Credenciais OAuth 2.0:
    • Vá para “APIs & Serviços” > “Credenciais”.
    • Clique em “Criar credenciais” e selecione “ID do cliente OAuth”.
    • Configure uma tela de consentimento OAuth e adicione seu aplicativo.
    • Escolha “Aplicativo para Web” para o tipo de aplicativo.
    • Faça o download do arquivo credentials.json gerado, ele será necessário no script PHP.

2. Instalar a Biblioteca PHP do Google Client:

Você precisará da biblioteca oficial da Google API para PHP. Se você estiver usando Composer, execute o seguinte comando:

composer require google/apiclient:^2.0

Se não estiver usando Composer, pode baixar o Google API Client manualmente.

3. Script PHP para Fazer o Upload:

Aqui está um exemplo de como você pode configurar um script para fazer upload de um arquivo no Google Drive.

<?php

require 'vendor/autoload.php'; // Caso esteja usando Composer

use Google\Client;
use Google\Service\Drive;

// Caminho para o arquivo de credenciais (credentials.json)
$credentialsPath = 'credentials.json';

// Função para autenticação com o Google Drive
function getClient()
{
    $client = new Google\Client();
    $client->setAuthConfig('credentials.json');
    $client->addScope(Google\Service\Drive::DRIVE_FILE);
    $client->setAccessType('offline');

    // Caminho para armazenar o token de autenticação
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // Solicita novo token caso o antigo tenha expirado
    if ($client->isAccessTokenExpired()) {
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            $authUrl = $client->createAuthUrl();
            printf("Abra o seguinte link no seu navegador:\n%s\n", $authUrl);
            print 'Insira o código de autenticação: ';
            $authCode = trim(fgets(STDIN));
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }

        // Salva o token para uso futuro
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;
}

// Função para fazer o upload de arquivo no Google Drive
function uploadToGoogleDrive($filePath, $fileName)
{
    $client = getClient();
    $driveService = new Google\Service\Drive($client);

    // Arquivo que será enviado
    $file = new Google\Service\Drive\DriveFile();
    $file->setName($fileName);

    // Define o conteúdo do arquivo a ser enviado
    $content = file_get_contents($filePath);
    
    // Envia o arquivo para o Google Drive
    $createdFile = $driveService->files->create($file, [
        'data' => $content,
        'mimeType' => 'application/gzip', // Mude conforme o tipo de arquivo
        'uploadType' => 'multipart'
    ]);

    printf("Arquivo enviado com sucesso! ID do arquivo: %s\n", $createdFile->id);
}

// Caminho do backup que deseja enviar
$backupFilePath = '/caminho/do/seu/backup.tar.gz';
$backupFileName = 'backup-' . date('Y-m-d') . '.tar.gz';

// Faz o upload para o Google Drive
uploadToGoogleDrive($backupFilePath, $backupFileName);

4. Executar o Script:

  • Na primeira execução, o script pedirá que você abra um link no navegador para autorizar o aplicativo a acessar o Google Drive.
  • Você precisará pegar o código gerado e colá-lo no terminal (ou onde estiver executando o script).
  • Após a autenticação, um arquivo token.json será salvo, contendo o token de autenticação, para que você não precise se autenticar todas as vezes.

5. Agendar o Script Automaticamente:

Assim como no caso anterior, você pode agendar a execução deste script no Cron Jobs do cPanel. Isso vai permitir que o backup e o upload sejam feitos automaticamente em horários específicos.

Considerações Finais:

  • Limite de API: Verifique as cotas da API do Google Drive, pois existe um limite de uploads diários.
  • Segurança: Como você estará lidando com arquivos importantes (backups), certifique-se de proteger seu arquivo de credenciais e token.

Espero que tenha ajudar na sua revenda de hospedagem a ter um pouco mais de tranquilidade nos Backups. Até o próximo post.

Gostou do Assunto? Compartilhe com seus amigos!

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.