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.gocit.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
Để 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.gocit.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.gocit.vn.conf
server {
listen 80;
server_name upload.gocit.vn;
access_log /var/log/nginx/upload.gocit.vn.access.log;
error_log /var/log/nginx/upload.gocit.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.gocit.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.gocit.vn;
access_log /var/log/nginx/upload.gocit.vn.access.log;
error_log /var/log/nginx/upload.gocit.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.gocit.vn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/upload.gocit.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.gocit.vn) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name upload.gocit.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.gocit.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.
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é!