- Update Nix flake.nix overlay to use Bun 1.4.0 (overrideAttrs) - Update CI (setup-bun) to pin bun-version: 1.4.0 - Update package.json packageManager/Dockerfile/vercel.json - sha256: sha256:Poy0vf7yJ/hzk33QiQj5gnshI5Q7dfbaMD7xgwiyDKw=
3.1 KiB
3.1 KiB
TeleUploader — Audit & Optimisasi Stabilitas + S3 (2026-08-27)
Scope
Audit dan optimasikan backend TeleUploader agar stabil di segala situasi dan S3 protocol stabil + secepat mungkin. Fokus pada bottleneck nyata yang ditemukan saat audit kode + log.
Temuan Audit (root cause → prioritas)
A. S3 GET lambat (bottleneck terbesar download)
concatPartStreams(object-stream.ts) fetch part SEQUENTIAL — tiap part di-fetchsatu per satu (for..of + await penuh). Untuk objek chunked/multipart dengan N part, byte pertama baru terkirim SETELAH semua fetch part selesai. → PARALELISASI dengan bounded concurrency, urut tetap dipertahankan.buildChunkedObjectSources&handleGetMultipartObjectresolvegetFileInfoSEQUENTIAL (for..of + await). N call Telegram API berurutan sebelum streaming mulai. →Promise.allresolve paralel.botPool.getFileInfoTIDAK pakaifileInfoCacheyang sudah ada — setiap S3 GET objek reguler memanggil API TelegramgetFile(network round-trip). file-controller punya wrapper cache sendiri, tapi path S3 tidak. → pindahkan caching ke dalambotPool.getFileInfoagar semua caller dapat.
B. Stabilitas / lingkungan produksi
nodeEnv: "development"di produksi (dari log BWS). Winston format json sudah benar di production, tapi flag salah.trustProxy: falsedi produksi padahal di belakang Caddy → rate limiter meng-key semua user ke127.0.0.1(satu bucket global). Ini bug kecil untuk non-S3 route. Fix: default trustProxy menyesuaikan, tapi utama via env.- MemoryMax=512M di systemd padahal config mendukung blob 2GB. Streaming PUT O(1) memory, tapi GET gzip part membuffer part utuh. Naikkan ke 1G.
C. Robustness S3
handleUploadParttidakawait writer.end()sebelumcreateReadStream→ potensi race baca file belum flush. Await end().- Batas kecepatan unggah:
telegramBotConcurrency:1× 6 bot = 6 unggah paralel. Karena Telegram ~1 rps/bot untuk sendDocument, konkuransi per-bot 1 masuk akal. Biarkan default, tapi pastikan pool retry terhadap 429 sudah bagus (sudah, ada retry-after handling).
File yang disentuh (semua di bawah src/)
src/interfaces/s3/object-stream.ts— paralelisasi fetch part (concatPartStreams)src/infrastructure/telegram/bot-pool.ts— getFileInfo + cache, resolve paralelsrc/infrastructure/telegram/chunked-storage.ts— buildChunkedObjectSources paralelsrc/interfaces/http/controllers/s3-controller.ts— handleGetMultipartObject paralel, await writer.end() di handleUploadPartsrc/infrastructure/cache/index.ts— (opsional) tambah helper
Verifikasi
bunx biome check src test(lint)bun test test/s3-auth.test.ts&test/s3-operations.test.ts(S3 regresi)bun test test/telegram.test.ts(pool) kalau ada- Test unit baru untuk parallel part streaming (tanpa network) kalau layak.
- Deploy via push main → CI
deploy.yml(Nix build → nix copy → systemctl restart).
Deploy
Push ke main → GitHub Actions deploy.yml build + deploy Nix ke orangevps.
Setelah deploy, verifikasi /health 200 dan S3 GET masih berfungsi.