So sánh trình quản lý tệp tự host: FileBrowser và hơn nữa
So sánh FileBrowser, Filestash, SFTPGo và Cloud Commander về giới hạn thư mục, share link, storage backend, auth và cách chạy an toàn trên VPS.
Trình quản lý tệp tự host là gì và không phải là gì
Trình quản lý tệp tự host là một trang web hiển thị cây thư mục đã tồn tại trên VPS (virtual private server) của bạn. Bạn đăng nhập, thấy /srv/files đúng như trên ổ đĩa, rồi tải lên, đổi tên, tải xuống hoặc gửi liên kết cho người khác. Không có dữ liệu nào được sao chép sang hệ thống thứ hai, nên tệp bạn thả vào trình duyệt cũng là tệp mà ls hiển thị sau một giây.
Kết quả tìm kiếm thường đánh đồng công cụ này với phần mềm làm các công việc khác. Công cụ đồng bộ giữ một bản sao của mọi tệp trên mọi thiết bị, đó là mục đích của một giải pháp thay thế Dropbox tự host. Object storage không có cây thư mục; nó có bucket và API, nên chạy MinIO cho object storage tương thích S3 giải quyết một nhu cầu khác. Control panel quản trị server quản lý máy chủ thay vì các tệp, và đó là nội dung của so sánh Cockpit và Webmin.
Bạn cần trình quản lý tệp khi đồng nghiệp cần lấy một archive 300 MB từ server, hoặc khi bạn muốn sửa lỗi gõ trong tệp cấu hình bằng điện thoại. Công việc nhỏ, nên công cụ cũng nhỏ.
Hãy ghi nhớ một điều trong khi đọc. Đây là một web application có quyền đọc và ghi vào filesystem, đang listen trên một port. Mỗi lựa chọn dưới đây thực chất là lựa chọn về phạm vi filesystem mà process đó có thể truy cập.
FileBrowser đã được lưu trữ, hãy đọc phần này trước khi cài đặt
FileBrowser, dự án filebrowser/filebrowser, vẫn là câu trả lời trong hầu hết các hướng dẫn. README của dự án hiện mở đầu bằng thông báo:
File Browser được lưu trữ vào 2026-09-01. Bản release cuối cùng theo kế hoạch đã được phát hành. Sẽ không có thêm release, bản sửa lỗi hoặc bản sửa lỗi bảo mật nào.
Mã nguồn theo giấy phép Apache 2.0 vẫn hoạt động. Các bản sửa lỗi bảo mật sẽ dừng lại. Điều này đặc biệt quan trọng với nhóm phần mềm này, vì mục đích chính của nó là cung cấp quyền ghi vào filesystem qua HTTP.
Các maintainer đã ghi rõ cách tiếp tục vận hành phần mềm. Bạn nên làm theo các khuyến nghị đó dù chọn công cụ nào: không expose trực tiếp ra internet, đặt nó phía sau reverse proxy thực hiện TLS termination (transport layer security) và tự xử lý authentication, tắt command runner, đồng thời chạy dưới tài khoản không có đặc quyền trong container chỉ mount thư mục bạn định cung cấp vào container.
Một dòng trong README quan trọng hơn phần còn lại. Session là JWT (JSON web token) tự chứa thay vì identifier phía server, nên không thể revoke. Session token bị lộ vẫn hợp lệ cho đến khi hết hạn, và đổi password cũng không vô hiệu hóa token đó. Nếu tiếp tục dùng FileBrowser, authentication layer đặt phía trước nó mới là thành phần thực sự bảo vệ hệ thống.
FileBrowser Quantum: fork vẫn đang được phát triển
Hoạt động phát triển đã chuyển sang fork FileBrowser Quantum (gtsteffaniak/filebrowser), được phát hành dưới dạng image gtstef/filebrowser. Dự án này xây dựng lại cấu hình quanh một config.yaml duy nhất, thay cho cách kết hợp flag dòng lệnh và thiết lập database của bản cũ. Lệnh dùng thử được tài liệu hướng dẫn:
docker run -d \
-v $(pwd):/srv \
-p 80:80 \
gtstef/filebrowser:betaLệnh này phục vụ thư mục hiện tại tại http://localhost. Thông tin đăng nhập lần đầu là admin / admin. Hãy đổi mật khẩu trước khi container có thể được truy cập từ bất kỳ đâu ngoài máy của bạn.
Nếu giữ instance để sử dụng lâu dài, hãy dùng Compose, mount thư mục dữ liệu thay vì chỉ một file database, và bind port vào localhost:
services:
filebrowser:
image: gtstef/filebrowser:beta
user: "1000:1000"
volumes:
- /srv/files:/folder
- ./data:/home/filebrowser/data
ports:
- 127.0.0.1:8080:80
restart: unless-stoppedFile cấu hình nằm tại /home/filebrowser/data/config.yaml và database nằm tại /home/filebrowser/data/filebrowser.sqlite. Phiên bản 2.0.0 đã thay đổi định dạng database và thực hiện migration một lần. Vì vậy tài liệu yêu cầu mount một thư mục: mount một file đơn lẻ không cung cấp nơi để migration ghi file mới. Các path bên trong config.yaml là path trong container. Vì vậy source trong cấu hình đọc /folder, không phải /srv/files. Nếu đảo ngược hai path này, danh sách file sẽ trống mà không có lỗi, vì thư mục đó thực sự không tồn tại.
Dự án phát hành latest và stable với dung lượng khoảng 60 MB, đã tích hợp FFmpeg để tạo thumbnail video, cùng stable-slim với dung lượng khoảng 15 MB, chỉ gồm phần core. Đây là các con số trên trang cài đặt vào tháng 8 năm 2026. Hãy pin tag bạn đã chọn. latest thay đổi mà không thông báo, và một file manager tự thay đổi format cấu hình trong khi container đang chạy sẽ gây ra nhiều vấn đề.
Đối với công việc này, đây là công cụ mạnh nhất trong nhóm các công cụ nhỏ. Nó phục vụ nhiều source với rule include và exclude, nên một instance có thể expose /srv/media và /srv/docs với scope khác nhau. Share có thời hạn hết hạn và có thể cho phép truy cập anonymous hoặc giới hạn theo user. Cơ chế xác thực hỗ trợ OIDC (OpenID Connect), LDAP (lightweight directory access protocol), password kèm two factor và proxy header mode. Proxy mode này cho phép đặt ứng dụng phía sau single sign on (SSO) từ một Authentik server tự host thay vì phải duy trì thêm một danh sách user.
Filestash: một giao diện cho các storage bạn đang có
Filestash có mô hình khác. Đây là một front end kết nối với backend, và danh sách backend rất dài: FTP, SFTP (SSH file transfer protocol), S3, SMB, WebDAV, IPFS và khoảng hai mươi loại khác. Filestash phù hợp khi các file không nằm trên máy chủ chạy giao diện.
mkdir -p /srv/filestash && cd /srv/filestash
curl -O https://downloads.filestash.app/latest/docker-compose.yml
docker compose up -dImage là machines/filestash:latest. Mở http://your_domain:8334 để đặt admin password ở màn hình đầu tiên. Hãy đặt ngay, vì trước khi làm vậy, bất kỳ ai phát hiện ra cổng này đều có thể truy cập admin console.
Hãy hiểu mô hình identity trước khi xây dựng hệ thống dựa trên Filestash. Filestash không lưu user database theo cách thông thường. Credentials được lưu trong browser bằng cookie đã được mã hóa, xác thực và đặt thuộc tính HTTP only. Không có dữ liệu nào được lưu phía server, trừ khi bạn dùng tính năng share. Khi đó, Filestash lưu một phiên bản credentials đã mã hóa và có tính persistent. "User" ở đây là các storage account: identity nằm trong backend, cụ thể là SFTP account hoặc S3 key, không nằm trong Filestash.
Thiết kế này gọn, nhưng có chi phí. Trang pricing ghi rằng tier self-hosted miễn phí dùng AGPL v3 (GNU Affero General Public License) và hỗ trợ tối đa 3 user. Tính năng SSO (SAML, OIDC và LDAP) cùng role based access control nằm trong tier self-hosted trả phí, từ $50 mỗi tháng, theo thông tin tại August 2026. Nếu kế hoạch của bạn là "dùng Filestash trước company SSO mà không mất phí", hãy kiểm tra trang đó trước khi thiết kế hệ thống dựa trên mô hình này.
SFTPGo: máy chủ giao thức cũng có giao diện web
SFTPGo là phần mềm có nhiều khả năng nhất trong nhóm này và cũng là phần mềm thường bị khuyến nghị vì lý do sai. Phần mềm cung cấp SFTP, HTTP/S, FTP/S và WebDAV trên filesystem cục bộ, filesystem cục bộ được mã hóa, object storage tương thích S3, Google Cloud Storage, Azure Blob Storage hoặc một SFTP server khác.
SFTPGo phát hành binary, package cho Debian và Ubuntu, cùng container image. Dòng APT hiện tại và signing key của repository nằm trên trang cài đặt trong tài liệu SFTPGo. Dùng container là cách nhanh nhất để chạy phần mềm. Thay tag bằng version bạn muốn:
docker run --name some-sftpgo -p 8080:8080 -p 2022:2022 -d "drakkan/sftpgo:tag"SFTP lắng nghe trên cổng 2022, còn các giao diện web lắng nghe trên cổng 8080. Mount /srv/sftpgo làm volume. Nếu không, các account và file của chúng sẽ biến mất khi container được tạo lại, vì home directory của user mặc định là /srv/sftpgo/data/<username>.
Có 2 giao diện web. Điểm khác biệt này thường không được nói rõ trong các bài hướng dẫn. WebAdmin tại /web/admin là giao diện quản trị. Đây là nơi bạn tạo user, group, virtual folder và event rule, đồng thời đặt quota, giới hạn bandwidth và giới hạn thời gian truy cập. WebClient tại /web/client là giao diện cho end user. Người dùng có thể duyệt file, đổi thông tin xác thực của chính mình, thiết lập xác thực hai yếu tố và tạo share tại đây.
Tính năng share của SFTPGo là tốt nhất trong phần so sánh này. User có thể tạo link HTTP/S để chia sẻ file và folder, giới hạn số lần download và upload, bảo vệ share bằng password, giới hạn truy cập theo source IP address và đặt ngày tự động hết hạn.
Vậy tại sao cần thận trọng? Trọng tâm của SFTPGo là mô hình account và protocol server, không phải trải nghiệm duyệt file. Hãy chọn SFTPGo khi người khác cần account thực với quota, khi upload đến qua SFTP hoặc FTPS từ một hệ thống bạn không kiểm soát, hoặc khi một bucket phải xuất hiện trong home directory của nhiều user. Virtual folder xử lý trường hợp cuối: một folder được lưu trên local disk, S3, GCS, Azure Blob, SFTP hoặc HTTP, được mount vào nhiều account, với quota riêng cho từng user trên một folder dùng chung. Nếu mục tiêu duy nhất của bạn là tạo một trang có thể duyệt cho /srv/files, đây là lượng thành phần lớn hơn nhiều so với nhu cầu đó.
Còn 2 thông tin đáng lưu ý. Bản Community chỉ được cấp phép theo AGPL-3.0 với các điều khoản bổ sung, bên cạnh bản Enterprise được cấp phép thương mại. OIDC login có trong bản open source và ánh xạ user của identity provider thành admin và user của SFTPGo cho cả 2 giao diện web. Bạn cũng có thể tắt giao diện client trên toàn hệ thống bằng enable_web_client trong cấu hình httpd, hoặc tắt theo từng user bằng cách thêm HTTP vào danh sách protocol bị từ chối của user đó. Nhờ vậy, file manager có thể được bật cho một người và tắt với mọi người khác.
Cloud Commander: hai panel và terminal cho một người
Cloud Commander là trình quản lý Node.js được cấp phép MIT theo kiểu hai panel, có editor tích hợp, console và terminal. Cài đặt global bằng npm i cloudcmd -g hoặc chạy container đã được publish:
docker run -it --rm -v ~:/root -v /:/mnt/fs -w=/root -p 8000:8000 coderaiser/cloudcmdĐọc kỹ command đó trước khi chạy. -v /:/mnt/fs mount toàn bộ filesystem của host vào container, còn mẫu ~/.cloudcmd.json cung cấp "root": "/", "auth": false và "console": true. Kết hợp này có nghĩa là bất kỳ ai truy cập được cổng 8000 đều có toàn quyền với toàn bộ disk và command console trên server. Đây là mặc định hợp lý cho laptop nhưng không phù hợp với VPS.
Giới hạn phạm vi sử dụng. Container đọc /root/.cloudcmd.json. Command đã publish cung cấp file này bằng cách mount home directory của bạn, vì vậy hãy giữ config mount và bỏ các mount còn lại:
docker run -d --name cloudcmd \
-v ~/.cloudcmd.json:/root/.cloudcmd.json \
-v /srv/files:/srv/files \
-w=/srv/files \
-p 127.0.0.1:8000:8000 \
coderaiser/cloudcmdTrong file config đó, đặt "root" thành /srv/files, đặt "auth" thành true cùng với một "username" và "password", đồng thời đặt "console" và "terminal" thành false trừ khi bạn thực sự muốn cho phép truy cập shell qua browser. Cũng có các tùy chọn tương đương trên command line, gồm --root, --auth, --username, --password và --prefix.
Hãy xác định rõ giới hạn của công cụ này. Nó chỉ có một cặp thông tin xác thực, không giới hạn theo từng user, không có quota và không có share link. Đây là công cụ cá nhân, vì vậy hãy bind nó vào localhost như trên và truy cập qua tunnel:
ssh -L 8000:127.0.0.1:8000 you@your-vpsSau đó mở http://127.0.0.1:8000 trên máy của bạn. File manager không bị expose công khai, và thành phần duy nhất đối diện với Internet là SSH daemon mà bạn đã hardening trên VPS.
Vì sao Nextcloud không phù hợp cho công việc này
Nextcloud là phần mềm tốt, nhưng không phù hợp cho việc này. Đây là một nền tảng cộng tác gồm ứng dụng PHP, database, background job, desktop sync client và app store. Chạy Nextcloud chỉ để có giao diện web cho /srv/files là quá nhiều thành phần đối với một công việc nhỏ, đồng thời còn có một điểm không tương thích cụ thể. Nextcloud lưu metadata của file trong một bảng database thay vì đọc directory ở mỗi request. Vì vậy, các file được ghi bởi rsync hoặc cron job có thể chưa hiển thị trong giao diện cho đến khi quá trình scan bắt kịp, kèm theo sudo -u www-data php occ files:scan --all. File manager đọc directory khi bạn tải trang, nên không có khoảng trễ này.
Hãy dùng Nextcloud cho những việc nó làm tốt: calendar, contact, sync và chia sẻ với những người cần desktop client. Nextcloud trên VPS với Docker, TLS và backup trình bày cấu hình đó. Nếu bạn đã chạy Nextcloud và chỉ cần xem một directory có sẵn, hãy bật app External Storage rồi dừng ở đó. Thêm một web application có quyền ghi vào cùng disk đồng nghĩa với thêm một thành phần khác cần patch.
Cách chạy một instance mà không trao toàn bộ server
Không bao giờ trỏ nó vào /. Process có thể đọc và ghi mọi thứ mà user account của nó truy cập được, nên session token bị đánh cắp sẽ trở thành đúng chừng đó quyền truy cập filesystem. Chỉ serve một directory, /srv/files, và tạo directory đó riêng cho mục đích này.
Chạy nó bằng non-root user và chỉ mount những gì nó cần serve. Trong Compose, đó là user: "1000:1000" cộng với một bind mount cho mỗi directory, kèm :ro trên mọi thứ mà nó không bao giờ cần ghi:
volumes:
- /srv/files:/folder
- /srv/media:/media:roKết quả thường thấy của thay đổi này là việc duyệt file vẫn hoạt động nhưng upload thất bại với permission denied, vì user id bên trong container không sở hữu directory bên ngoài container. So sánh hai bên: docker exec filebrowser id in ra user của container, còn ls -ln /srv/files in ra owner dạng số trên host. Sửa bằng sudo chown -R 1000:1000 /srv/files. Đây cũng là vấn đề ownership mà PUID và PGID trong Docker image được tạo ra để giải quyết.
Bind published port vào localhost, 127.0.0.1:8080:80 thay vì 8080:80. Docker ghi các rule netfilter của riêng nó trước rule của ufw, nên một port được publish thông thường vẫn có thể truy cập từ Internet ngay cả khi ufw deny 8080 đang active. Đặt reverse proxy ở phía trước để xử lý TLS. Qua HTTP thuần, session cookie đi qua network dưới dạng plaintext, và cookie đó chính là quyền truy cập filesystem. Nếu bạn chưa quen với Compose, Docker Compose trên VPS trình bày layout file mà các đoạn cấu hình này giả định.
Thêm authentication layer khi authentication tích hợp của ứng dụng còn hạn chế. HTTP basic auth tại proxy là đủ cho một instance chỉ có một user. Khi có nhiều hơn một người, hãy dùng OIDC hoặc forward auth với identity provider để revoke một account sẽ revoke quyền truy cập ở mọi nơi.
Tắt các tính năng bổ sung. Bất kỳ file manager nào có shell, command runner hoặc terminal chạy trong trình duyệt đều cung cấp remote code execution cho người đang nắm giữ session hợp lệ. Hướng dẫn của FileBrowser khuyên tắt command runner, còn sample config của Cloud Commander bật console. Hãy chủ động quyết định thay vì giữ thiết lập mặc định.
Điều gì hỏng trước và các lỗi bạn sẽ thấy
listen tcp :80: bind: permission denied. Linux dành các cổng dưới 1024 cho các tiến trình có quyền đặc biệt. Cấu hình được tài liệu của FileBrowser Quantum nêu dùng cổng 80. Cấu hình này hoạt động trong container nhưng sẽ lỗi ngay khi bạn chạy binary bằng user không có quyền đặc biệt trên host. Đặt một cổng lớn hơn 1024 trong config.yaml và để proxy quản lý cổng 443.
Upload lỗi trong khi duyệt thư mục vẫn hoạt động. Việc liệt kê một thư mục cần r-x, còn ghi vào thư mục đó cần w. Giao diện web chỉ báo lỗi chung, vì vậy trước tiên hãy kiểm tra filesystem thay vì log của ứng dụng.
413 Request Entity Too Large. Lỗi đó đến từ nginx, không phải từ file manager. Giá trị mặc định của client_max_body_size là 1 MB, nên upload lớn hơn sẽ bị proxy từ chối trước khi ứng dụng nhận được dữ liệu. Đặt client_max_body_size 4096m; trong block server, hoặc đặt 0 để tắt kiểm tra.
File đã upload có group không đúng. File mới thuộc về user chạy process, bất kể directory bên ngoài được cấu hình thế nào. Điều này làm hỏng việc service thứ hai đọc cùng một cây thư mục. Cho cả hai service dùng chung một group và đặt bit setgid trên directory bằng sudo chmod g+s /srv/files để file mới kế thừa group của directory.
Mọi thứ hoạt động trên cổng trực tiếp nhưng lỗi phía sau proxy. Ứng dụng được phục vụ dưới một subpath sẽ tạo link dựa trên một prefix mà bạn phải khai báo cho ứng dụng. Cloud Commander có --prefix cho việc này. Nếu ứng dụng không có tùy chọn tương ứng, hãy cấp cho ứng dụng một subdomain riêng và proxy root path.
Nên chạy file manager tự host nào?
- Một VPS, một hoặc hai thư mục, cần chia sẻ link có thời hạn và có thể thêm SSO sau này: FileBrowser Quantum.
- File nằm ở nơi khác, chẳng hạn S3 bucket, SFTP host hoặc NAS qua SMB, và bạn muốn xem tất cả trong một giao diện web: Filestash, trong giới hạn của free tier.
- Người khác cần account, quota và khả năng upload qua SFTP hoặc FTPS: SFTPGo. Hãy xem web client là tính năng bổ sung hữu ích, không phải lý do chính để chọn phần mềm này.
- Công cụ cá nhân có editor và terminal, truy cập qua SSH tunnel và không bao giờ publish ra Internet: Cloud Commander.
- Đã chạy Nextcloud và có sẵn một thư mục cần expose: dùng app External Storage, không cần cài thêm phần mềm.
Dù chọn phần mềm nào, cách triển khai quan trọng hơn bản thân lựa chọn. Chỉ expose một thư mục, dùng user không phải root, bind cổng vào localhost và đặt authentication ở phía trước. File manager được cấu hình như vậy chỉ là công cụ tiện ích. Cùng phần mềm đó, nếu trỏ vào / bằng một shared password, sẽ trở thành remote shell có giao diện đẹp.
FAQ
FileBrowser còn an toàn để chạy trong 2026 không?
README filebrowser/filebrowser của dự án upstream nêu rằng File Browser đã được lưu trữ vào ngày 2026-09-01 và sẽ không có thêm bản phát hành, bản sửa lỗi hoặc bản sửa lỗi bảo mật nào. Code vẫn chạy, nhưng phần mềm không được vá mà có quyền ghi vào filesystem sẽ ngày càng rủi ro theo thời gian. Nếu vẫn sử dụng, hãy làm theo khuyến nghị của dự án: không expose trực tiếp ra Internet, dùng reverse proxy để xử lý TLS và authentication riêng, để command runner ở trạng thái disabled, đồng thời chạy trong container không đặc quyền và chỉ mount thư mục được phục vụ. Cũng cần lưu ý rằng session của ứng dụng là JWT tự chứa thay vì identifier lưu phía server, nên không thể revoke; đổi password cũng không vô hiệu hóa token đã được phát hành. Nếu cài mới, hãy dùng fork FileBrowser Quantum, được phát hành dưới dạng image gtstef/filebrowser, vì dự án này vẫn đang được phát triển.
File manager tự host có thể dùng SSO hiện có của tôi không?
FileBrowser Quantum hỗ trợ OIDC, LDAP và chế độ proxy header, nên có thể chạy phía sau identity provider hiện có mà không cần một danh sách user thứ hai. Tích hợp OpenID Connect của SFTPGo có trong bản open source và ánh xạ user của identity provider với admin và user của SFTPGo cho cả giao diện WebAdmin và WebClient. Filestash là trường hợp cần lưu ý: trang pricing của sản phẩm xếp SSO (SAML, OIDC và LDAP) vào tier self-hosted trả phí, từ $50 mỗi tháng tính đến tháng 2026-08, trong khi tier miễn phí được liệt kê là AGPL v3 với tối đa 3 user. Khi ứng dụng hoàn toàn không hỗ trợ SSO, phương án dự phòng là forward authentication tại reverse proxy. Cách này bảo vệ trang đăng nhập nhưng không thay đổi quyền nội bộ của ứng dụng.
Những sản phẩm nào trong số này cung cấp share link có thời hạn?
SFTPGo có triển khai đầy đủ nhất. User tạo link HTTP/S từ WebClient và có thể giới hạn số lần download và upload, đặt password, giới hạn truy cập theo địa chỉ IP nguồn và đặt ngày hết hạn tự động. FileBrowser Quantum hỗ trợ share có thời hạn, với quyền truy cập anonymous hoặc giới hạn cho một user, cùng permission riêng cho từng share về việc xem, chỉnh sửa và upload. Filestash cũng có tính năng share. Đây là trường hợp duy nhất mà server giữ một bản sao được mã hóa và persistent của credential storage, vì link phải hoạt động ngay cả khi browser session của bạn đã kết thúc. Cloud Commander hoàn toàn không có share link.
Nếu tôi là user duy nhất, trỏ file manager vào / có an toàn không?
Không, và rủi ro không thực sự nằm ở việc bạn có tin tưởng chính mình hay không. Process có quyền đọc và ghi mọi thứ mà user account của nó có thể truy cập. Vì vậy, bất kỳ đường dẫn nào vào session đó, cookie bị đánh cắp, bug chưa được vá trong upload handler hoặc password bị dùng lại đều có thể trở thành quyền truy cập vào /etc, các SSH key của bạn và thư mục dữ liệu của mọi service. Thay vào đó, hãy giới hạn mount vào một thư mục: /srv/files thay vì /. Cloud Commander là trường hợp dễ gây hậu quả nhất, vì Docker command được công bố của sản phẩm mount root của host tại /mnt/fs và config mẫu đặt "root": "/" với "auth": false. Hãy thay đổi cả hai trước khi container đó listen trên bất kỳ địa chỉ nào ngoài localhost.