GitLab을 이용해 Notion 컨텐츠 정기적으로 백업하기

Jake Shin
Jake Shin | Full-Stack Engineer

최근 Notion 측의 DNS 문제로 전세계 Notion 서버가 한동안 다운되는 심각한 문제가 발생했습니다. 많은 사용자들이 Notion에 자료를 모아두기 때문에 이러한 장애로 불안함을 느끼고, 백업을 하고자 합니다. 이번 시간에는 GitLab과 Notion의 api를 활용해 Notion Workspace를 매일 자동으로 백업하는 방법을 살펴보겠습니다.

주의!
이 방법은 데이터만을 백업하기 위한 방법으로, 내보낸 파일을 재업로드하여 워크스페이스에 콘텐츠를 다시 생성할 수는 없습니다. Notion 워크스페이스를 이전하는 방법은 여기서 확인하세요. 또한, GitLab 무료 계정에는 용량 제한이 있기 때문에 다량의 대용량파일을 백업하기 위한 방법으로 적절하지 않을 수 있습니다.

1. GitLab 계정 등록하기

GitLab 계정이 없는 경우 GitLab.com에서 GitLab 계정을 생성하세요. 무료 계정은 10GB까지 데이터를 백업할 수 있습니다. 계정에 추가적인 보안을 원하시면 2FA를 설정하세요.

2. Notion 계정 토큰과 워크스페이스 id 추출하기

가장 어렵고 복잡한 단계입니다. 현재 Notion은 공식 api를 제공하지 않기 때문에, 백업 스크립트에서 개념 동작을 흉내내야 합니다. 이를 위해서 우리는 token_v2전체 워크스페이스 내보내기 리퀘스트의 spaceId를 추출해야 합니다.

구글 크롬에서 다음과 같은 방법으로 추출할 수 있습니다.

  • http://notion.so/에서 “설정과 멤버” → “설정”으로 이동하세요.
  • Command+Option+J (Mac)나 Control+Shift+J (Windows, Linux, Chrome OS)를 눌러서 크롬 개발자도구를 여세요.
  • 다음 스크린샷에서처럼 네트워크 탭으로 이동하세요.
  • XHR filter (1)를 활성화하고, clear console (2)을 누른 뒤, Notion에서 전체 워크스페이스 콘텐츠 내보내기를 클릭하고 (3), enqueueTask를 선택하세요 (4).
photo | 인포그랩 GitLab | 인포그랩 GitLab

열러있는 Headers 탭에서 cookie: 항목과 많은 텍스트가 나올 때까지 스크롤합니다. 이 텍스트에서 다음(5)와 같은 부분을 찾아야 합니다.

token_v2=xxx;

xxx는 매우 긴 숫자와 문자의 조합으로 되어있고 여러 줄로 이루어질 수 있습니다. token_v2=; 사이의 모든 텍스트를 복사하고 어딘가에 저장해두세요. 이를 NOTION_TOKEN_V2라 하겠습니다. 이 정보가 곧 필요할겁니다.

이제 맨 아래로 스크롤하고 Request Payload 섹션에서 다음(6)과 같은 부분을 확인할 수 있을겁니다.

spaceId: “4489c211-09d6-4069-ae3b-1665e25d6c03”

따옴표 내의 값을 저장하고, NOTION_SPACE_ID라 하겠습니다.

3. GitLab에서 push token 생성

백업을 업데이트하는 스크립트를 허용하기 위해서는 적절한 권한을 가진 토큰을 생성해야 합니다. GtiLab에서 Settings → Access Tokens로 이동하고 다음 스크린샷처럼 폼을 완성하세요.

photo | 인포그랩 GitLab | 인포그랩 GitLab

Create Personal access token을 누르면 Your new personal access token을 단 한 번 보여줍니다. 복사해서 저장하고, CI_PUSH_TOKEN이라 이름지어주세요. 나중에 필요합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

4. 백업을 저장할 GitLab 레포지토리 생성

새 프로젝트를 생성하고 원하는 프로젝트 이름을 입력한 뒤 본인만이 접근할 수 있도록 Private를 꼭 선택하세요. 다 하셨다면 Create Project를 클릭하세요.

5. CI/CD 스크립트 설정

프로젝트를 생성하면 빈 프로젝트 페이지로 리디렉션됩니다. Setup CI/CD 버튼을 클릭하세요.

photo | 인포그랩 GitLab | 인포그랩 GitLab

.gitlab-ci.yml파일 에디터가 열립니다. 여러분을 위해 스크립트를 준비했으니 여기서 스크립트를 복사해 붙여넣으세요: https://gitlab.com/aburtsev/notion-backup-script/-/raw/master/.gitlab-ci.yml

이 스크립트는 Notion의 백업 기능을 흉내내지만 .zip파일로 다운로드 받는 것이 아니라 GitLab 프로젝트에 업로드합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

Commit Change를 클릭하세요.

6. 백업 작업 스케줄링

스크립트가 준비가 되면 왼쪽 사이드바에서 CI / CD → Schedules로 이동하세요.

photo | 인포그랩 GitLab | 인포그랩 GitLab

New schedule을 클릭하세요.

photo | 인포그랩 GitLab | 인포그랩 GitLab

그러면 Schedule a new pipeline 폼이 열리는데, 필드를 하나하나 구성해봅시다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
  • Description: 원하는 설명을 작성해주세요 (예: Notion Backup)
  • Interval pattern: 언제 백업을 할지 결정하면 됩니다. 예시의 경우는 매일 새벽 4시에 백업이 진행됩니다. 백업을 하고싶은 0~59분/0~23시를 설정하세요. 예를 들어 오전 5시 42분에 백업을 하고싶다면 42 5 * * *라고 작성하면 됩니다. 값을 그냥 복사해 여러 사람이 같은 값을 사용하면 Notion 서버에 부하가 있으니 각자 다른 시간으로 설정해주세요. 스케줄 에디터를 사용하면 편하게 값을 구할 수 있습니다.
  • Cron Timezone: 여러분이 살고계신 곳의 timezone을 설정해주세요.
  • Target Brance: master로 두면 됩니다.
  • Variables: 지금까지 모아온 값들과 몇몇 추가사항을 여기 적어주면 됩니다.
NOTION_TOKEN_V2 step 2의 token_v2
NOTION_SPACE_ID step 2의 spaceId
CI_PUSH_TOKEN step 3의 토큰
EXPORT_FILENAME /tmp/export.zip
PYTHONUNBUFFERED 1
TZ https://en.wikipedia.org/wiki/List_of_tz_database_time_zones에서 찾아서 붙여넣으세요.
("TZ database name" 열, 우리나라는 Asia/Seoul 입니다)

됐습니다. 이제 Save pipeline schedule을 클릭하면 리스트에 새로운 파이프라인이 뜰겁니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

이제 play 버튼을 눌러서 수동으로 실행해 백업이 잘 작동하는지 확인하세요. progress circle이 녹색이 될때까지 몇 분 정도 걸립니다.

만약 실행 로그를 보고싶다면 Last Pipeline의 링크를 클릭해 실행중인 Job을 선택하세요.

백업이 끝나면 프로젝트 홈페이지에 백업 폴더를 확인할 수 있습니다. 이제 Notion이 생성한 콘텐츠를 확인할 수 있습니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

여기까지 오셨다면, 축하합니다! 매일 설정한 시간에 Notion을 백업할 준비가 됐습니다. 도움이 되셨길 바랍니다.

본 포스트는 영문 포스트를 우리말로 번역해 내용을 추가한 글입니다.