[2024] Cách chia sẻ file dễ dàng và nhanh chóng với transfer.sh

transfer.sh

1. Vấn đề gặp phải

Chào các bạn!!

Không biết các bạn đã bao giờ rơi vào tình cảnh muốn upload và chia sẻ file tạm thời đến một người nào đó hay đơn giản là truyền file từ một server Linux sang máy tính Window chưa?

Nếu Server Linux có cài đặt Webserver thì đơn giản, chỉ cần bỏ file vào thư mục docroot (public_html) và phân quyền cho tệp đó, sau đó sao chép link đường dẫn và truy cập trên trình duyệt hay dùng lệnh wget trên Linux thì đã có thể tải file đó về. Đó cũng là cách mà trước đây mình hay dùng, nhưng về lâu dài lại có nhiều bất cập.

Đầu tiên là file không được tự động xoá, về lâu về dài gây đầy dung lượng cho server. Buộc chúng ta phải truy cập và xoá thủ công.

Tiếp theo là không phải server nào cũng có cài đặt Webserver, để truyền file chỉ có cách là dùng FTP hoặc SFTP. Mà trên các server Linux thường chặn SSH bằng password mà chỉ dùng Private key là chủ yếu để nâng cao bảo mật nhưng không phải server nào cũng cho phép add Private key lung tung. Chưa kể đến các rule Firewall các kiểu.

Mình đã khá chật vật khi muốn chia sẻ một file report hệ thống, file code, log hay một file nén nào đó trên server Linux đến cho đồng nghiệp của mình hoặc là tải về máy tính Window của mình.

2. Ý tưởng ban đầu

Mình đã hỏi bác Gồ, sau nhiều kết quả tìm kiếm thì mình thấy có một trang web có thể giải quyết vấn đề của mình. Đó là trang https://transfer.sh/

Transfer.sh là một công cụ tuyệt vời cho phép người dùng upload và chia sẻ tệp/file một cách dễ dàng và nhanh chóng. Với Transfer.sh, bạn có thể tận dụng tính năng upload và chia sẻ file trên trình duyệt và đặt biệt là hỗ trợ mạnh mẽ trên Command line.  Ngoài ra nó còn tương thích với s3 (Amazon S3), gdrive (Google Drive), storj (Storj) providers, and local file system (local).

Xong! Vậy là vấn đề của mình cơ bản coi như đã được giải quyết . Mình có thể sử dụng nó để upload các file report hệ thống trong các file shell script.

Tuy nhiên, liệu rằng trang web đó có bảo mật cho mình hay hông, liệu những file mà mình upload lên có bị rò rỉ thông tin hay không.  Đây vẫn là mối quan tâm lớn cần được giải quyết.

Mình lại mò mẩm bác Gồ tiếp, thì biết được Transfer.sh có Release trên GitHub, có cả MIT License và có hướng dẫn Deploy trên môi trường Self-Hosted giành cho nhà phát triển. 

Cuối cùng, mình quyết định Build Transfer.sh thành một trang của riêng mình, nhằm để phục vụ cho các nhu cầu lưu trữ, chia sẻ file nội bộ.

3. Giải quyết vấn đề

Để build Transfer.sh thì mình cần phải có:

  • Server: mình chọn Ubuntu 22.04 LTS.
    • CPU: 2 VPU
    • Ram: 4 GB
    • Disk: 50GB
    • IP: 1 IPv4 Public
    • Domain: upload.nin.id.vn (Nếu không có cũng được)
  • Golang: nó được viết bằng ngôn ngữ Golang do đó mình sẽ cần phải cài đặt thêm trên server.

3.1 Build Transfer.sh và cài đặt service trên server

Bắt tay vào cài đặt thôi!
Đầu tiên là cần Update và Upgrade hệ thống để cập nhật Repository và các package mới nhất.

				
					apt update -y
apt upgrade -y
				
			

Tiếp theo chúng ta sẽ cài đặt GoLang trên server

				
					apt install golang-go -y
				
			

Dùng lệnh sau để kiểm tra version, nếu ra kết quả tức là đã cài đặt thành công

				
					go version

#Kết quả
go version go1.18.1 linux/amd64
				
			

Kế đến, chúng ta sẽ tải source code từ Github về

				
					apt install git -y
cd /opt
git clone https://github.com/dutchcoders/transfer.sh.git
				
			

Chạy lệnh sau để tiến hành Build tập lệnh transfersh

				
					cd transfer.sh
go build -o transfersh main.go
				
			

Tạo một file service trên Ubuntu, mục dích của việc này giúp chúng ta dễ dàng quản lý các tiến trình và chạy chúng tự động khi bị lỗi hoặc khi restart lại server

				
					mkdir /var/log/transfersh /uploads/
touch /etc/systemd/system/transfersh.service

				
			

Copy hết nội dung sau và Past vào terminal

				
					cat << EOF > /etc/systemd/system/transfersh.service
[Unit]
Description=transfer.sh - go start
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
PIDFile=/var/run/transfersh.pid
ExecStart=/opt/transfer.sh/transfersh --provider=local --listener 127.0.0.1:1919 --temp-path=/uploads/tmp/ --basedir=/uploads/ --log=/var/log/transfersh/transfersh.audit.log --max-upload-size=2048
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target
EOF
				
			

Dưới đây là giải thích từng dòng của đoạn mã:

Type=simple: Đây là kiểu service đơn giản. Nó chỉ định rằng service này không yêu cầu quá trình khởi động phức tạp.

PIDFile=/var/run/transfersh.pid: Đường dẫn đến tệp PID được tạo ra bởi transfersh. PID là số định danh cho tiến trình chạy của service.

ExecStart=/opt/transfer.sh/transfersh –provider=local –listener 127.0.0.1:1919 –temp-path=/uploads/tmp/ –basedir=/uploads/ –log=/var/log/transfersh/transfersh.audit.log –max-upload-size=2048: Đây là lệnh thực thi để khởi động service transfersh. 

Nó sử dụng các tham số để cấu hình dịch vụ, bao gồm:

–provider=local: Định nghĩa rằng service sẽ sử dụng lưu trữ trên local.
–listener 127.0.0.1:1919: Định nghĩa địa chỉ IP và cổng mà dịch vụ sẽ lắng nghe.
–temp-path=/uploads/tmp/: Đường dẫn đến thư mục tạm để lưu trữ các tệp tin tạm thời.
–basedir=/uploads/: Đường dẫn đến thư mục gốc mà dịch vụ sẽ sử dụng để lưu trữ tệp tin.
–log=/var/log/transfersh/transfersh.audit.log: Đường dẫn đến tệp log của transfersh.
–max-upload-size=2048: Kích thước tối đa cho phép của tệp tin được tải lên (đơn vị là Megabyte).

ExecStop=/bin/kill -s TERM $MAINPID: Lệnh thực thi để dừng service transfersh. Nó sử dụng lệnh kill để gửi tín hiệu TERM tới quá trình chính của dịch vụ (được lưu trong biến $MAINPID).

Restart=on-failure: Định nghĩa rằng service sẽ tự động khởi động lại nếu nó dừng hoặc gặp lỗi.

RestartSec=60s: Định cấu hình thời gian chờ giữa các lần khởi động lại service là 60 giây.

Tiếp theo hãy chạy lệnh sau để cập nhật các thay đổi trong các tệp cấu hình service của systemd 

				
					systemctl daemon-reload
				
			

Khởi động và kiểm tra trạng thái service transfersh

				
					systemctl start transfersh.service
systemctl enable transfersh.service
systemctl status transfersh.service
				
			

Kết quả như hình bên dưới là đã cài đặt thành công

				
					transfersh.service - transfer.sh - go start
     Loaded: loaded (/etc/systemd/system/transfersh.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-03-26 16:39:40 UTC; 1min 30s ago
   Main PID: 4871 (transfersh)
      Tasks: 8 (limit: 19136)
     Memory: 8.6M
        CPU: 136ms
     CGroup: /system.slice/transfersh.service
             └─4871 /opt/transfer.sh/transfersh --provider=local --listener 127.0.0.1:1919 --temp-path=/uploads/tmp/ --basedir=/uploads/ --log=/var/log/transfersh/transfersh.audit.log --max-upload-size=2048

Mar 26 16:39:40 upload-vina-host-com systemd[1]: Started transfer.sh - go start.
Mar 26 16:39:58 upload-vina-host-com systemd[1]: /etc/systemd/system/transfersh.service:8: PIDFile= references a path below legacy directory /var/run/, updating /var/run/transfersh.pid → /run/transfersh.pid; please update the unit file accordingly.

				
			

Lưu ý: Đối với những bạn không có domain thì tại bước khai báo –listener hãy để địa chỉ IP public của server.

Cách của mình sẽ cho service transfersh chạy ở local. Sau đó mình sẽ cài đặt thêm nginx và cài đặt thêm SSL cho trang upload này để nâng cao bảo mật.

3.2 Cài đặt Web service và SSL

Đầu tiên để cài đặt Web service Nginx ta sử dụng lệnh sau

				
					apt install nginx -y
				
			

Khởi động và kiểm tra trạng thái nginx

				
					systemctl start nginx
systemctl enable nginx
systemctl status nginx
				
			

Truy cập kiểm tra thử trang web. Đây là trang web mặc định của nginx khi cài đặt thành công

Welcome to nginx

Để có thể truy cập bằng domain, chúng ta sẽ cần tạo thêm một file virtual host trong nginx.

Hãy thay upload.nin.id.vn bằng tên domain của bạn

Copy hết nội dung sau và Past vào terminal

				
					cat << EOF > /etc/nginx/sites-enabled/upload.nin.id.vn.conf
server {
    listen 80;
    server_name upload.nin.id.vn;

    access_log /var/log/nginx/upload.nin.id.vn.access.log;
    error_log /var/log/nginx/upload.nin.id.vn.error.log;

    location / {
        proxy_pass http://127.0.0.1:1919;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF
				
			

Cài đặt trình quản lý gói snap trên Ubuntu và cài đặt cerbot

				
					apt install snapd -y
snap install core; snap refresh core
apt remove certbot -y
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

				
			

Chạy lệnh sau để cài đặt chứng chỉ SSL Let’s encrypt cho domain

				
					certbot --nginx -d upload.nin.id.vn
				
			

Nhập địa chỉ email của bạn và điền tất cả là ‘Yes’ để cài đặt.

Sau khi cài đặt thành công, file virtual host sẽ được cerbot tự động sửa lại thành như sau:

				
					server {
    server_name upload.nin.id.vn;

    access_log /var/log/nginx/upload.nin.id.vn.access.log;
    error_log /var/log/nginx/upload.nin.id.vn.error.log;

    location / {
        proxy_pass http://127.0.0.1:1919;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/upload.nin.id.vn/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/upload.nin.id.vn/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = upload.nin.id.vn) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name upload.nin.id.vn;
    return 404; # managed by Certbot
}
				
			

Chứng chỉ SSL Let’s encrypt có thoài hạn là 90 ngày, do đó chúng ta cần tạo cron để tự động gia hạn chứng chỉ SSL

				
					echo "0 0 1 */2 * /usr/bin/certbot renew --nginx -d upload.vina-host.com" >> /var/spool/cron/crontabs/root
				
			

Lệnh trên sẽ chạy lệnh certbot renew chứng chỉ SSL vào lúc 0:00 của ngày đầu tiên trong mỗi 2 tháng. */2 sẽ chỉ chạy vào các tháng chẵn (tháng 2, 4, 6, 8, 10, 12).

Sau khi thêm vào crontab, Certbot sẽ tự động chạy và gia hạn chứng chỉ SSL mỗi 2 tháng vào ngày đầu tiên của tháng.

3.3 Cài đặt và cấu hình firewall

Firewall mặc định trên Ubuntu là service ufw. Nếu không có ufw thì các bạn có thể cài đặt theo lệnh sau:

				
					apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from dia_chi_ip_cua_ban
				
			

3.4 Kiểm tra hoạt động chia sẻ file

Bây giờ hãy mở trình duyệt và truy cập https://upload.nin.id.vn

Trên trang web đã có sẵn cách hướng dẫn sử dụng bằng Trình duyệt và bằng Command line. Rất đơn giản mình tin là các bạn sẽ biết cách sử dụng ngay thôi.

chia sẻ file hình 1
chia sẻ file hình 2

4. Kết Luận

Transfer.sh là một công cụ chia sẻ file trực tuyến rất tiện lợi và nhanh chóng, không yêu cầu người dùng phải đăng ký tài khoản.

Người dùng chỉ cần làm theo những bước hướng dẫn đơn giản là có thể chia sẻ file của mình một cách đơn giản và nhanh chóng.

Tuy  nhiên do tính chất của nó là Public tài liệu nếu người dùng truy cập đúng link liên kết, nếu kẻ xấu có thể random ra url link liên kết mà tranfer.sh đã tạo ra + tên file của bạn thì kẻ xấu có thể tải file này về. Do đó các bạn hạn chế upload những file chứa thông tin nhạy cảm nhé!

5/5 - (3 votes)

Leave a Reply

Your email address will not be published. Required fields are marked *