Catalogs Hide Show
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!
Giao diện website Alist tải file tốc độ cao vận hành qua Cloudflare Worker Proxy
Hệ thống này đang được triển khai thực tế để chia sẻ tài nguyên sạch tại:
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.
I. NGUYÊN LÝ HOẠT ĐỘNG: CƠ CHẾ PROXY DIRECT LINK TỐC ĐỘ CAO
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:- Tạo Project: Truy cập Google Cloud Console và tạo một dự án mới.
- Bật API: Vào mục APIs & Services > Library, tìm kiếm và bật Google Drive API.
- 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.
- Credentials: Tạo OAuth client ID (loại Web application). Nhận về 2 thông số:
Client IDClient Secret
- 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).
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.
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:
Sửa lần cuối: