सामग्री पर जाएँ
HexaTransfer
ब्लॉग पर वापस
तकनीकी गहन विश्लेषण

Create Your Own फ़ाइल ट्रांसफ़र Service: Dev ट्यूटोरियल

फ़ाइल ट्रांसफ़र service scratch से build करें। Backend API design, storage integration, और user interface development tutorial।

अपनी खुद की file transfer service build करने के लिए आपको पाँच pieces चाहिए: एक frontend जो browser में files slice और optionally encrypt करता है, एक REST API जो upload sessions mint करता है और storage URLs presign करता है, S3-compatible object storage (Cloudflare R2, Backblaze B2, या MinIO), एक small metadata database (SQLite या Postgres), और एक TLS 1.3 reverse proxy। Node 22, Fastify, और Vite के साथ आप लगभग 600 lines of code में WeTransfer-style service ship कर सकते हैं और moderate traffic पर पूरी चीज़ $5-15 (₹400-1,250) प्रति माह पर host कर सकते हैं।

पहले Storage Layer चुनना

Storage economics file transfer service को बना या तोड़ देती हैं। AWS S3 प्रति GB egress $0.09 charge करता है, मतलब एक popular 2 GB download 1,000 बार shared करना अकेले bandwidth में ₹14,850 खर्च करता है। Cloudflare R2 egress के लिए zero charge करता है और प्रति GB stored $0.015। Backblaze B2 प्रति GB egress $0.01 और प्रति GB stored $0.006 charge करता है। Free-tier transfer service के लिए, R2 obvious pick है। MinIO आपको अपने hardware पर S3 semantics self-host करने देता है, जो काम करता है यदि आपके पास पहले से bandwidth और disks idle हों।

Presigned URLs उपयोग करें ताकि clients directly storage से upload और download करें, आपके server के माध्यम से नहीं। यह आपके API को bandwidth-bound के बजाय CPU-bound रखता है।

API Surface Sketch करना

API small रखें। पाँच endpoints 95% of what you need cover करते हैं:

  • POST /sessions — upload session create करें, ID और presigned multipart URLs return करें
  • POST /sessions/:id/complete — multipart upload finalize करें, share URL return करें
  • GET /shares/:id — file metadata (size, expiry, downloads remaining) return करें
  • GET /shares/:id/download — presigned download URL return करें
  • DELETE /shares/:id — owner को early revoke करने दें (revocation token आवश्यक)

POST /sessions को aggressively rate-limit करें — प्रति IP प्रति घंटे 20 काफी है। सभी endpoints JSON return करते हैं, Cache-Control: no-store उपयोग करते हैं, और HTML pages पर Content-Security-Policy सेट करते हैं।

Fastify के साथ Backend Wire Up करना

Fastify आपको JSON schema validation, sensible logging, और बिना कोशिश के प्रति core 30k req/s देता है। एक minimal POST /sessions:

fastify.post('/sessions', {
  schema: {
    body: {
      type: 'object', required: ['size'],
      properties: {
        size: { type: 'integer', minimum: 1, maximum: 10737418240 },
        contentType: { type: 'string', maxLength: 120 }
      }
    }
  }
}, async (req) => {
  const id = nanoid(16);
  const key = `blobs/${id}`;
  const upload = await s3.createMultipartUpload({
    Bucket: 'transfers', Key: key, ContentType: req.body.contentType
  });
  const partCount = Math.ceil(req.body.size / (8 * 1024 * 1024));
  const urls = await Promise.all(
    Array.from({ length: partCount }, (_, i) =>
      getSignedUrl(s3, new UploadPartCommand({
        Bucket: 'transfers', Key: key, UploadId: upload.UploadId, PartNumber: i + 1
      }), { expiresIn: 3600 }))
  );
  db.prepare('INSERT INTO sessions VALUES (?, ?, ?, ?)')
    .run(id, upload.UploadId, key, Date.now());
  return { id, uploadId: upload.UploadId, partUrls: urls };
});

10 GB ceiling, 8 MB parts, 1-hour URL validity। अपने traffic mix के लिए adjust करें।

Upload UI Build करना

Vite plus React plus zero UI library आपको लगभग 150 lines में working drag-and-drop पर पहुँचाता है। Critical piece upload worker है: एक dedicated Web Worker spawn करें, उसे File handle और part URLs दें, और 3-way concurrency के साथ प्रत्येक chunk PUT करवाएं। Main thread responsive रहता है, progress updates postMessage के माध्यम से आते हैं।

// worker.js
self.onmessage = async ({ data: { file, partUrls } }) => {
  const partSize = 8 * 1024 * 1024;
  const etags = [];
  for (let i = 0; i < partUrls.length; i++) {
    const blob = file.slice(i * partSize, (i + 1) * partSize);
    const res = await fetch(partUrls[i], { method: 'PUT', body: blob });
    etags[i] = res.headers.get('etag');
    self.postMessage({ type: 'progress', done: i + 1, total: partUrls.length });
  }
  self.postMessage({ type: 'done', etags });
};

एक password field जोड़ें जो PBKDF2 (600,000 iterations, SHA-256) के माध्यम से key derive करता है और PUT से पहले AES-256-GCM के माध्यम से प्रत्येक chunk wrap करता है। यह आपकी service को server-side-encrypted के बजाय E2EE service में बदल देता है।

Database Schema Design करना

better-sqlite3 के माध्यम से SQLite बिना flinching के tens of millions of rows handle करता है। Schema lean रखें:

CREATE TABLE sessions (
  id TEXT PRIMARY KEY, upload_id TEXT, object_key TEXT, created_at INTEGER
);
CREATE TABLE shares (
  id TEXT PRIMARY KEY, object_key TEXT, size_bytes INTEGER,
  content_type TEXT, expires_at INTEGER, max_downloads INTEGER,
  download_count INTEGER DEFAULT 0, revocation_token TEXT
);
CREATE INDEX idx_shares_expires ON shares(expires_at);

कोई user table नहीं, कोई email नहीं, कोई IP logs नहीं। यह एक deliberate choice है — यह DPDP Act 2023 compliance को लगभग trivial बनाता है। एक nightly cron expired rows और उनके S3 objects delete करता है:

const expired = db.prepare('SELECT object_key FROM shares WHERE expires_at < ?').all(Date.now());
for (const { object_key } of expired) {
  await s3.deleteObject({ Bucket: 'transfers', Key: object_key });
}
db.prepare('DELETE FROM shares WHERE expires_at < ?').run(Date.now());

Share Links और Downloads Implement करना

Share URLs https://yourapp.com/f/abc123#k=<base64key> जैसे दिखते हैं जब आपने client-side encryption जोड़ी हो। Fragment key को server logs से बाहर रखता है। Download page /shares/abc123 fetch करता है, presigned S3 URL प्राप्त करता है, R2 से bytes stream करता है, browser में decrypt करता है, और परिणाम को StreamSaver.js या File System Access API को सौंपता है।

Content-Disposition: attachment; filename*=UTF-8''encoded-name सेट करें ताकि browser file inline render करने के बजाय save dialog trigger करे। यह PDFs, HTML files, और SVG के लिए मायने रखता है, जो अन्यथा browser context में scripts execute कर सकते हैं।

Abuse के विरुद्ध Hardening

File transfer services abusers को attract करती हैं। तीन categories की अपेक्षा करें: malware distribution, phishing payload hosting, और copyright-infringing uploads। Impact के क्रम में mitigations: प्रति IP uploads rate limit करें, minimum size require करें (10 KB से कम लगभग हमेशा junk है), ciphertext का SHA-256 compute करें और known-bad hashes की denylist के विरुद्ध check करें, और no-friction abuse report form provide करें। Decrypted content पर ClamAV केवल तभी काम करता है जब key हो, जो E2EE defeat करता है — सही जवाब content-agnostic rate limits plus responsive takedowns है।

हर presigned URL को short TTL (1 hour max) से sign करें और sessions को Secure; HttpOnly; SameSite=Strict cookie में stored browser-generated ephemeral token से tie करें।

Deploy करना और Cheap चलाना

एक single ₹830/माह Hetzner CX22 (2 vCPU, 4 GB RAM) Fastify + SQLite + Caddy reverse proxy चलाता है और thousands of active users handle करता है। Caddy Let's Encrypt के माध्यम से automatically TLS 1.3 देता है। DDoS protection और free WAF के लिए Cloudflare सामने रखें। Uptime Kuma (free, self-hosted) से monitor करें और journald द्वारा captured stdout पर log करें।

Geographic redundancy के लिए, Litestream से SQLite को R2 पर replicate करें, और second region को same object store पर point करें। Failover DNS-level है। आपकी पूरी DR story एक napkin पर fit होती है।

ऊपर का पूरा approach mirror करता है कि HexaTransfer कैसे built है — Fastify API, R2 storage, browser में Web Crypto, SQLite metadata, कोई accounts नहीं। hexatransfer.com पर आज़माएं — मुफ़्त, कोई अकाउंट नहीं, अधिकतम 10 GB।

जब तक ज़रूरत न हो Skip करें

V1 में accounts, teams, या folders न बनाएं। Email delivery न जोड़ें। Video preview या image thumbnails implement न करें (दोनों server को plaintext देखने के लिए force करते हैं)। Web version mobile Safari पर rock solid होने से पहले mobile app ship न करें। Feature creep जिसने early file transfer clones को मारा वह हमेशा यही pattern था: accounts, फिर storage quotas, फिर payment, फिर team plans, और suddenly आप Dropbox के साथ compete कर रहे हैं बजाय fast, private transfer tool ship करने के। Surface small और crypto tight रखें।

एंड-टू-एंड एन्क्रिप्शन के साथ बड़ी फ़ाइलें सुरक्षित रूप से भेजें

एंड-टू-एंड एन्क्रिप्शन के साथ 10 GB तक की फ़ाइलें मुफ़्त में ट्रांसफ़र करें। अकाउंट की आवश्यकता नहीं। अपलोड से पहले आपकी फ़ाइलें ब्राउज़र में एन्क्रिप्ट की जाती हैं — कोई और उन्हें पढ़ नहीं सकता।

फ़ाइल भेजें