Hướng dẫn triển khai mozilla-send từ source code (Phần 1): Tổng quan về công nghệ và triển khai ở local

I. Tổng quan

1.1. Giới thiệu

Firefox Send là một dự án khá thú vị của Firefox với mục đích chia sẻ file giới hạn thời gian tải, số lượt tải và mã hóa file. Có nghĩa là nếu gửi file zip qua Facebook không được thì bạn tải lên đây và đưa link vào Facebook. Khá là tiện, tuy nhiên dự án này dừng vào ngày 17, tháng 9, năm 2020. Với lý do nguyên gốc như sau:

“Firefox Send has been discontinued as of September 17th, 2020. You will no longer be able to upload or receive files. We’d like to thank all of you who tried Firefox Send.We started Firefox Send as a way for you to share files safely and easily from any browser. Unfortunately, some abusive users were beginning to use Firefox Send to ship malware and conduct phishing attacks. When this problem was reported, we stopped the service. Please see the Mozilla Blog for more details on why this service was discontinued. ” – Nguồn https://support.mozilla.org/en-US/kb/what-happened-firefox-send

Khá là may vẫn còn source code trên Github (https://github.com/mozilla/send) nên mình thử triển khai lại dùng cho mục đích cá nhân vậy (https://send.techcave.vn/). Phải nói là yêu mấy dự án mã nguồn mở thật sự.

Để có thể từ source code trên Github và triển khai nó chạy được như ở https://send.techcave.vn thì thực sự không khó, nhưng khá là rườm rà và liên quan nhiều thứ như sử dụng Linux, Docker, Nginx, Cloudflare,… Chính vì vậy, mình hy vọng bài viết này sẽ cho các bạn thấy được quá trình tổng quan để triển khai mã nguồn này và các dịch vụ tương tự lên Internet. Hiển nhiên là mọi thứ còn ở mức độ khá sơ khai, nên khi sử dụng thực tế còn phải thiết lập nhiều kỹ thuật nâng cao khác, như cân bằng tải, …

1.2. Các kỹ thuật liên quan

Trong phần này mình sẽ đề cập về các kỹ thuật như Docker, Nginx, SSL, CentOS và Cloudflare.

1.2.1. Docker

Docker là gì và tại sao lại dùng docker thì mình nghĩ bài viết này khá chi tiết. https://aws.amazon.com/vi/docker/ Nhưng sau khi đọc xong có lẽ bạn vẫn còn mù mờ thì chúng ta có thể làm đó chính là thực hành, và một lời khuyên nho nhỏ của mình là nếu bắt đầu mới tập dùng docker, thì tốt nhất là sử dụng các hệ điều hành Linux như Ubuntu, CentOS, Kali, … hoặc macOS thay vì dùng Windows. Trải nghiệm docker trên Windows thực sự không để lại ấn tượng tốt đẹp lắm trong mình khi lần đầu sử dụng. Khi dùng Docker, mình cần chú ý các thuật ngữ sau:

  • Docker image.
  • Docker container.
  • Docker compose.
  • Volume.

Giả sử bây giờ bạn đang có một server hoặc một máy tính cá nhân chạy Ubuntu 20.04 LTS. Bạn muốn nó chạy một mã nguồn và nó yêu cầu sử dụng Node.js 12 nhưng bạn đang chạy một phần mềm khác và nó chỉ tương thích với Node.js 10. Thay vì ngồi đau đầu nghiên cứu làm sao 2 phần mềm này chạy cùng trên một phiên bản Node.js hoặc nghiên cứu để máy tính có thể chạy cùng lúc nhiều phiên bản của Node.js thì mình chọn docker. Docker nó sẽ tạo ra một môi trường ảo, tương tự như máy ảo khi ta dùng các phần mềm Oracle VM VirtualBox hoặc VMware nhưng sẽ ít tốn tài nguyên hơn, dễ quản lý hơn và phù hợp với nhu cầu mình đang kể trên. Quay lại vấn đề vừa nói ở trên, mình sẽ không tác động gì đến phiên bản Node.js 10 và phần mềm đang chạy. Mà mình sẽ khởi tạo và chạy một docker container với mã nguồn và môi trường Node.js 12

Thực hành trực tiếp với mozilla-send ở trên, ta thấy trong phần README.md trên Github của mã nguồn này có yêu cầu Node.js 12. Tiếp tục xem trong repo Github này xem có cái gì liên quan đến Docker không. Ở đây có 2 file khá có giá trị là docker-compose.ymlDockerfile.

  • Dockerfile là gì? Tham khảo tại đây hoặc hiểu đơn giản nó là chỉ dẫn cho máy tính để tạo ra một Docker Image.
  • Docker-compose.yml là file dùng để sử dụng docker-compose. File này chứa các cấu hình để chạy docker image thành docker container.

Ví dụ, để triển khai dịch vụ Portainer (một phần mềm quản lý docker khá là thú vị). Khi dùng docker-compose thì chúng ta khởi tạo một file docker-compose.yml với nội dung như sau:

version: '2'

services:
  portainer:
    image: portainer/portainer
    command: -H unix:///var/run/docker.sock
    restart: always
    ports:
      - 9000:9000
      - 8000:8000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:

Sau đó chạy câu lệnh docker-compose up -d ở thư mục chứa file trên là được.

Còn nếu không dùng docker-compose, thì chúng ta sẽ chạy hai lệnh như thế này:

docker volume create portainer_data
docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Chúng ta sẽ thực hành với mozilla-send ở bước sau.

1.2.2. Nginx

Trước khi nói về Nginx thì mình xin được gửi lời cảm ơn đến một thầy giáo ở bộ môn Công nghệ mạng của trường mình. Thời điểm đó mình làm bài tập kết thúc môn học và làm về Nginx, thầy cho mình khá thấp điểm, và mình cũng cảm thấy khá là chán vì mình nghĩ mình đã làm rất tốt rồi. Nhưng sau này mình mới hiểu ra rằng, số điểm đó là khá cao so với những gì mình biết và dùng được vào thời điểm đó.

Khác với Apache, Nginx là máy chủ web phổ biến nhất hiện có. Ngoài việc là một máy chủ web, nó cũng có thể được sử dụng như một trình cân bằng tải hoặc reverse proxy. Trong hướng dẫn này mình sẽ sử dụng chức năng như một reverse proxy. Reverse proxy là một loại proxy server trung gian giữa một máy chủ và các client gửi tới các yêu cầu. Giả sử như thế này, bạn chạy một trang web nhưng chạy ở cổng 8080, còn mặc định khi truy cập web thì là cổng 80 và 443. Sẽ cấu hình nhận request ở cổng 80 nhưng Nginx sẽ chuyển đến yêu cầu đó đến web đang chạy cổng 8080 và phản hồi. Lát sau, khi chạy mozilla-send mình sẽ giải thích cụ thể và trực quan hơn.

1.2.3. SSL và Cloudflare

SSL + http = https. Đấy là công thức đơn giản nhất. Để một trang web khi truy cập thì bắt đầu bằng https:// thay vì http:// thì chúng ta phải làm gì, phải có SSL.

Trước đây, mình sử dụng Let’s Encrypt (Let’s Encrypt là tổ chức phát hành chứng chỉ phi lợi nhuận do Nhóm nghiên cứu bảo mật Internet điều hành, cung cấp miễn phí chứng chỉ X.509 cho mã hóa Bảo mật tầng truyền tải. – Wikipedia), đối với việc dùng Let’s Encrypt thì sẽ phải gia hạn sau 90 ngày. Dù nó miễn phí, và có nhiều scripts giúp tự động hóa quá trình này. Mọi người nên tham khảo thêm bài viết này https://kipalog.com/posts/Tao-chung-chi-SSL-mien-phi-voi-Let-s-Encrypt

Mục đích của mình là khi chạy dịch vụ mozilla-send thì nó sẽ có đường dẫn có https:// cho tăng tính bảo mật cũng như nhìn dễ chịu hơn là http. Nếu nó miễn phí, tại sao chúng ta lại không làm. Và tất nhiên nó phải hợp pháp.

Tuy nhiên sau này mình tập tành dùng Cloudflare thì mình phát hiện nó có cấp chứng chỉ SSL cho mình, miễn phí, tự động gia hạn hàng năm. Và tất nhiên thêm chức năng DDNS giúp mình ẩn địa chỉ IP thực của server mình khi gắn nó với tên miền. Nói chung là Cloudflare có khá nhiều thứ hay ho. Một bài viết này, và mình không đủ để nói về nó. Nên các bạn có thể tham khảo thêm nguồn từ bên ngoài: https://wiki.matbao.net/kb/cloudflare-la-gi/

1.2.4. Cấu hình và sử dụng một dịch vụ VPS

VPS là một server trên internet. Theo cách hiểu của mình là vậy, chứ thực ra có nhiều cách hiểu khác nhau. Cụ thể hơn tham khảo ở đây. https://wiki.matbao.net/vps-la-gi-tat-ca-cac-dieu-ve-vps-can-phai-biet/

Cá nhân mình lúc mới tập tành làm web thì dùng Laravel và share hosting như sau thấy nhiều bất cập đã chuyển qua VPS. Và mình dùng Vultr. Nếu ai có ý định dùng thử thì có thể tốt bụng đăng ký bằng link để mình kiếm một ít chi phí duy trì server. https://www.vultr.com/?ref=8602151-6G Biết rằng việc này sẽ không ảnh hưởng gì đến bạn cả.

Vultr có server ở khá nhiều nước như Nhật, Sing, Mỹ, Úc. Gói rẻ nhất là 5$/1 tháng nhưng nếu ai thích thử xong xóa thì nó tính theo giờ. Mình thấy khá ổn và mình nghĩ ai hay nghịch nên đăng ký để sau này thuận tiện triển khai nhiều thứ.

Thông thường mình sẽ chọn Ubuntu hoặc CentOS là hệ điều hành cho VPS và remote bằng SSH.

II. Thực hiện

2.1. Triển khai tại local

2.1.1. Môi trường

Thử nghiệm trên hệ điều hành Ubuntu, đã cài docker và docker-compose. Nếu ai chưa cài thì thực hiện theo hướng dẫn sau, còn nếu ai chưa cài hệ điều hành Ubuntu thì tham khảo bài viết trước của mình.

Trước hết máy tính của bạn phải kết nối Internet.

  1. Gỡ bỏ docker đã cài trên máy (nếu có) (nguồn: https://docs.docker.com/engine/install/ubuntu/)
sudo apt-get remove docker docker-engine docker.io containerd runc

2. Cập nhật và cài các package cần thiết

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

3. Add Docker’s official GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. Thêm repo

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. Cài đặt Docker Engine

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

6. Cấu hình chạy Docker không dùng sudo (nguồn: https://docs.docker.com/engine/install/linux-postinstall/)

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

7. Thử nghiệm:

docker run hello-world

8. Cấu hình để docker khởi động tự động khi mở máy

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

9. Cài đặt docker-compose (nguồn: https://docs.docker.com/compose/install/)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

2.1.2. Thực hiện:

Nếu ai chưa có cái git thì dùng lệnh sau để cài

sudo apt-get install -y git

1. Tải source code

git clone https://github.com/mozilla/send

2. Di chuyển vào thư mục source code

cd send

3. Chạy dịch vụ bằng docker-compose

docker-compose up -d

Quá trình này sẽ hơi lâu một tý vào lần đầu, do phải tải docker image có sẵn và build một docker image từ code mới tải về, rồi mới chạy được dịch vụ mozilla-send.

4. Sau khi quá trình trên kết thúc, thì dùng lệnh sau để kiểm tra

docker ps

Như này là ok.

5. Thử truy cập và upload file.

Truy cập vào http://localhost:1443/

Trang web đã ok, thử upload file.

Đã ổn khi triển khai ở local.

6. Chúng ta có thể dùng ngrok để có thể truy cập từ internet (tùy chọn)

ngrok là một ứng dụng tạo ra một đường hầm từ máy bạn (desktop, localhost) đi qua hệ thống Firewall/Nat, giúp từ internet có thể truy cập vào máy trạm.” – Nguồn tại đây.

Cài đặt ngrok

sudo apt update
sudo apt install snapd
sudo snap install ngrok

Chaỵ lệnh

ngrok http 1443

Truy cập vào link trên, và thử upload file.

(Tạm hết phần 1, phần 2 sẽ hướng dẫn triển khai lên Internet)

Related Post

One Reply to “Hướng dẫn triển khai mozilla-send từ source code (Phần 1): Tổng quan về công nghệ và triển khai ở local”

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *