Automatyczny backup aplikacji napisanej w Laravelu do Dropboxa

Paweł Mysior
30 czerwca 2018

W tym wpisie opiszę jak w łatwy sposób skonfigurować mechanizm automatycznego tworzenia kopii zapasowej bazy danych i plików dla aplikacji napisanej w Laravelu.

Po co kopia bezpieczeństwa?

Mechanizm regularnego i automatycznego tworzenia kopii zapasowej danych to ważny element każdej aplikacji. Jest to szczególnie istotne gdy używasz prywatnego serwera VPS. Wielu dostawców serwerów VPS, takich jak Digital Ocean, Linode, AWS czy popularne w Polsce Homecluod.pl, nazwa.pl czy OVH.com robi kopie bezpieczeństwa serwera we własnym zakresie. Kopie te jednak są wykonywane rzadko, na przykład raz na tydzień. U niektórych dostawców usługi automatycznego tworzenie kopii bezpieczeństwa są dodatkowo płatne. Nierzadko kopie bezpieczeństwa są trzymane w tych samych centrach danych co serwer, w związku z czym przy awarii całego centrum, dane mogą okazać się nie do odzyskania.

Na szczęście możemy w łatwy sposób skonfigurować mechanizm, który codziennie w nocy wykona kopię zapasową bazy danych i wybranych plików po czym zapakuje to w archiwum ZIP i wyśle na naszego Dropboxa.

Wykonywanie kopii bezpieczeństwa

Zacznijmy od zainstalowania paczki spatie/laravel-backup:

composer require spatie/laravel-backup

Jeśli używamy paczki w aplikacji opartej na Laravel 5.5 lub wyższym, service provider zarejestruje się automatycznie.

Zainstalowanie paczki dodało nowe komendy do artisana. Żeby stworzyć kopię zapasową wykonujemy komendę:

php artisan backup:run

Paczka wykona kopię zapasową bazy danych oraz plików i zapisze ją na serwerze w folderze storage/app. Dodatkowo informacja o wykonanej kopii zapasowej zostanie wysłana na nasz adres email. Najpierw musimy go jednak skonfigurować. Wykonajmy komendę:

php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

W nowym pliku config/backup.php możemy ustawić wiele parametrów, na przykład które foldery mają być częścią kopii zapasowej. Na chwilę obecną interesuje nas klucz notifications.mail.to, w którym ustawiamy nasz adres email.

Zautomatyzowanie wykonywania kopii bezpieczeństwa

Użyjmy systemu schedulera Laravela w celu zautomatyzowania wykonywania kopii bezpieczeństwa. W pliku app/Console/Kernel.php dodajmy kod:

protected function schedule(Schedule $schedule)
{
   $schedule->command('backup:clean')->daily()->at('01:00');
   $schedule->command('backup:run')->daily()->at('02:00');
}

Codziennie o godzinie 1 w nocy zostanie wywołana komenda php artisan backup:clean, która wyczyści przedawnione kopie bezpieczeństwa w celu ograniczenia zajmowanego przez nie miejsca. Domyślnie dzienne kopie bezpieczeństwa są przechowywane przez 16 dni. Dokładną strategię czyszczenia przedawnionych kopii bezpieczeństwa możemy ustawić w piku config/backup.php.

Następnie o godzinie 2 w nocy zostanie wywołana komenda php artisan backup:run która wykona kopię bezpieczeństwa.

Jeśli nigdy wcześniej nie używałeś schedulera, musisz go najpierw skonfigurować. Wystarczy pojedynczy wpis w cronie. Więcej w dokumentacji.

Wysyłanie kopii bezpieczeństwa na Dropboxa

Żeby wysyłać kopię bezpieczeństwa na Dropboxa musimy najpierw zainstalować sterownik Dropboxa dla Flysystem, z którego korzysta Laravel. Zainstalujmy paczkę spatie/flysystem-dropbox:

composer require spatie/flysystem-dropbox

Następnie stwórzmy DropboxServiceProvider:

<?php

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Storage::extend('dropbox', function ($app, $config) {
            $client = new DropboxClient(
                $config['authorization_token']
            );

            return new Filesystem(new DropboxAdapter($client));
        });
    }
}

I dodajmy go do tablicy providers w pliku config/app.php.

Następnym krokiem jest skonfigurowanie dysku dropbox w pliku config/filesystems.php. Do tablicy disks dodajmy element:

'dropbox' => [
    'driver' => 'dropbox',
    'authorization_token' => env('DROPBOX_AUTHORIZATION_TOKEN'),
],

Musimy teraz uzyskać authorization token z Dropboxa. Zaloguj się do Dropboxa i stwórz nową aplikację Dropbox API. Następnie przejdź do nowo stworzonej aplikacji i znajdź przycisk "Generate" w sekcji "Generated access token". Wygeneruj token i dodaj go do pliku .env:

DROPBOX_AUTHORIZATION_TOKEN=wygenerowany_token_od_dropboxa

W tym momencie mamy już dostępny dysk o nazwie dropbox, którego możemy używać w dowolnym miejscu w naszej aplikacji.

Ostatnim krokiem jest zmodyfikowanie pliku config/backup.php:

'disks' => [
    'local',
    'dropbox',
],

Kopia bezpieczeństwa będzie zapisywana lokalnie na serwerze i wysyłana na Dropboxa.

Podsumowanie

W ten łatwy sposób ustawiliśmy mechanizm automatycznego i regularnego tworzenia kopii zapasowej bazy danych i plików dla naszej aplikacji. Kopie bezpieczeństwa zapisują się na serwerze i na Dropboxie, dzięki czemu gdy nasz serwer padnie, będziemy mogli odzyskać dane z Dropboxa.

Zamiast Dropboxa moglibyśmy użyć na przykład S3, Google Drive lub dowolnego innego systemu, do którego istnieje sterownik dla Flysystem.

Paczkę spatie/laravel-backup możemy też, na przykład, skonfigurować w ten sposób, żeby wysyłała powiadomienia na Slacka. Wystarczy poświęcić kilka minut na [konfigurację powiadomień Slack] (https://laravel.com/docs/notifications#slack-notifications) a potem ustawienie w konfiguracji paczki by używała tego kanału dla powiadomień.

Dajcie znać w komentarzach jeśli macie jakieś pytania lub problemy. Chętnie dowiem się też jakie macie własne rozwiązania dla tworzenia kopii bezpieczeństwa.

Wygodny hosting zapewnia duet DigitalOceanLaravel Forge.
Copyright © laravelpolska.com

Drogi Użytkowniku!

Dalsze korzystanie z serwisu bez zmiany ustawień dotyczących cookies w przeglądarce oznacza akceptację plików cookies, co będzie skutkowało zapisywaniem ich na Twoich urządzeniach przez serwis internetowy laravelpolska.com. Jeśli nie wyrażasz zgody na przyjmowanie cookies, prosimy o zmianę ustawień w przeglądarce lub o opuszczenie serwisu. więcej

Stosujemy pliki cookies (tzw. ciasteczka) i inne pokrewne technologie, które mają na celu:

  • dostosowanie zawartości stron internetowych Serwisu do Twoich preferencji oraz optymalizacji korzystania ze stron internetowych; w szczególności pliki te pozwalają rozpoznać Twoje urządzenie i odpowiednio wyświetlić stronę internetową, dostosowaną do Twoich indywidualnych potrzeb;
  • utrzymanie Twojej sesji w Serwisie (po zalogowaniu), dzięki czemu nie musisz na każdej podstronie Serwisu ponownie wpisywać loginu i hasła,
  • zapewnienie bezpieczeństwa podczas korzystania z Serwisu,
  • ulepszenie świadczonych przez nas usług poprzez wykorzystanie danych w celach analitycznych i statystycznych,
  • poznanie Twoich preferencji na podstawie sposobu korzystania z naszych serwisów.

Wykorzystanie cookies pozwala nam zapewnić maksymalną wygodę przy korzystaniu z naszego Serwisu poprzez zapamiętanie Waszych preferencji i ustawień na naszych stronach. Więcej informacji o zamieszczanych plikach cookie oraz o możliwości zmiany ustawień przeglądarki oraz polityce przetwarzania danych znajdziesz w polityce prywatności.

Masz możliwość samodzielnej zmiany ustawień dotyczących cookies w swojej przeglądarce internetowej. Z poziomu przeglądarki internetowej, z której korzystasz, możliwe jest zarządzanie plikami cookies. W najpopularniejszych przeglądarkach istnieje m.in. możliwość:

  • zaakceptowania obsługi cookies, co pozwala na pełne korzystanie z opcji oferowanych przez witryny internetowe;
  • zarządzania plikami cookies na poziomie pojedynczych, wybranych przez użytkownika witryn;
  • określania ustawień dla różnych typów plików cookies, na przykład akceptowania plików stałych, jako sesyjnych itp.;
  • blokowania lub usuwania cookies.

Akceptuję pliki cookies