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.