라라벨 백업 패키지 spatie/laravel-backup free

2019-08-09

어제 모던 PHP 유저 그룹 페이스북에 슬픈 댓글이 하나 달렸습니다.


스크린샷 2019-08-09 오후 2.17.06.png



눈물이 ㅠ 저 분이 뭔가 부주의한 면도 있지만, 우리도 어떤 을 당하게 될지 아무도 모르는 거죠. 그래서 오늘은 벨 백업 패키지와 백업 암호화 방법을 준비했습니다.


spatie/laravel-backup


스파티에서 만든 벨 백업 패키지입니다. 파과 데이터베이스 모두 백업 가능하고, 벨에 설정한 파 시스템 어디로든 백업할 수 있습니다. 여러 파 시스템에 동시에 백업하는 것도 가능합니다. 백업이 잘 되고 있는지 모니터링하는 기능도 제공하고, 백업 중에 문제가 발생하면 다양한 채널을 통해 알림을 받을 수도 있습니다. 저장 공간을 너무 많이 사용하는 걸 방지하기 위해 오래된 백업을 지워주기도 합니다.


6 버전은 PHP 7.2 이상과 벨 5.8 이상을 필요로 합니다. PHP 7.2 미만을 사용 중이거나 벨 5.8 미만을 사용 중이면 5 이하 버전을 사용하면 됩니다.


설치 후 실행은 php artisan backup:run으로 할 수 있습니다. 벨의 스케쥴링을 이용하면 주기적으로 자동 백업을 할 수 있겠네요. 옵션을 이용해서 파만 백업한다던가, DB만 백업할 수도 있습니다. 다만 전체 백업인지 부만 백업인지 구분을 안해주기 때문에 복구할 때 조심하고 하네요. 세부적인 이용방법은 홈페이지에 잘 나와있고, 이해하기 쉽게 정리되어 있습니다.


백업 파에 암호걸기


백업 파도 유출되면 매우 위험합니다. 따서 혹시도 백업 파이 유출되더도 이용할 수 없도록 조치를 취할 필요가 있습니다. 사이먼 코를로스(Simon Kollross)Creating encrypted backups of Laravel apps 는 글에서 spatie/laravel-backup으로 백업시 암호를 거는 방법을 공유했습니다.


spatie/laravel-backup은 다양한 이벤트를 제공합니다. 이 중 백업 파을 저장하거나 전송하기 직전인 ‘백업 압축파 생성됨(BackupZipWasCreated) 이벤트‘를 활용하는 방법입니다.


다음과 같이 BackupZipWasCreated 이벤트가 발생할 때 이를 처리할 리스너를 작성합니다.


<?php

namespace App\Listeners;

use ZipArchive;
use Illuminate\Support\Collection;
use Spatie\Backup\Events\BackupZipWasCreated;

class EncryptBackupZip
{
public function handle(BackupZipWasCreated $event)
{
$zip = new ZipArchive;
$zip->open($event->pathToZip);
$zip->setPassword(config('app.backup.password'));

Collection::times($zip->numFiles, function ($i) use ($zip) {
$zip->setEncryptionIndex($i - 1, ZipArchive::EM_AES_256);
});

$zip->close();
}
}

Collection::times()는 지정한 횟수만큼 콜백을 실행해서 새 컬렉션을 만드는 메서드입니다.


$collection = Collection::times(10, function ($number) {
return $number * 9;
});

$collection->all();

// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

서 코드를 해석해보면 다음의 순서로 진행됩니다.



  • ZipArchive 객체를 만듦

  • ZipArchive 객체를 이용해서 이벤트로 넘어온 압축 파을 엶

  • 패스워드를 설정함

  • 압축 파을 하나씩 순회하며 암호화 메서드를 AES-256으로 지정

  • 압축 파을 닫음


이제 php artisan backup:run으로 백업을 하면 AES-256으로 암호화된 비밀번호가 설정됩니다. 백업 파의 압축을 해제하려고 하면 비밀번호 입력창이 나타납니다.


마치며


오늘은 벨 백업 패키지와 이를 이용해 백업을 할 때 암호화하는 방법을 소개했습니다. 이야기의 시작을 아티즌 커맨드로 코드와 데이터베이스가 망가진 분의 사례로 시작했지만 개발 중인 소스코드는 버전 관리 소프트웨어를 적극 활용한다면 굳이 백업이 필요 없고, 개발 중인 데이터베이스도 마이그레이션과 시더를 잘 활용하고 있었다면 큰 문제가 없었을 겁니다. 실서버의 경우 소스 코드는 git이 있으니 역시나 백업이 필요하지 않지만 이미지 파 등은 이 패키지로 백업을 정기적으로 하면 도움이 될 것 같네요. 데이터베이스의 경우 실서버면 아마도 별도의 백업 플랜이 있거나, 클우드 서비스에서 자동으로 백업을 해줄 겁니다. 별도의 백업 플랜이 없다면 이 패키지로 백업을 해보는 것도 좋을 듯 합니다. 뭐가 됐던간에 코드나 데이터 날려먹을 없게 잘 대비합시다! :)


1 1 벨 30호
2019년 8월 9



이현석

바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.