Biến Server Armbian Thành Kho Cloud Alist + Tăng Tốc Tải Qua Cloudflare Worker (Phần 1)

Dragon Knight

Member
19/05/2026
178
1
18

🚀 [THỦ THUẬT] BIẾN SERVER ARMBIAN THÀNH KHO CLOUD ALIST + TĂNG TỐC TẢI QUA CLOUDFLARE WORKER (PHẦN 1)
Giải pháp Mount Google Drive lưu trữ không giới hạn, tải file tốc độ cao với 0% băng thông máy chủ

Nếu bạn đang sở hữu một chiếc TV Box chạy Armbian, VPS cấu hình thấp hoặc một chiếc PC mini làm Home Server với cổng mạng giới hạn (100Mbps), việc chia sẻ hoặc tải các file dữ liệu lớn từ Google Drive thường gây nghẽn mạng cục bộ và chiếm dụng tài nguyên máy chủ. Bài viết này sẽ hướng dẫn bạn thiết lập hệ thống Alist kết hợp Cloudflare Worker Proxy – kỹ thuật điều hướng giúp Client tải file trực tiếp từ hạ tầng CDN tốc độ cao của Cloudflare mà máy chủ của bạn không tốn dù chỉ 1 Mbps băng thông!

👉 Bài viết liên quan: [Phần 2] Thiết lập Server Jellyfin / Emby xem phim 302 Direct Stream không tốn băng thông



Alist-cloudflare-worker-darktina-com.png

Giao diện website Alist tải file tốc độ cao vận hành qua Cloudflare Worker Proxy
​


🌐 TRẢI NGHIỆM THỰC TẾ TRÊN WEBSITE DEMO
Hệ thống này đang được triển khai thực tế để chia sẻ tài nguyên sạch tại:
👉 https://downloads.sharevina.com/

⚡ Hiệu năng thực chiến ấn tượng (Benchmark 4 Gb/s):
Trong quá trình thử nghiệm thực tế với máy chủ Google Colab (môi trường mạng băng thông rộng quốc tế), tốc độ kéo file trực tiếp qua cụm Cloudflare Worker + Google Drive API từng đạt đỉnh lên tới 4 Gb/s (~500 MB/s)! Điều này chứng minh năng lực gánh tải và tốc độ truyền dẫn cực khủng của hạ tầng CDN, trong khi chiếc máy chủ Armbian đặt tại nhà hoàn toàn không tốn dù chỉ 1 KB băng thông truyền tải file.



Trước khi bắt tay vào cấu hình, chúng ta cùng tìm hiểu bản chất luồng dữ liệu của hệ thống để hiểu vì sao giải pháp này lại đạt hiệu năng vượt trội:



🖥️
1. Alist Web Server (Armbian)
Đóng vai trò quản lý danh mục, cấu trúc thư mục và xác thực phân quyền tài khoản Google Drive. Alist chỉ gửi/nhận dữ liệu JSON siêu nhẹ (Metadata vài KB) thay vì truyền tải file thô.



⚡
2. Cloudflare Worker
Lớp Proxy Serverless trung gian. Tự động lấy Access Token từ Google OAuth, tiếp nhận request từ người dùng và kéo trực tiếp dữ liệu từ Google Drive API (googleapis.com) đưa về Client.



🛡️
3. Băng Thông Server = 0 Mbps
Toàn bộ dữ liệu nặng nhiều GB truyền trực tiếp giữa Cloudflare CDN và Client tải về. Cổng mạng của máy chủ Armbian hoàn toàn rảnh rỗi, không bị quá tải hay nghẽn đường truyền gia đình.



Mã:
                               +-------------------------------------+
                               |          Cloudflare Worker          |
                               | (Cung cấp Direct Link Google Drive) |
                               +------------------+------------------+
                                                  ^
                                                  | (Tải file trực tiếp tốc độ cao)
                                                  |
+----------------------+ (Bấm Tải / Lấy Link)     |
|    CLIENT TẢI FILE   |--------------------------+
|  (Trình duyệt / IDM) |                        
+----------------------+                        
          |                                     
          | (1. Truy cập duyệt web)              
          v                                     
+----------------------+ (2. Gọi API lấy link)  
|  Alist Server        |--------------------------+
| (Armbian Port 5244)  |
+----------------------+



⚙️ II. CÁC BƯỚC TRIỂN KHAI HỆ THỐNG​


Bước 1: Cài đặt Alist trên Server Armbian / Linux​

Bạn có thể cài đặt nhanh Alist dưới dạng dịch vụ hệ thống (Systemd) bằng 1 câu lệnh chính thức:

Bash:
# Cài đặt Alist bản mới nhất
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install

# Lấy mật khẩu ngẫu nhiên của tài khoản admin
cd /opt/alist
./alist admin

Sau khi cài đặt xong, truy cập vào giao diện web Alist qua địa chỉ: http://<IP_Armbian>:5244 và tiến hành đổi mật khẩu quản trị.



Bước 2: Tạo Google Cloud OAuth Credentials​

Để Alist và Cloudflare Worker có quyền truy cập vào Google Drive của bạn, cần tạo một bộ API Token riêng trên Google Cloud Console:
  1. Tạo Project: Truy cập Google Cloud Console và tạo một dự án mới.
  2. Bật API: Vào mục APIs & Services > Library, tìm kiếm và bật Google Drive API.
  3. OAuth Consent Screen: Chọn loại External, điền tên ứng dụng và thêm email của bạn vào danh sách Test Users.
  4. Credentials: Tạo OAuth client ID (loại Web application). Nhận về 2 thông số:
    • Client ID
    • Client Secret
  5. Lấy Refresh Token nhanh chóng & an toàn:
    Thay vì phải cài đặt Rclone dòng lệnh phức tạp để xác thực lấy Token, bạn có thể sử dụng ngay công cụ trực tuyến tiện lợi:
    👉 Công cụ lấy Refresh Token: token.sharevina.com
    📖 Xem bài hướng dẫn chi tiết từng bước: Lấy Refresh Token Google Drive đơn giản, nhanh chóng & an toàn (token.sharevina.com)



Bước 3: Tạo Script Cloudflare Worker Proxy​

Tạo một Worker mới trên Cloudflare Dashboard và dán đoạn mã bên dưới. Worker này sẽ đứng ra cache Access Token và stream trực tiếp dữ liệu từ Google Drive API:

JavaScript:
// Cấu hình thông tin Google OAuth và Domain Alist của bạn
const CLIENT_ID = "YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com";
const CLIENT_SECRET = "YOUR_GOOGLE_CLIENT_SECRET";
const REFRESH_TOKEN = "YOUR_GOOGLE_REFRESH_TOKEN";
const ALIST_HOST = "https://your-alist-domain.com"; // Hoặc IP Alist công khai

let cachedToken = null;
let tokenExpiresAt = 0;

// Hàm tự động Refresh Token khi Access Token hết hạn (60 phút)
async function getAccessToken() {
  const now = Math.floor(Date.now() / 1000);
  if (cachedToken && now < tokenExpiresAt - 60) {
    return cachedToken;
  }
  const body = new URLSearchParams({
    client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET,
    refresh_token: REFRESH_TOKEN,
    grant_type: "refresh_token"
  });
  const res = await fetch("https://oauth2.googleapis.com/token", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: body.toString()
  });
  const data = await res.json();
  if (data.access_token) {
    cachedToken = data.access_token;
    tokenExpiresAt = now + (data.expires_in || 3600);
    return cachedToken;
  }
  throw new Error("Failed to refresh Google OAuth token");
}

export default {
  async fetch(request) {
    const url = new URL(request.url);

    if (url.pathname === "/") {
      return new Response("Alist High-Speed Worker Proxy is Active!", { status: 200 });
    }

    try {
      let virtualPath = url.pathname;
      if (virtualPath.startsWith("/p/")) {
        virtualPath = virtualPath.substring(2);
      }

      // Tra cứu File ID từ Alist Metadata
      const metaRes = await fetch(`${ALIST_HOST}/api/fs/get`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ path: decodeURIComponent(virtualPath) })
      });
      const metaData = await metaRes.json();

      if (metaData.code === 200 && metaData.data && metaData.data.id) {
        const fileId = metaData.data.id;
        const accessToken = await getAccessToken();

        let streamHeaders = new Headers();
        streamHeaders.set("Authorization", `Bearer ${accessToken}`);
      
        // Hỗ trợ Range Header cho các ứng dụng xem phim và IDM tải đa luồng
        if (request.headers.has("range")) {
          streamHeaders.set("Range", request.headers.get("range"));
        }

        const driveRes = await fetch(`https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&acknowledgeAbuse=true`, {
          method: request.method === "HEAD" ? "HEAD" : "GET",
          headers: streamHeaders
        });

        let responseHeaders = new Headers(driveRes.headers);
        responseHeaders.set("Access-Control-Allow-Origin", "*");
        responseHeaders.set("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
        responseHeaders.set("Content-Disposition", `attachment; filename="${encodeURIComponent(metaData.data.name)}"`);

        return new Response(driveRes.body, {
          status: driveRes.status,
          statusText: driveRes.statusText,
          headers: responseHeaders
        });
      }
    } catch (e) {
      console.error("Worker Proxy Error:", e);
    }

    // Fallback về server Alist nếu không tìm thấy file ID
    let targetUrl = ALIST_HOST + url.pathname + url.search;
    let headers = new Headers(request.headers);
    headers.delete("host");
    return fetch(targetUrl, {
      method: request.method,
      headers: headers,
      body: request.body,
      redirect: "follow"
    });
  }
};



Bước 4: Cấu hình Storage trên Alist (Điểm cốt lõi ⚡)​

Truy cập vào trang quản trị Alist > Manage > Storages > Add:
  • Driver: Chọn Google Drive.
  • Mount Path: Điền thư mục hiển thị trên web (ví dụ: /GoogleDrive).
  • Client ID / Secret / Refresh Token: Nhập thông tin bạn đã tạo ở Bước 2.
  • WebDAV Policy (Bắt buộc): Chọn use proxy URL.
  • Down Proxy URL: Dán địa chỉ Cloudflare Worker bạn vừa tạo (ví dụ: https://gdrive-proxy.your-worker.workers.dev).
Alist-cloudflare-worker-darktina-com-proxy.png




⚠️ NHƯỢC ĐIỂM QUAN TRỌNG CẦN BIẾT & GIẢI PHÁP KHẮC PHỤC

Hiện tượng:
Khi một Client mở trình duyệt hoặc IDM để tải nhiều file cùng một lúc (Multiple Downloads) từ giao diện Alist, tốc độ tải sẽ ngay lập tức bị bóp nghẽn nghiêm trọng, thậm chí xảy ra tình trạng đứng hình hoặc đứt kết nối giữa chừng (429 Too Many Requests hoặc 403 Forbidden).

Nguyên nhân kỹ thuật:
1. Google Drive API Concurrency Limit: Google áp dụng cơ chế giới hạn tần suất request (Rate Limit) rất chặt chẽ trên mỗi OAuth Client. Khi bạn kéo cùng lúc 5-10 file nặng, số lượng request và dung lượng song song vượt ngưỡng khiến Google tạm thời bóp băng thông API.
2. Cloudflare Worker Limits: Tài khoản Cloudflare Free bị giới hạn tài nguyên CPU time và số luồng kết nối đồng thời từ cùng 1 IP Client.


Giải pháp bắt buộc dành cho người tải:
  • Phải sử dụng Queue Download (Hàng đợi tải tuần tự): Tuyệt đối không bấm tải 5-10 file song song cùng lúc. Người tải cần sử dụng tính năng Download Queue / Scheduler trong IDM (hoặc các phần mềm tương đương) để thiết lập tải lần lượt từng file một (Download 1 file at a time).
  • Giới hạn số luồng (Connections per file): Cấu hình IDM tối đa từ 4 đến 8 kết nối cho mỗi file để luồng tải được ổn định và khai thác tối đa băng thông quốc tế mà không kích hoạt cơ chế chống spam của Google.




🎯 III. TỔNG KẾT & BƯỚC TIẾP THEO​


Với mô hình Alist kết hợp Cloudflare Worker, bạn đã có một kho lưu trữ đám mây khổng lồ, chia sẻ file cho bạn bè với tốc độ cực nhanh mà thiết bị Armbian tại nhà không hề phải gánh bất kỳ tải băng thông nào.


🎬 TIẾP TỤC VỚI PHẦN 2: BIẾN ALIST THÀNH SERVER PHIM JELLYFIN
Làm thế nào để truyền trực tiếp kho phim trên Alist vào Jellyfin / Emby mà không làm đầy ổ đĩa và xem phim mượt mà? Mời các bạn đón đọc bài viết tiếp theo:

👉 [Phần 2] Thiết lập Server Jellyfin / Emby kết hợp Alist + 302 Direct Stream Proxy (Xem Phim Trực Tiếp 0% Băng Thông)
 
Sửa lần cuối: