Chúng tôi nâng cao phiên bản Webogram của mình bằng proxy thông qua nginx

Này Habr!

Gần đây, tôi thấy mình rơi vào tình huống cần phải làm việc trong mạng công ty với khả năng truy cập Internet không đầy đủ và như bạn có thể đoán từ tiêu đề, Telegram đã bị chặn trong đó. Tôi chắc chắn rằng tình huống này quen thuộc với nhiều người.

Tôi có thể làm việc mà không cần đến tin nhắn tức thời, nhưng tôi cần Telegram cho công việc. Không thể cài đặt máy khách trên máy làm việc cũng như không thể sử dụng máy tính xách tay cá nhân. Một giải pháp khác có vẻ là sử dụng nó phiên bản web chính thức, nhưng như bạn có thể đoán, nó cũng không có sẵn. Tôi ngay lập tức gạch bỏ tùy chọn tìm kiếm một tấm gương không chính thức (tôi hy vọng vì những lý do rõ ràng).

May mắn thay, Webogram là một dự án nguồn mở có mã nguồn sẵn có ở github tác giả của nó (Cảm ơn anh ấy rất nhiều!)
Việc cài đặt và khởi chạy không khó, tuy nhiên, trong điều kiện hoạt động trong mạng có quyền truy cập vào máy chủ Telegram bị chặn, bạn sẽ dễ thất vọng hơn là thành công, vì phiên bản web gửi yêu cầu đến máy chủ Telegram từ máy của người dùng.

May mắn thay, đây là cách khắc phục khá đơn giản (nhưng không rõ ràng lắm). Tôi muốn cảnh báo bạn rằng tôi không phải là tác giả của giải pháp này. Tôi đã tìm được nó trong chi nhánh, trong đó thảo luận về một vấn đề tương tự như của tôi. Giải pháp được đề xuất bởi người dùng github tecknojock, nó đã giúp tôi rất nhiều, tuy nhiên, tôi chắc chắn rằng nó có thể giúp được người khác, vì vậy tôi quyết định viết hướng dẫn này.

Bên dưới phần cắt, bạn sẽ tìm thấy quá trình thiết lập từng bước của máy nhân bản Webogram và thiết lập ủy quyền các yêu cầu của nó tới máy chủ Telegram bằng nginx.

Ví dụ: tôi đã chọn Ubuntu Server 18.04.3 mới được cài đặt và cập nhật.

Lưu ý: Hướng dẫn này sẽ không bao gồm hướng dẫn thiết lập miền trong nginx. Bạn cần phải tự mình làm điều này. Hướng dẫn giả định rằng bạn đã định cấu hình một miền bằng ssl và chính máy chủ mà bạn định định cấu hình trên đó có quyền truy cập vào máy chủ Telegram (theo bất kỳ cách nào bạn muốn)

Giả sử ip của máy chủ này là 10.23.0.3 và tên miền là mywebogram.localhost

Dựa trên những quy ước này, tôi sẽ đưa ra ví dụ về cấu hình. Đừng quên thay đổi các giá trị của riêng bạn.

Vì vậy, chúng ta hãy bắt đầu:

Để chạy Webogram, chúng ta cần nodejs. Theo mặc định, nếu chúng tôi cài đặt nó từ kho Ubuntu, chúng tôi sẽ nhận được nodejs phiên bản 8.x. Chúng tôi cần 12.x:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

Chúng tôi chọn nơi đặt Webogram của chúng tôi.

Ví dụ: hãy đặt nó vào thư mục gốc của thư mục chính. Để thực hiện việc này, hãy sao chép kho lưu trữ chính thức vào máy chủ của chúng tôi:

cd ~ && git clone https://github.com/zhukov/webogram.git

Bước tiếp theo là cài đặt tất cả các phụ thuộc cần thiết để chạy ứng dụng:

cd webogram && npm install

Hãy thử chạy thử. Chạy lệnh:

npm start

Sau đó, chúng tôi thử mở nó trên trình duyệt

 http://10.23.0.3:8000/app/index.html

Nếu cho đến thời điểm này bạn đã thực hiện mọi thứ một cách chính xác, trang ủy quyền Webogram sẽ mở ra.

Bây giờ chúng ta cần cấu hình ứng dụng để chạy như một dịch vụ. Để làm điều này, hãy tạo một tập tin

sudo touch /lib/systemd/system/webogram.service

mở nó trong bất kỳ trình soạn thảo nào và tạo cho nó giao diện như sau (nhập đường dẫn của bạn đến WorkDirectory)

[Unit]
Description=Webogram mirror
[Service]
WorkingDirectory=/home/tg/webogram
ExecStart=/usr/bin/npm start
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Sau đó chúng ta chạy các lệnh sau:

Áp dụng các thay đổi

sudo systemctl daemon-reload

Kích hoạt tính năng tự động chạy:

sudo systemctl enable webogram.service

Hãy bắt đầu dịch vụ:

sudo systemctl start webogram.service

Sau khi hoàn thành các bước, Webogram sẽ tiếp tục có sẵn trên cổng 8000.

Vì chúng tôi sẽ thiết lập quyền truy cập vào Webogram của mình thông qua nginx, chúng tôi sẽ đóng cổng 8000 đối với các yêu cầu từ bên ngoài.

Chúng tôi sử dụng tiện ích udf cho việc này (hoặc bất kỳ phương pháp nào thuận tiện cho bạn):

sudo ufw deny 8000

Trong trường hợp bạn vẫn quyết định sử dụng udf, nhưng nó bị tắt trên máy chủ, hãy thêm nhiều quy tắc hơn (để mọi thứ không bị hỏng) và bật udf:

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

Tiếp theo, hãy bắt đầu thay đổi cấu hình nginx.

Như tôi đã cảnh báo ở trên, giả định rằng miền có ssl đã được định cấu hình trên máy chủ của bạn. Tôi sẽ chỉ thu hút sự chú ý của bạn đến những gì cần được thêm vào tệp cấu hình miền để nó hoạt động chính xác:


server {
...
  location ^~ /pluto/apiw1/ {
    proxy_pass https://pluto.web.telegram.org/apiw1/;
  }
  location ^~ /venus/apiw1/ {
    proxy_pass https://venus.web.telegram.org/apiw1/;
  }
  location ^~ /aurora/apiw1/ {
    proxy_pass https://aurora.web.telegram.org/apiw1/;
  }
  location ^~ /vesta/apiw1/ {
    proxy_pass https://vesta.web.telegram.org/apiw1/;
  }
  location ^~ /flora/apiw1/ {
    proxy_pass https://flora.web.telegram.org/apiw1/;
  }
  location ^~ /pluto-1/apiw1/ {
    proxy_pass https://pluto-1.web.telegram.org/apiw1/;
  }
  location ^~ /venus-1/apiw1/ {
    proxy_pass https://venus-1.web.telegram.org/apiw1/;
  }
  location ^~ /aurora-1/apiw1/ {
    proxy_pass https://aurora-1.web.telegram.org/apiw1/;
  }
  location ^~ /vesta-1/apiw1/ {
    proxy_pass https://vesta-1.web.telegram.org/apiw1/;
  }
  location ^~ /flora-1/apiw1/ {
    proxy_pass https://flora-1.web.telegram.org/apiw1/;
  }
  location ^~ /DC1/ {
    proxy_pass http://149.154.175.10:80/;
  }
  location ^~ /DC2/ {
    proxy_pass http://149.154.167.40:80/;
  }
  location ^~ /DC3/ {
    proxy_pass http://149.154.175.117:80/;
  }
  location ^~ /DC4/ {
    proxy_pass http://149.154.175.50:80/;
  }
  location ^~ /DC5/ {
    proxy_pass http://149.154.167.51:80/;
  }
  location ^~ /DC6/ {
    proxy_pass http://149.154.175.100:80/;
  }
  location ^~ /DC7/ {
    proxy_pass http://149.154.167.91:80/;
  }
  location ^~ /DC8/ {
    proxy_pass http://149.154.171.5:80/;
  }
 location / {
    auth_basic "tg";
    auth_basic_user_file /etc/nginx/passwd.htpasswd;
    proxy_pass http://localhost:8000/;
    proxy_read_timeout 90s;
    proxy_connect_timeout 90s;
    proxy_send_timeout 90s;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Những gì chúng tôi thêm vào cấu hình nginx:

  • Chúng tôi thay đổi vị trí gốc, vị trí này sẽ ủy quyền các yêu cầu tới cổng 8000, trên đó Webogram phản hồi
  • Chúng tôi đóng vị trí gốc bằng cách sử dụng basic-auth. Đây là một bước hoàn toàn mang tính biểu tượng để đóng ứng dụng của chúng tôi khỏi những con mắt tò mò và bot. (Và cũng để tránh các vấn đề về chặn)
  • Một loạt vị trí có proxy_path trên máy chủ Telegram chính xác là điểm cuối của chúng tôi, qua đó chúng tôi sẽ ủy quyền các yêu cầu của mình

Ngoài ra, hãy tạo một tập tin /etc/nginx/passwd.htpasswd;để nginx có thứ gì đó để kiểm tra mật khẩu người dùng.

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg

Chúng tôi nâng cao phiên bản Webogram của mình bằng proxy thông qua nginx

Khởi động lại nginx:

sudo systemctl restart nginx

Hiện nay Webogram sẽ chỉ có tại mywebogram.localhost/app/index.html sau khi thông tin đăng nhập và mật khẩu mà bạn đã xác định khi tạo lệnh htpasswd được nhập.

Chỉ còn lại một chút: chúng tôi sẽ thực hiện những thay đổi nhỏ đối với chính dự án.

Mở tệp trong trình chỉnh sửa ~/webogram/app/js/lib/mtproto.js

Và đưa sự khởi đầu của nó về dạng sau:

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <[email protected]>
 * https://github.com/zhukov/webogram/blob/master/LICENSE
 */

angular.module('izhukov.mtproto', ['izhukov.utils'])

  .factory('MtpDcConfigurator', function () {
    var sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora']

    var dcOptions = Config.Modes.test
      ? [
        {id: 1, host: 'mywebogram.localhost/DC1',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC2',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC3', port: 80}
      ]
      : [
        {id: 1, host: 'mywebogram.localhost/DC4',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC5',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC6', port: 80},
        {id: 4, host: 'mywebogram.localhost/DC7',  port: 80},
        {id: 5, host: 'mywebogram.localhost/DC8',   port: 80}
      ]

    var chosenServers = {}

    function chooseServer (dcID, upload) {
      if (chosenServers[dcID] === undefined) {
        var chosenServer = false,
          i, dcOption

        if (Config.Modes.ssl || !Config.Modes.http) {
          var subdomain = sslSubdomains[dcID - 1] + (upload ? '-1' : '')
          var path = Config.Modes.test ? 'apiw_test1' : '/apiw1/'
          chosenServer = 'https://mywebogram.localhost/' + subdomain + path
          return chosenServer
        }
       for (i = 0; i < dcOptions.length; i++) {
          dcOption = dcOptions[i]
          if (dcOption.id == dcID) {
            chosenServer = 'http://' + dcOption.host + '/apiw1'
            break
          }
        }
        chosenServers[dcID] = chosenServer
      }
...
 

Sau này, bạn cần làm mới trang ứng dụng trong trình duyệt.

Mở bảng điều khiển trình duyệt của bạn và xem các yêu cầu mạng của ứng dụng. Nếu mọi thứ đều hoạt động và các yêu cầu XHR được gửi đến máy chủ của bạn thì mọi thứ đều được thực hiện chính xác và Webogram hiện được ủy quyền qua nginx.

Chúng tôi nâng cao phiên bản Webogram của mình bằng proxy thông qua nginx

Tôi hy vọng rằng hướng dẫn này sẽ hữu ích cho người khác ngoài tôi.

Rất cám ơn mọi người đã đọc đến cuối.

Nếu ai gặp khó khăn gì hoặc tôi đưa ra bất kỳ thông tin nào không chính xác, tôi sẽ sẵn lòng trả lời và cố gắng giúp đỡ bạn trong phần bình luận hoặc PM.

Nguồn: www.habr.com

Thêm một lời nhận xét