DAV 3. Nextcloud 를 끄면서 캘린더와 연락처를 직접 만든 CalDAV 서버로 옮기기
춘천 리전에 Nextcloud 서버가 하나 있었습니다. 1코어 4GB 인스턴스에서 이것저것 다 켜 둔 Nextcloud 를 돌리고 있었는데, 들여다보니 상태가 좋지 않았습니다. 관리용 마스터 컨테이너는 반년 전에 멈춰 있었고, 이미지 갱신 스크립트는 더 이상 갱신되지 않는 태그를 받고 있어서 아무것도 받지 못했습니다. 버전도 지원이 끝난 계열이었고요. 디스크는 89% 가 차 있었는데 주범은 오피스 편집기 컨테이너가 쌓아 둔 임시 파일이었습니다.
실제로 쓰고 있는 기능을 세어 보니 많지 않았습니다. 파일 조금, 그리고 휴대폰 두 대가 DAVx⁵ 로 동기화하는 캘린더와 연락처. 메신저 기능은 마지막 활동이 1년 가까이 전이었습니다. 그래서 새 노드로 옮기지 않고 끄기로 했습니다.
파일은 PC 로 내려받고, 서버에서 만든 SHA-256 목록과 PC 쪽 파일을 하나하나 대조해 모두 맞는 것을 확인했습니다.
캘린더와 연락처는 갈 곳이 있었습니다. 마침 Go 로 직접 만든 CalDAV/CardDAV 서버를 운영하기 시작한 참이었거든요. Nextcloud 에서 캘린더는 일정 하나당 .ics 하나로, 연락처는 한 명당 .vcf 하나로 꺼냈습니다. 제 계정은 일정 53개, 연락처 15명이었습니다.
넣는 쪽은 서버에 명령을 하나 만들었습니다.
dav import <사용자> <calendar|addressbook> <컬렉션> <파일 또는 폴더>...
규칙은 이렇게 정했습니다.
- 먼저 다 검사하고 나서 씁니다. 모든 파일을 DAVx⁵ 가 PUT 할 때와 같은 규칙으로 먼저 검사해서, 하나라도 어긋나면 아무것도 쓰지 않습니다. 반쯤 들어간 캘린더를 정리하는 일은 하고 싶지 않았습니다.
- 만들기만 합니다.
If-None-Match: *로 PUT 하는 것과 같아서, 같은 이름이나 같은 UID 가 이미 있으면 건너뜁니다. 그래서 몇 번을 다시 돌려도 안전합니다. 서버에 원래 있던 일정 하나, 연락처 둘과도 겹치지 않았습니다. - 원문 그대로 저장합니다. 이 서버는 원래
.ics와.vcf를 원문 그대로 두고 동기화에 필요한 UID, ETag 같은 것만 읽습니다. 가져올 때도 내용을 고치지 않습니다. - 푸시 알림은 안 보냅니다. 서버가 떠 있어도 돌릴 수 있지만, 휴대폰은 다음 주기 동기화 때 새 일정을 받습니다.
운영 서버는 컨테이너라 파일을 데이터 폴더 아래에 두고 컨테이너 안에서 불렀습니다.
sudo docker compose exec -T dav /dav import <사용자> calendar default /data/import/calendar
넣기 직전에 데이터베이스 사본을 하나 떠 두고, 넣은 뒤에는 가져온 파일 폴더를 지웠습니다.
한 가지 걸린 게 있었습니다. 다른 사용자 한 명의 일정 7개는 못 넣었습니다. 이 서버는 사용자가 처음 로그인할 때 계정과 기본 캘린더를 만드는데, 그 사용자가 아직 한 번도 로그인한 적이 없었거든요. 백업은 받아 두었으니 로그인하고 나면 같은 명령으로 넣으면 됩니다.
휴대폰 쪽도 챙길 게 있습니다. DAVx⁵ 계정이 옛 Nextcloud 를 보고 있으면 서버를 끄는 순간 동기화가 멈추니, 계정을 새 서버로 바꿔 주는 것까지가 이전입니다.