Hướng dẫn triển khai mozilla-send từ source code (Phần 2): Triển khai trên môi trường Internet

Đâ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à sslconf.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.

Related Post

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 *