Đây là phần 2 của bài viết về triển khai mã nguồn mozilla-send thành dịch vụ thực tế. Các bạn có thể theo dõi lại phần 1 của bài viết tại đây.
Ở phần 1, mình đã tóm tắt các công nghệ cần tìm hiểu và sử dụng trong việc triển khai này, cũng như triển khai ở môi trường local (trên máy tính của bạn và có thể truy cập từ local). Phần này mình sẽ đưa dịch vụ đó lên internet bằng cách thuê VPS, mua domain.
II. Thực hiện
2.2. Triển khai tại lên Internet
2.2.1. Triển khai server và cấu hình SSH
Khi triển khai một dịch vụ lên Internet sẽ có khá nhiều cách, có thể sử dụng Heroku, AWS,… Mình thì thường chon sử dụng VPS bởi vì các lý do sau:
- Dễ dàng quản lý bằng SSH
- Có thể thêm, bớt dịch vụ như một máy tính thông thường
- Chạy các OS thông dụng
- Chi phí hợp lý
- Có IP riêng
Vultr là dịch vụ VPS đầu tiên mình dùng và dùng mãi đến bây giờ. Tuy nhiên do đây là dịch vụ mang tính Quốc tế nên chỉ có máy chủ tại các nước như Nhật, Singapore, Hàn, Đức, Pháp, Anh, Mỹ, Canada, Úc, Hà Lan nên nếu định hướng của bạn là các truy cập tại Việt Nam thì nên chọn dịch vụ VPS có máy chủ tại Việt Nam. Đồng thời, bạn cần có thẻ Master Card, Visa hoặc Paypal, Alipay, Bitcoin để thanh toán.
Mình sẽ triển khai (deploy) một server mới. Người dùng sẽ được chọn nơi đặt server. Cụ thể ở đây mình chọn Singapore

Sau khi chọn vị trí địa lý của server thì mình tiến hành chọn hệ điều hành của server. Ở đây mình chọn Ubuntu 20.04 LTS 64bit

Tiếp theo mình chọn cấu hình của server, mặc định là sẽ là 1 CPU/2 Gb Ram, 2000 Gb băng thông, 55 Gb SSD và giá là 10$/tháng (0.015$/giờ). Tuy nhiên nhu cầu của mình không cần khỏe vậy nên chỉ chọn cấu hình cơ bản nhất và rẻ nhất (25Gb SSD, 1 CPU, 1Gb Ram, 1000Gb băng thông và giá là 5$/tháng (0.007$/giờ)

Cuối cùng là chọn Deploy, khi chọn deploy thì sẽ được chuyển về trang chủ. Chúng ta sẽ phải đợi một lúc tầm 5-10p để khởi tạo server.

Sau khi khởi tạo xong sẽ như này, bạn kích vào sẽ được chi tiết


Như vậy làm thế nào để truy cập được server này? Chúng ta sử dụng SSH. Câu lệnh cụ thể sẽ là:

Sẽ được yêu cầu mật khẩu để kết nối, mật khẩu được cung cấp ở phía trên. Thành công sẽ được như thế này.

Việc truy cập SSH và nhập mật khẩu như thế này khá là bất tiện, nên chúng ta có thể cấu hình và sử dụng public key theo bài hướng dẫn này.
Sau khi truy cập vào được server, bạn tiến hành cài đặt Git, Docker, Docker Compose như khi bạn cài đặt ở local theo như bài hướng dẫn trước và cũng có thể tham khảo video sau nếu bạn chưa tự tin với việc này. Video do mình quay thực tế trong lúc viết bài này luôn.
2.2.2. Đổi cổng dịch vụ của mozilla-send
Theo mặc định như lúc khởi chạy, mozilla-send sẽ hoạt động ở cổng 1443. Điều này gây ra khó khăn nếu muốn trỏ domain tến VPS này. Vì mặc định, khi truy cập vào các trang web http là cổng 80 và https là cổng 443.
Chúng ta thử thay đổi cổng mặc định về cổng 443 và trỏ IP này về domain trên Cloudflare được không. Mở file docker-compose.yml, sửa lại một tý
Sử dụng nano để mở file
nano docker-compose.yml
version: "3"
services:
web:
build: .
links:
- redis
ports:
- "443:1443"
# sửa lại đoạn này từ 1443
environment:
- REDIS_HOST=redis
redis:
image: redis:alpine
selenium-firefox:
image: b4handjr/selenium-firefox
ports:
- "${VNC_PORT:-5900}:5900"
shm_size: 2g
volumes:
- .:/code
Sau khi sửa xong nhấn Ctrl+X để lưu.
Sau khi đổi xong, chạy lại bằng lệnh docker-compose up -d
và truy cập vào Cloudflare trỏ domain về IP của server.

Sau khi lưu lại bảng ghi này, mình tiến hành truy cập thử vào tên miền: https://mozilla-send.techcave.vn thử được không.

Kết quả là không, thất bại. Nguyên nhân là lỗi ở SSL handshake. Vậy nguyên nhân do đâu.
Sau khi mình thay đổi chế độ “Mã hóa SSL/TLS” của Cloudflare, và cổng phục vụ của mozilla-send về cổng 80.

Thì kết quả được như sau:

Nguyên nhân do đâu thì các bạn có thể tìm hiểu về SSL/TLS cũng như các chế độ mã hóa SSL/TLS của Cloudflare. Rõ ràng như hình trên mình có thể thấy rõ đoạn “Recommended by Cloudflare“

Câu hỏi đặt ra lúc này là “Làm thế nào để có thể sử dụng được chế độ này?” Câu trả lời sẽ có trong phần sau.
2.2.3. NGINX và SSL/TLS, Cloudflare
Bước 1: Khởi tạo Client Certificates
- Ở tab SSL/TLS, chọn tab Client Certificates.

- Sau đó chọn Create Certificate, sẽ được như sau:

- Tiếp theo chọn Create để khởi tạo, được trang kết quả

TUYỆT ĐỐI KHÔNG NHẤN OK.
- Bạn tiến hành copy nội dung trên và lưu thành hai file fullchain.pem và privkey.pem tương ứng với Certificate và Private Key. Sau khi lưu 2 file này thì hãy nhấn OK.
Bước 2: Chỉnh sửa file docker-compose.yml
version: "3"
services:
web:
build: .
links:
- redis
ports:
- "1443:1443"
environment:
- REDIS_HOST=redis
redis:
image: redis:alpine
selenium-firefox:
image: b4handjr/selenium-firefox
ports:
- "${VNC_PORT:-5900}:5900"
shm_size: 2g
volumes:
- .:/code
nginx:
image: nginx:latest
container_name: webserver
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/ssl:/ssl/
- ./nginx/conf.d:/etc/nginx/conf.d/
Như các bạn đã thấy, mình chuyển port của dịch vụ về 1443 và thêm block nginx như trên.
Bước 3: Cấu hình các file liên quan đến nginx
- Khởi tạo thư mục nginx với 2 thư mục con là ssl và conf.d. Thư mục nginx này nằm trong thư mục gốc của dịch vụ mozilla-send.
- Tạo thư mục mozilla-send.techcave.vn trong thư mục ssl.
- Trong thư mục mozilla-send.techcave.vn lưu hai file fullchain.pem và privkey.pem đã lưu ở bước 1.
- Trong thư mục nginx/conf.d tạo file có tên mozilla-send.techcave.vn.conf, tên thì bạn đặt tùy thích được. Nhưng nhớ bắt buộc phải có đuôi là .conf với nội dung file như sau
server {
listen 80;
server_name mozilla-send.techcave.vn
listen [::]:80;
location / {
proxy_pass http://web:1443;
}
}
server {
listen 443 ssl;
# access_log off;
access_log /var/log/nginx/access.log;
# error_log off;
error_log /var/log/nginx/error.log;
server_name mozilla-send.techcave.vn;
# SSL
ssl_certificate /ssl/mozilla-send.techcave.vn/fullchain.pem;
ssl_certificate_key /ssl/mozilla-send.techcave.vn/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
# Improve HTTPS performance with session resumption
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://web:1443;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Bước 4: Đổi chế độ mã hóa SSL/TLS của Cloudlfare ứng với tên miền về Full.
Bước 5: Khởi chạy lại dịch vụ bằng cách như ở trên
Nếu bạn quên có thể nhắc lại, truy cập vào thư mục, chạy lệnh
docker-compose up -d
Bước 6: Truy cập vào trang web và kiểm tra lại.
Và kết quả đã như ý.
III. Tạm kết
Do bài viết đã khá dài nên mình không giải thích cụ thể file cấu hình nginx, mình sẽ thực hiện điều đó trong kỳ sau.
Sau khi thực hiện được thành công theo hướng dẫn này. Mình nghĩ các bạn đã có thể triển khai những dịch vụ web tương tự và dùng nginx làm dịch vụ reverse proxy.