개요
한 달 전 사용하던 오라클 클라우드로부터 벤 당했습니다. 증상은 제가 운영하던 블로그 및 기타 서비스로 접속을 할 수 없었고, 오라클 클라우드 로그인 시도 시, 아무리 비밀번호를 수정해도 비밀번호가 틀렸다고 나옵니다.
지원 티켓도 끊어봤지만, 최종적으로 상담사와 연결이 되어야 했고, 상담사 왈 '넌 벤이다. 이유는 알려줄 수 없다. 너의 파일에도 접근할 수 없다'만 반복합니다..... 찾아보니 이런 일이 비일비재하더군요. 아래는 다른 외국인의 사례인데, 저도 비슷한 대화를 했습니다.
Erik Uden 🍑 (@ErikUden@mastodon.de)
첨부: 1장의 이미지 This is a public service announcement to **never** ever use Oracle
mastodon.de
저 같은 경우도 예고 없이 이런 일을 당했기 때문에 전체 데이터를 잃어버릴 뻔 했으나, 다행히 블로그에 써놨던 여러 글들처럼 블로그와 Teldrive의 DB를 매일 백업하고 있었기 때문에 큰 문제는 없었습니다.
이번 글에서는 백업한 Teldrive DB파일을 이용해 로컬에서 Teldrive를 복원하는 글을 적어보려 합니다.
실제로 제 Teldrive를 복원하는 과정이며, 백업했던 SQL을 psql로 밀어넣는 과정이 전부입니다.
Teldrive 설치
config.toml 수정하기
백업해놓았던 config.toml을 가져와서 조금 편집해야 합니다. 기본적으로 다른 환경에서 복원하는 것을 가정하고 있으므로, db username, db password, db host, db name이 모두 다를 수 밖에 없습니다. 여기서 사용한 것 그대로 docker compose에 가야 합니다. db host의 경우 이 아래에서 설명할 compose를 사용하실 경우 postgres_db가 됩니다.
또한, Supabase 사용 시 필요했던 prepare-stmt = false가 빠지고, 최신 기능으로 추가된 cronjobs를 추가했습니다.
기타 그 외 app-id, app-hash는 원래 사용하시던 것을 사용하시면 됩니다. 잊어버리셨다면 여기서 확인 가능합니다.
[db]
data-source = "postgres://<db username>:<db password>@<db host>/<db name>"
[db.pool]
enable = false
max-idle-connections = 25
max-lifetime = "10m"
max-open-connections = 25
[jwt]
secret = "abcd"
[cronjobs]
clean-files-interval = '1h'
clean-uploads-interval = '12h'
enable = true
folder-size-interval = '2h'
[tg]
app-id =
app-hash = "fwfwfwf"
[tg.uploads]
encryption-key = ""
retention = "7d"
threads = 4
또한, 예전 Teldrive 설치 시에는 session.db파일을 생성하도록 하고 있었으나, 최근에는 파일명이 storage.db로 변경되었습니다.
touch storage.db
최종적으로, 아래처럼 2개의 파일이 있어야 합니다.
컨테이너 실행하기
이를 유념하여 공식 홈페이지의 docker compose를 참조해 아래처럼 컨테이너를 띄우겠습니다.
services:
teldrive:
image: ghcr.io/tgdrive/teldrive
restart: always
container_name: teldrive
hostname: teldrive
volumes:
- ./config.toml:/config.toml
- ./storage.db:/storage.db
ports:
- 8080:8080
postgres_db:
image: ghcr.io/tgdrive/postgres:17-alpine
container_name: postgres_db
hostname: postgres_db
restart: always
ports:
- 5432:5432
environment:
- POSTGRES_USER=db username
- POSTGRES_PASSWORD=db password
- POSTGRES_DB=db name
volumes:
- ./data:/var/lib/postgresql/data
제대로 구성이 되었다면 아래와 같은 로그를 확인할 수 있습니다.
2025/02/12 05:34:41 OK 20230817172319_init.sql (41.83ms)
2025/02/12 05:34:41 OK 20231102165658_tables.sql (21.88ms)
2025/02/12 05:34:41 OK 20231104192800_functions.sql (4.82ms)
2025/02/12 05:34:41 OK 20231205180422_modify.sql (7.51ms)
2025/02/12 05:34:41 OK 20231208114142_alter.sql (2.94ms)
2025/02/12 05:34:41 OK 20231221245015_functions.sql (3.33ms)
2025/02/12 05:34:41 OK 20240120151952_modify_constraint.sql (4.01ms)
2025/02/12 05:34:41 OK 20240418215426_add_category_column.sql (4.29ms)
2025/02/12 05:34:41 OK 20240531194913_modify_constraint.sql (3.43ms)
2025/02/12 05:34:41 OK 20240607113052_modify_functions.sql (3.78ms)
2025/02/12 05:34:41 OK 20240607114052_modify_functions.sql (2.69ms)
2025/02/12 05:34:41 OK 20240607124052_modify_functions.sql (2.44ms)
2025/02/12 05:34:41 OK 20240609025818_constraint.sql (3.17ms)
2025/02/12 05:34:41 OK 20240610172736_modify_session.sql (3.44ms)
2025/02/12 05:34:41 OK 20240611190605_create_functions.sql (2.81ms)
2025/02/12 05:34:41 OK 20240612190605_modify_session.sql (3.7ms)
2025/02/12 05:34:41 OK 20240613190605_modify_session.sql (3.7ms)
2025/02/12 05:34:41 OK 20240615110350_constraint.sql (3.68ms)
2025/02/12 05:34:41 OK 20240711163538_search.sql (211.87ms)
2025/02/12 05:34:41 OK 20240715001936_index.sql (7.72ms)
2025/02/12 05:34:41 OK 20240718155942_index.sql (5.33ms)
2025/02/12 05:34:41 OK 20240718164345_function.sql (2.83ms)
2025/02/12 05:34:41 OK 20240727233913_modify.sql (2.71ms)
2025/02/12 05:34:41 OK 20240728154309_modify.sql (3.05ms)
2025/02/12 05:34:41 OK 20240802212949_uuid.sql (3.09ms)
2025/02/12 05:34:41 OK 20240802213957_alter_table.sql (31.28ms)
2025/02/12 05:34:41 OK 20240803003234_index.sql (3.61ms)
2025/02/12 05:34:41 OK 20240912164825_table.sql (9.29ms)
2025/02/12 05:34:41 OK 20240915100057_modify.sql (3.32ms)
2025/02/12 05:34:41 OK 20240915121635_function.sql (2.8ms)
2025/02/12 05:34:41 OK 20241213121739_index.sql (54.18ms)
2025/02/12 05:34:41 OK 20250105180250_index.sql (3.43ms)
2025/02/12 05:34:41 OK 20250121211747_index.sql (4.27ms)
2025/02/12 05:34:41 OK 20250125123315_index.sql (4.39ms)
2025/02/12 05:34:41 goose: successfully migrated database to version: 20250125123315
12/02/2025 05:34 AM INFO Server started at http://localhost:8080
IP:8080으로 접속되는 것을 확인했다면 Teldrive 컨테이너만 종료해 줍니다.
docker stop teldrive
Teldrive 복원하기
기존 글에서 리눅스에서 스크립트와 crontab을 이용하는 과정을 그대로 세팅하셨다면, 아래처럼 구글 드라이브에 꾸준히 최근 며칠간의 SQL파일이 업로드 되고 있었을 겁니다.
저는 TrueNAS의 Cloud Sync기능을 이용해 이것들을 로컬로 다운받는 과정까지 겸하고 있었습니다.
기존에 사용하던 db name, db username을 완벽하게 따라했다면 그냥 SQL파일을 사용하시면 되고, 값이 달라졌다면 noacl버전을 사용하면 됩니다. 이 글에선 noacl버전을 사용하겠습니다.
가장 최근 파일을 postgres컨테이너의 볼륨에 복사해 줍니다.
복사가 완료되었다면 postgres컨테이너에 진입해야 합니다. 위의 compose를 그대로 사용했다면 아래의 명령어를 통해 진입할 수 있습니다.
docker exec -it postgres_db /bin/bash
그럼 쉘이 postgers_db:/# 로 바뀌는 것을 확인할 수 있습니다. 여기서 /var/lib/postgresql/data경로로 이동합니다.
그리고 아래의 명령어를 사용해서 sql파일을 복원합니다.
psql -U <db username> -d <db name> -h localhost -p 5432 < .sql
db username, db name이 모두 worklazy고 teldrive_20250212_000001_noonwer_noacl.sql파일을 사용한다면 최종적으로 명령어는 아래와 같게 됩니다.
psql -U worklazy -d worklazy -h localhost -p 5432 < ./teldrive_20250212_000001_noowner_noacl.sql
그러면 bots, channels 테이블과 관련된 에러가 지나간 후 무시무시한 양의 INSERT 0 1의 로그가 지나갑니다.
bots과 channels의 경우 user_id가 키값으로 설정이 되어 있는데, user보다 bots와 channels테이블이 먼저 복원되도록 SQL파일이 짜여있어 그런 것으로, 단순히 한 번 더 실행하면 됩니다. SQL파일을 수정하는 방법도 있지만, 단순하게 한 번 더 실행하는 것으로 대체하겠습니다.
데이터의 양에 따라 다르지만, 저처럼 Supabase의 무료용량(0.5GB)를 초과할 정도가 되면 10분 이상은 기다려야 합니다.
작업이 끝나면 같은 명령을 한 번 더 입력하면 bots테이블과 channels테이블의 데이터가 입력되고 files테이블의 내용은 이미 모두 기록되어있으므로 빨리 끝납니다. 이후 테이블 내부를 들여다보면 모든 데이터가 정상적으로 입력된 것을 확인할 수 있습니다.
DB밀어넣기가 끝났다면 Teldrive를 다시 실행하면 됩니다.
docker start teldrive
로그인 후 시험삼아 기존 파일 몇 가지를 다운로드 받아보시면 됩니다.
복원 완료된 것을 확인했다면 다시 기존 방법대로 Rclone을 세팅하여 사용하시면 됩니다.
오라클 클라우드와 Teldrive로 서버 없이 무제한 클라우드 사용하기
2024-09-02 변경 내용 : teldrive 도커 허브 레지스트리 변경 반영(divyam234/teldrive → tgdrive/teldrive)2025-02-12 변경 내용 : session.db → storage.db 변경 반영개요구드 무제한이 사라지고 Dropbox에서 팀을 꾸려 사
worklazy.net
관련 글
2025.01.23 - [Homeserver] - Supabase database 백업하기
Supabase database 백업하기
2025-02-12 변경내용 : TrueNAS Cloud Sync 내용 추가개요오라클 클라우드와 Supabase를 이용하여 Teldrive를 구축하고 잘 사용하던 중, DB에 문제가 생기면 올려놓은 파일에 접근하기 힘들겠다는 생각이 들었
worklazy.net
2025.01.23 - [Apps] - 오라클 클라우드와 Teldrive로 서버 없이 무제한 클라우드 사용하기
오라클 클라우드와 Teldrive로 서버 없이 무제한 클라우드 사용하기
2024-09-02 변경 내용 : teldrive 도커 허브 레지스트리 변경 반영(divyam234/teldrive → tgdrive/teldrive)2025-02-12 변경 내용 : session.db → storage.db 변경 반영개요구드 무제한이 사라지고 Dropbox에서 팀을 꾸려 사
worklazy.net