- 2024-09-02 변경 내용 : teldrive 도커 허브 레지스트리 변경 반영(divyam234/teldrive → tgdrive/teldrive)
- 2025-02-12 변경 내용 : session.db → storage.db 변경 반영
개요
구드 무제한이 사라지고 Dropbox에서 팀을 꾸려 사용하는 무제한 클라우드들도 일정 사용량이 넘어가면 안내 메일을 받는 등, 온라인에서 사용할 수 있는 ‘무제한’클라우드는 이제 거의 없다고 봐야 합니다. 말은 무제한이라고 하는 Opendrive도 실제로 일정 용량 넘어가면 속도 제한을 심하게 걸고 파일을 삭제하는 등의 조치를 취하죠.
단순한, 클라우드 사업 자체만으로는 수지가 맞지 않기 때문에 당연한 수순이기도 합니다.
한편, 몇 달 전부터 해외에서는 먼저 흥하고 있던 Teldrive는 이러한 상황 속에서 무제한 클라우드의 대안으로 사용할 수 있는 프로그램입니다. 텔레그램의 파일 링크 기능을 이용하는 방식이죠.
이걸 실제로 얼마나 오래 사용할 수 있을지는 모르겠지만, 한 번 세팅해서 사용해보겠습니다.
Teldrive는 ARM에서도 작동하기 때문에, 오라클 클라우드 A1에서 구동해 보겠습니다.
Teldrive 설치 준비하기
텔레그램 app id, app hash 발급받기
적법하게 생성된 텔레그램 계정이 있다는 가정 하에, 아래 링크를 눌러 로그인 합니다.
그러면 아래처럼 개발자 페이지로 넘어갈 수 있고, 여기서 필요한 정보를 대충 입력해 줍니다.
(slug등은 app개발 시 연동할 하위주소 등을 구성할 때 쓰입니다. teldrive만이 목적일 경우 중요하지 않으니 적당히 구성합니다.)
그러면 아래처럼 app_id, app_hash를 확인할 수 있습니다.
긁어서 복사해 둡니다.
DB 생성
무료DB서버(BaaS) 사용하기
Teldrive는 DB로 Postgresql을 사용합니다. Teldrive용 DB컨테이너를 따로 띄우던가, 직접 홈서버에서 운용하는 DB가 있다면 이를 이용해도 되겠지만, DB관리가 익숙하지 않다면 조금 번거롭습니다.
그래서 온라인에서 무료로 제공하는 DB를 이용할 겁니다.
정확히는 BaaS(Backend as a Service)를 이용하는 방법으로, 요즘 핫한(?) 추세를 따라가는 방법입니다.
DB관리까지 WEB UI에서 할 수 있어, DB관리를 잘 모르는 사람에게도 접근성이 높습니다.
링크를 타고 이동해 계정을 생성해 줍니다.
계정 생성 후 바로 대시보드로 리다이렉트 됩니다. 이 곳에서 New Project를 클릭해서 진행합니다.
Generate a password를 클릭하여 무작위 문자열의 암호를 생성한 뒤, Copy를 클릭해 복사해둡니다.
그러면 아래와 같이 잠시 기다리라고 하며 프로젝트 생성 작업이 진행됩니다.
우측 상단의 Connect를 클릭해서 접속 주소를 복사해 둡니다.
복사한 주소 가운데에 [YOUR-PASSWORD] 부분은 위에서 얻은 비밀번호를 사용하면 됩니다.
비밀번호를 복사해두지 못했거나 잃어버렸다면, 좌측 상단의 Project Settings – Database – Reset database password를 클릭해 임의문자배열의 암호를 다시 생성할 수 있습니다.
Copy를 클릭해 비밀번호를 저장해 둡니다.
하단의 접속 주소도 Copy해두어야 합니다.
로컬DB 구축해서 사용하기
Postgresql은 바이너리로 설치할 수도 있고, 컨테이너로 띄울 수도 있습니다.
공식 가이드에서는 아래처럼 도커를 이용해 postgresql을 구성하고 동일 네트워크에 teldrive를 넣어 통신하도록 안내합니다.
(하나의 docker compose에 몰아서 구성할 경우, teldrive에 따라 DB서버도 영향을 받기 때문)
docker network create postgres
#docker-compose-postgresql.yml
services:
postgres_db:
image: ghcr.io/tgdrive/postgres
container_name: postgres_db
restart: always
networks:
- postgres
environment:
- POSTGRES_USER=teldrive
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=postgres
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
postgres:
external: true
#docker-compose.yml
services:
teldrive:
image: ghcr.io/tgdrive/teldrive
restart: always
container_name: teldrive
command: ["--db-data-source=postgres://teldrive:secret@postgres_db/postgres"]
networks:
- postgres
volumes:
- ./session.db:/session.db:rw
- ./config.toml:/config.toml
ports:
- 8080:8080
networks:
postgres:
external: true
입맛에 맞게 진행하시면 됩니다. 이 글에서는 supabase를 사용하여 구성하겠습니다.
토큰 발급
토큰을 생성하기 위해서는 쉘에서 아래와 같이 입력합니다.
openssl rand -hex 32
그러면 아래처럼 임의의 문자배열이 나타납니다.
541d8f6980acb1971a69c73153583535adc1521dbcf81249f606f22c5ad7d47c
해당 키를 메모해 둡니다. 혹은 teldrive github페이지에서도 간단하게 얻을 수 있습니다.
아래 링크를 클릭하면 그 즉시 문자열을 얻을 수 있습니다.
Teldrive 설치하기
config.toml 작성하기
Teldrive는 config.toml이라는 파일로 환경설정을 구성합니다.
설정가능한 전체 구문은 github에서 sample파일을 다운로드 받아 확인할 수 있습니다.
여러가지 정의 항목이 많지만, 필수적으로 구성해야 하는 부분은 4가지(db.data-source, jwt.secret, tg.app-id, td.app-hash)뿐이고, supabase를 사용할 때 추가적으로 구성해야 하는 부분이 있어 함께 구성해보겠습니다.
mkdir -P /docker/teldrive
cd /docker/teldrive
nano config.toml
그리고 아래 내용을 붙여넣고 수정하겠습니다.
[db]
data-source = "postgres://<db username>:<db password>@<db host>/<db name>"
prepare-stmt = false
[db.pool]
enable = false
max-idle-connections = 25
max-lifetime = "10m"
max-open-connections = 25
[jwt]
secret = "abcd"
[tg]
app-id =
app-hash = "fwfwfwf"
[tg.uploads] #암호화를 사용하려면 구성, 암호화 하지 않는다면 없어도 무방
encryption-key = "" #암호화 키
retention = "7d"
threads = 4 #사용할 쓰레드 수
이후 파일을 저장하고 nano를 빠져나옵니다.
그리고 공식 가이드대로 아래와 같이 입력해 session.db storage.db파일을 하나 생성해 줍니다.
touch storage.db
최종적으로 경로 아래에 파일 2개(storage.db, config.toml)가 있어야 합니다.
작성한 config.toml은 따로 잘 백업해 두는 것이 좋습니다. encryption-key를 잃어버릴 경우 추후 Teldrive 복원 시 기존 자료에 접근하지 못하는 경우가 발생합니다.
컨테이너 실행하기
Teldrive는 도커 이미지를 제공하고 docker compose도 아래와 같이 제공합니다.
services:
teldrive:
image: ghcr.io/tgdrive/teldrive
restart: always
container_name: teldrive
volumes:
- ./session.db:/session.db:rw
- ./config.toml:/config.toml
ports:
- 8080:8080
우선, docker에 사용할 경로를 생성하겠습니다.
저는 portainer가 편해서 portainer로 구성할 예정이라 상대 경로를 절대 경로로 수정하겠습니다.
services:
teldrive:
image: ghcr.io/tgdrive/teldrive
restart: always
container_name: teldrive
volumes:
- /docker/teldrive/session.db:/session.db:rw
- /docker/teldrive/config.toml:/config.toml
ports:
- 8080:8080
그리고 위의 docker compose(stack)을 이용하여 컨테이너를 띄웁니다.
제대로 설정되었다면, 아래와 같은 로그를 확인할 수 있습니다.
.
.
.
2024/08/16 07:27:41 OK 20240615110350_constraint.sql (23.96ms)
2024/08/16 07:27:41 OK 20240711163538_search.sql (296.18ms)
2024/08/16 07:27:41 OK 20240715001936_index.sql (33.8ms)
2024/08/16 07:27:41 OK 20240718155942_index.sql (23.55ms)
2024/08/16 07:27:41 OK 20240718164345_function.sql (16.51ms)
2024/08/16 07:27:41 OK 20240727233913_modify.sql (17.4ms)
2024/08/16 07:27:41 OK 20240728154309_modify.sql (16.93ms)
2024/08/16 07:27:41 OK 20240802212949_uuid.sql (17.46ms)
2024/08/16 07:27:41 OK 20240802213957_alter_table.sql (99.31ms)
2024/08/16 07:27:41 OK 20240803003234_index.sql (20.41ms)
2024/08/16 07:27:41 goose: successfully migrated database to version: 20240803003234
16/08/2024 07:27 AM INFO Started server http://localhost:8080
연결한 도메인(혹은 IP:PORT)으로 접속하면, 아래와 같은 페이지를 볼 수 있습니다.
(오라클 클라우드에 구축하고 있다는 가정 하에, 미리 연결할 도메인을 생성해두고 연결하는 쪽이 편합니다. 오라클 클라우드 인스턴스의 포트를 퍼블릭하게 죄다 오픈하는 건 위험부담이 크기 때문입니다.)
텔레그램 계정에 연동된 번호로 로그인을 진행하면 아래처럼 메인페이지에 접근할 수 있게 됩니다.
Teldrive 구성하기
암호화 설정하기
우측 상단의 아이콘을 클릭해 Settings에 진입합니다.
Encrypt Files로 파일을 암호화할 것인지 결정할 수 있습니다.
만일 암호화를 하고자 한다면 config.toml에서 [tg.uploads]아래 항목들을 꼭 정의 해야 합니다.
기본 채널 설정하기
채널은 텔레그램 우측 하단의 “+”를 클릭하여 생성할 수 있습니다.
Account → Select Channel에서 생성한 채널을 선택합니다.
우측 하단에 스크린샷처럼 Channel updated라는 문구가 나와야 합니다.
봇 추가하기
Add Bots – Bot token을 입력합니다.
봇 토큰은 최소 1개가 필요하며, 여러 개를 운용할 수록 속도 한계치에 근접할 수 있습니다.
텔레그램 봇 발급 및 토큰얻는 방법은 워낙 쉽게 찾으실 수 있기 때문에 패스하겠습니다.
BotFather 사칭에 주의하시기만 하면 됩니다.
파일 업로드하기
버튼을 이용해 폴더 생성과 파일 업로드를 수행할 수 있습니다.
업로드가 완료되면 아래처럼 파일 목록을 확인할 수 있습니다.
기본 설정이 잘 이루어졌다면, 아래처럼 브라우저에서 바로 스트리밍으로 재생도 할 수 있습니다.
Rclone 구성하기
브라우저를 통해 업로드할 수 있는 것은 확인했지만, 공식 가이드에서도 브라우저의 제약 때문에 Rclone을 추천하기도 하고, 파일 업로드 정도는 백그라운드 작업을 하고 싶잖아요?
쉘에서 명령만 내려놓으면 되는 Rclone을 사용해 봅시다.
공식 가이드에서 수정된 Rclone을 제공합니다.
Rclone을 사용하지 않고 있었다면, 패키지(deb, rpm)을 다운받아 설치하시면 되고, 사용중인 rclone이 있다면, zip을 받아 별도 폴더 내에 풀어 사용하시면 됩니다.
리눅스 및 맥과 윈도우 용도 사용할 수 있습니다.
이 글에서는 arm리눅스용 패키지를 오라클 클라우드에서 바로 wget으로 다운받아 사용하겠습니다.
아래 명령어 두 줄을 통해 손쉽게 설치할 수 있습니다.
https://github.com/tgdrive/rclone/releases/download/v1.67.5/rclone-v1.67.5-linux-arm64.deb
dpkg -i ./rclone-v1.67.5-linux-arm64.deb
Preparing to unpack .../rclone-v1.67.5-linux-arm64.deb ...
Unpacking rclone (1.67.5) ...
Setting up rclone (1.67.5) ...
Processing triggers for man-db (2.10.2-1) ...
rclone config → New remote로 진행할 수도 있지만, 아래 명령어를 입력해 config창에 바로 정보를 붙여넣어보겠습니다.
nano "$(rclone config file | tail -1)"
nano창이 열리면 제일 하단에 아래 내용을 붙여넣습니다.
[teldrive]
type = teldrive
api_host = http://localhost:8080
access_token =
chunk_size = 500M
upload_concurrency = 4
encrypt_files = false
random_chunk_name= true
Teldrive와 rclone이 서로 다른 기기일 경우 api_host는 접속가능한 경로로 수정되어야 합니다.
(http://192.168.0.5:8080 혹은 도메인명)
access_token은 WEB UI에 접속한 상태에서 개발자 도구를 통해 얻을 수 있습니다.
이제 Rclone을 이용해 편리하게 복사할 수 있게 되었습니다.
rclone copy <src> teldrive:
random_chunk_name도 잘 작동하는 것을 알 수 있습니다.
특히나, 오라클 A1은 4cpu를 한 개의 VM에 몰아서 생성할 경우 4기가의 무시무시한 속도를 사용할 수 있으므로 매우 유용할 것으로 생각됩니다.
이렇게 구축한 teldrive를 rclone을 이용해 마운트하면 무궁무진하게 사용할 수 있습니다. 예를 들자면, Nextcloud로 활용할 수도 있겠죠.
문제 해결(Trouble-Shooting)
1. stmtcache already exists
오류 로그 전체 한 줄을 따오면 아래와 같습니다.
prepared statement "stmtcache_ed3353f36c147626d1cfdec0226d5cf3f91b98f90848ff76" already exists (SQLSTATE 42P05)
Supabase를 사용 시 필요한 내용이 config.toml에 없을 경우 발생합니다.
아래의 두 개의 옵션이 false처리 되어 있어야 합니다.
[db]
..
prepare-stmt = false
[db.pool]
enable = false
2. cannot execute binary file (Rclone)
cannot execute binary file: Exec format error
CPU아키텍쳐에 맞지 않는 파일을 실행하려고 할 때 발생하는 에러입니다.
해당 아키텍쳐에 맞는 파일을 다운받아 실행하시면 됩니다.
관련 글
2025.02.12 - [Apps] - Teldrive 복원 및 이전하기
Teldrive 복원 및 이전하기
개요한 달 전 사용하던 오라클 클라우드로부터 벤 당했습니다. 증상은 제가 운영하던 블로그 및 기타 서비스로 접속을 할 수 없었고, 오라클 클라우드 로그인 시도 시, 아무리 비밀번호를 수정
worklazy.net
2025.01.23 - [Homeserver] - Supabase database 백업하기
Supabase database 백업하기
2025-02-12 변경내용 : TrueNAS Cloud Sync 내용 추가개요오라클 클라우드와 Supabase를 이용하여 Teldrive를 구축하고 잘 사용하던 중, DB에 문제가 생기면 올려놓은 파일에 접근하기 힘들겠다는 생각이 들었
worklazy.net
출처
1. https://github.com/tgdrive/teldrive
GitHub - tgdrive/teldrive: Teldrive
Teldrive. Contribute to tgdrive/teldrive development by creating an account on GitHub.
github.com
2. https://github.com/divyam234/teldrive/issues/310
ERROR: prepared statement "stmtcache_ed3353f36c147626d1cfdec0226d5cf3f91b98f90848ff76" already exists (SQLSTATE 42P05) · Issue
Hello, to be able to upgrade teldrive, I've now migrated from Neon to Supabase, but i continue to encounter this error: ERROR: prepared statement "stmtcache_ed3353f36c147626d1cfdec0226d5cf3f91b98f9...
github.com
3. https://github.com/divyam234/teldrive/issues/230
Is it possible to use rclone crypt secret to decrypt file? · Issue #230 · tgdrive/teldrive
I've been using rclone chunker+crypt on top of teldrive. Is it possible to use rclone crypt to decrypt file so I do not have to use rclone chunker+crypt? Thanks
github.com
4. https://svrforum.com/svr/1618059
Teldrive (텔레그램 무제한 클라우드) 아시나요?
우연히 한 블로그에서 텔레그램 무제한 클라우드에 대해 알게 되었습니다. 예전에 제가 소개해 드렸던 원드라이브 5TB 보다 난이도가 까다롭지 않은 거 같은데 바빠서 세팅할 시간이 없네요ㅠ.
svrforum.com