projects
AI & ML interests
None defined yet.
Recent Activity
Torrent Web Downloader
Aplikasi web torrent berbasis Python + Flask yang mengontrol qbittorrent-nox dari dalam satu container Docker.
Fitur utama:
- upload file
.torrent - tambah magnet link
- status torrent realtime
- pause, resume, delete
- auto cancel untuk torrent stuck
- upload file atau folder hasil torrent ke GoFile atau PixelDrain
mode folder: archive
.zipatau raw files melalui modal pilihan - panel ringkasan server dan speedtest
Jalankan Dengan Docker
Build image:
docker build . -t torrent-app
Run container:
docker run -d \
--name torrent-app \
-p 5000:5000 \
-p 6881:6881 \
-p 6881:6881/udp \
-e FLASK_SECRET_KEY=change-me \
-e PORT=5000 \
-e QBITTORRENT_USERNAME=admin \
-e QBITTORRENT_PASSWORD=adminadmin \
-e QBT_PROFILE=/config \
-e QBITTORRENT_SAVE_PATH=/downloads \
-v torrent-config:/config \
-v torrent-downloads:/downloads \
torrent-app
Web app tersedia di:
http://localhost:5000
Docker Compose
Proyek sekarang memakai satu Dockerfile default. File docker-compose.yml masih disediakan hanya sebagai opsi lokal, tetapi deployment utama sudah didesain untuk:
docker build . -t torrent-appdocker run ...
Environment Variables
PORT: port web Flask yang diexpose ke luar. Default5000GUNICORN_WORKERS: jumlah worker Gunicorn. Default2GUNICORN_THREADS: jumlah thread per worker. Default4GUNICORN_TIMEOUT: timeout request Gunicorn. Default120KEEPALIVE_ENABLED: aktifkan scheduler ping ringan untuk mencegah idle sleep saat container masih berjalan. DefaulttrueKEEPALIVE_URL: URL yang diping oleh keepalive. Default memakaihttps://$SPACE_HOST/healthzdi Hugging Face Spaces, atauhttp://127.0.0.1:$PORT/healthzdi luar SpacesKEEPALIVE_INTERVAL_SECONDS: interval ping keepalive. Default900KEEPALIVE_INITIAL_DELAY_SECONDS: jeda awal sebelum ping pertama. Default60KEEPALIVE_TIMEOUT_SECONDS: timeout request keepalive. Default20FLASK_SECRET_KEY: secret key FlaskQBITTORRENT_USERNAME: login qBittorrent Web API. DefaultadminQBITTORRENT_PASSWORD: password qBittorrent Web API. DefaultadminadminQBT_PROFILE: direktori config qBittorrent. Default/config, atau/data/qbittorrentbila/datatersediaQBITTORRENT_SAVE_PATH: direktori hasil download. Default/downloads, atau/data/downloadsbila/datatersediaGOFILE_API_TOKEN: token opsional untuk GoFile diperlukan untuk mode raw folder GoFileGOFILE_UPLOAD_URLS: daftar endpoint upload GoFile dipisahkan koma. Default mencoba beberapa server resmi GoFile dan otomatis mengurutkannya berdasarkan latency terdekatPIXELDRAIN_API_KEY: API key PixelDrain untuk upload via APIPIXELDRAIN_API_URL: base API PixelDrain. Defaulthttps://pixeldrain.com/apiRCLONE_CONFIG_URL: raw URL untuk mengambilrclone.conf, misalnya raw GitHub atau Gist. Jika kosong, app membaca file lokalRCLONE_CONFIG_PATH: path filerclone.conflokal. Default/app/rclone.conf. App juga mencoba/config/rclone.confdan/data/rclone.confRCLONE_REMOTE: nama remote rclone yang dipakai. Jika kosong, app memakai remote pertama darirclone.confRCLONE_DESTINATION_PATH: folder tujuan di remote rclone. Defaulttorrent-webIP_LOCATION_API_URL: endpoint lookup lokasi. Defaulthttps://ipapi.co/json/TORRENT_STUCK_TIMEOUT_MINUTES: timeout torrent stuck. Default5TELEGRAM_BOT_ENABLED: settrueuntuk menjalankan bot Telegram di container yang sama. DefaultfalseTELEGRAM_API_ID: API ID Telegram untuk KurigramTELEGRAM_API_HASH: API hash Telegram untuk KurigramTELEGRAM_BOT_TOKEN: token bot dari BotFatherTELEGRAM_OWNER_IDS: daftar user ID Telegram yang boleh memakai bot, dipisah koma. Kosong berarti semua user diizinkanTELEGRAM_PROGRESS_INTERVAL_SECONDS: interval edit pesan progress bot. Default3TELEGRAM_PROGRESS_TIMEOUT_SECONDS: batas waktu monitor progress per pesan. Default86400
Telegram Bot
Bot Telegram bersifat opsional dan memakai kurigram. Struktur bot ada di bot/bot.py, terpisah dari Flask, tetapi memakai state/download path yang sama sehingga task dari bot tetap muncul di dashboard web.
Command awal:
/qm <magnet>atau/qbdown <magnet>untuk tambah magnet ke qBittorrent/aria2 <url>untuk direct download via Aria2/tasksuntuk melihat task terbaru/status <task_id>untuk memantau task tertentu
Saat task selesai, pesan progress bot menampilkan inline button untuk upload ke GoFile atau PixelDrain, refresh, delete, dan delete files.
Struktur
Dockerfileimage tunggal untuk web app + qBittorrententrypoint.shstartup script untuk menjalankanqbittorrent-noxdangunicornapp.pyaplikasi Flaskbot/bot.pybot Telegram berbasis Kurigramtemplates/index.htmlUI Tailwindqbittorrent/config/qBittorrent.confkonfigurasi default qBittorrent
ClawCloud Run
Sesuai dokumentasi resmi ClawCloud Run, deployment Docker dilakukan dari App Launchpad dengan memilih image, exposed port, environment variables, dan local storage volume jika dibutuhkan.
Referensi resmi:
- ClawCloud Run docs:
https://docs.run.claw.cloud/ - Deploy from Docker:
https://docs.run.claw.cloud/app-platform/getting-started/deploy-from-docker - App Launchpad guide:
https://docs.run.claw.cloud/clawcloud-run/guide/app-launchpad
Konfigurasi yang disarankan untuk ClawCloud Run:
- Build image ini lalu push ke registry publik atau private Anda.
- Di App Launchpad, buat app baru dari Docker image tersebut.
- Set exposed port ke
5000atau samakan dengan envPORT. - Tambahkan environment variables:
PORT=5000FLASK_SECRET_KEY=...QBITTORRENT_USERNAME=adminQBITTORRENT_PASSWORD=adminadminQBT_PROFILE=/configQBITTORRENT_SAVE_PATH=/downloads
- Tambahkan persistent storage:
- mount
/configuntuk profile qBittorrent - mount
/downloadsuntuk file hasil download
- mount
- Jika platform Anda hanya mengekspos satu public port, cukup expose
5000. qBittorrent WebUI internal tetap dipakai oleh Flask lewat127.0.0.1:8080.
Catatan:
- Dukungan PaaS terbaik di sini adalah model single-container, single-public-port.
- Peer BitTorrent inbound port
6881bisa dipetakan di Docker biasa, tetapi pada PaaS support-nya bergantung kemampuan platform untuk membuka port tambahan. - Jika ClawCloud Run hanya mengizinkan satu public port, aplikasi tetap bisa berjalan, tetapi performa peer discovery torrent bisa berbeda dibanding VPS atau Docker host biasa.
Hugging Face Spaces
Repo ini sekarang bisa dipakai sebagai Docker Space karena README.md sudah memakai metadata sdk: docker dan app_port: 5000.
Langkah deploy:
- Buat Space baru di Hugging Face dan pilih SDK
Docker. - Push isi repo ini ke repository Space tersebut.
- Di Settings, tambahkan runtime variables bila diperlukan:
FLASK_SECRET_KEY=...QBITTORRENT_USERNAME=adminQBITTORRENT_PASSWORD=adminadmin
- Jika ingin data tetap tersimpan setelah restart, aktifkan persistent storage. Saat volume
/datatersedia, aplikasi ini otomatis memakai:/data/qbittorrentuntuk profile qBittorrent/data/downloadsuntuk hasil download
- Akses aplikasi dari URL Space Anda. Port publik yang dipakai adalah
5000.
Catatan:
- Hugging Face Spaces Docker hanya mengekspos satu public port. qBittorrent internal tetap berjalan di
127.0.0.1:8080dan diakses oleh Flask dari dalam container. - Tanpa persistent storage, file config dan hasil download akan hilang saat Space restart.
- Koneksi peer BitTorrent tambahan seperti port
6881tidak bisa diasumsikan terbuka dari internet pada Spaces, jadi perilaku swarm bisa berbeda dibanding VPS atau Docker host biasa. - Container menjalankan keepalive scheduler yang memanggil endpoint ringan
/healthzsecara periodik. Di Spaces, target defaultnya adalahhttps://$SPACE_HOST/healthz, sehingga request melewati URL publik Space. - Keepalive ini hanya bekerja saat container masih berjalan. Jika Space sudah terlanjur stopped/sleep, proses di dalam container tidak bisa membangunkan dirinya sendiri; untuk uptime penuh gunakan hardware berbayar atau set sleep time resmi dari Settings Hugging Face.
- Provider rclone aktif jika
rclone.confvalid ditemukan. Anda bisa setRCLONE_CONFIG_URL, mount file ke/config/rclone.confatau/data/rclone.conf, atau isi raw URL langsung dari modal rclone di dashboard. - Jika tidak ada config, aplikasi tetap berjalan. Saat tombol rclone diklik, dashboard akan membuka modal setup raw URL, misalnya
https://gist.githubusercontent.com/genstava789/e7fa4e34e126bfc257b21db4f8c0f3ba/raw/rclone.conf. - Upload rclone memakai
rclone copytountuk file atau archive.zip, danrclone copyuntuk folder raw. Setelah upload selesai, app mencobarclone link; jika backend remote mendukung public/download link, link tersebut ditampilkan di dashboard.