ืื ื• ืžืขืœื™ื ืืช ืžื•ืคืข ื”-Webogram ืฉืœื ื• ืขื ืฉืจืช proxy ื“ืจืš nginx

ื”ื™ื™ ื”ื‘ืจ!

ืœืื—ืจื•ื ื” ื ืงืœืขืชื™ ืœืžืฆื‘ ื‘ื• ื”ื™ื” ืฆื•ืจืš ืœืขื‘ื•ื“ ื‘ืชื•ืš ืจืฉืช ืืจื’ื•ื ื™ืช ืขื ื’ื™ืฉื” ืœื ืžืœืื” ืœืื™ื ื˜ืจื ื˜ ื•ื›ืคื™ ืฉื ื™ืชืŸ ืœื ื—ืฉ ืžื”ื›ื•ืชืจืช, ื˜ืœื’ืจื ื ื—ืกืžื” ื‘ื”. ืื ื™ ื‘ื˜ื•ื— ืฉื”ืžืฆื‘ ื”ื–ื” ืžื•ื›ืจ ืœืจื‘ื™ื.

ืื ื™ ื™ื›ื•ืœ ืœื”ืกืชื“ืจ ื‘ืœื™ ืฉืœื™ื—ื™ื ืžื™ื™ื“ื™ื™ื, ืื‘ืœ ื–ื” ื”ื™ื” ื˜ืœื’ืจื ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœืขื‘ื•ื“ื”. ืœื ื ื™ืชืŸ ื”ื™ื” ืœื”ืชืงื™ืŸ ืืช ื”ืœืงื•ื— ืขืœ ืžื›ื•ื ืช ืขื‘ื•ื“ื”, ื•ืœื ื ื™ืชืŸ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืžื—ืฉื‘ ื ื™ื™ื“ ืื™ืฉื™. ื ืจืื” ืฉืคืชืจื•ืŸ ืื—ืจ ื”ื•ื ืœื”ืฉืชืžืฉ ื‘ื• ื’ืจืกืช ืื™ื ื˜ืจื ื˜ ืจืฉืžื™ืช, ืื‘ืœ ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœื ื—ืฉ, ื–ื” ื’ื ืœื ื”ื™ื” ื–ืžื™ืŸ. ืื ื™ ื—ื•ืฆื” ืžื™ื“ ืืช ื”ืื•ืคืฆื™ื” ืฉืœ ื—ื™ืคื•ืฉ ืžืจืื” ืœื ืจืฉืžื™ืช (ืื ื™ ืžืงื•ื•ื” ืžืกื™ื‘ื•ืช ืžื•ื‘ื ื•ืช).

ืœืžืจื‘ื” ื”ืžื–ืœ, Webogram ื”ื•ื ืคืจื•ื™ืงื˜ ืงื•ื“ ืคืชื•ื— ืฉืงื•ื“ ื”ืžืงื•ืจ ืฉืœื• ื–ืžื™ืŸ ื‘ GitHub ืžื—ื‘ืจื• (ืขืœ ื›ืš ืชื•ื“ื” ืจื‘ื” ืœื•!)
ื”ื”ืชืงื ื” ื•ื”ื”ืฉืงื” ืขืฆืžื” ืื™ื ืŸ ืงืฉื•ืช, ืขื ื–ืืช, ื‘ืชื ืื™ ืคืขื•ืœื” ื‘ืจืฉืช ืขื ื’ื™ืฉื” ื—ืกื•ืžื” ืœืฉืจืชื™ ื˜ืœื’ืจื, ืกื‘ื™ืจ ื™ื•ืชืจ ืฉืชืชืื›ื–ื‘ ืžืืฉืจ ืชืฆืœื™ื—, ืžื›ื™ื•ื•ืŸ ืฉื’ืจืกืช ื”ืื™ื ื˜ืจื ื˜ ืฉื•ืœื—ืช ื‘ืงืฉื•ืช ืœืฉืจืชื™ ื˜ืœื’ืจื ืžื”ืžื—ืฉื‘ ืฉืœ ื”ืžืฉืชืžืฉ.

ืœืžืจื‘ื” ื”ืžื–ืœ, ื–ื”ื• ืชื™ืงื•ืŸ ืคืฉื•ื˜ ืœืžื“ื™ (ืืš ืœื ืžืื•ื“ ื‘ืจื•ืจ). ืื ื™ ืจื•ืฆื” ืœื”ื–ื”ื™ืจ ืื•ืชืš ืฉืื ื™ ืœื ื”ื›ื•ืชื‘ ืฉืœ ื”ืคืชืจื•ืŸ ื”ื–ื”. ื”ืฆืœื—ืชื™ ืœืžืฆื•ื ืืช ื–ื” ืกื ื™ืฃ, ืฉื“ื ื” ื‘ื‘ืขื™ื” ื“ื•ืžื” ืœืฉืœื™. ืคืชืจื•ืŸ ืฉื”ื•ืฆืข ืขืœ ื™ื“ื™ ืžืฉืชืžืฉ github tecknojock, ื–ื” ืขื–ืจ ืœื™ ืžืื•ื“, ืขื ื–ืืช, ืื ื™ ื‘ื˜ื•ื— ืฉื–ื” ื™ื›ื•ืœ ืœืขื–ื•ืจ ืœืžื™ืฉื”ื• ืื—ืจ, ืื– ื”ื—ืœื˜ืชื™ ืœื›ืชื•ื‘ ืืช ื”ืžื“ืจื™ืš ื”ื–ื”.

ืžืชื—ืช ืœื’ื–ืจื” ืชืžืฆืื• ื”ื’ื“ืจื” ืฉืœื‘ ืื—ืจ ืฉืœื‘ ืฉืœ ืžืจืื” ื”-Webogram ืฉืœื›ื ื•ื”ื’ื“ืจื” ืฉืœ ื”ืขื‘ืจืช ื‘ืงืฉื•ืช ืคืจื•ืงืกื™ ืœืฉืจืชื™ ื˜ืœื’ืจื ื‘ืืžืฆืขื•ืช nginx.

ื›ื“ื•ื’ืžื”, ื‘ื—ืจืชื™ ื‘ืฉืจืช ืื•ื‘ื•ื ื˜ื• 18.04.3 ืฉื”ื•ืชืงืŸ ื•ืžืขื•ื“ื›ืŸ ืœืื—ืจื•ื ื”.

ะ’ะฝะธะผะฐะฝะธะต: ืžื“ืจื™ืš ื–ื” ืœื ื™ื›ืœื•ืœ ื”ื•ืจืื•ืช ืขืœ ื”ื’ื“ืจืช ื“ื•ืžื™ื™ืŸ ื‘-nginx. ืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื–ืืช ื‘ืขืฆืžืš. ื”ืžื“ืจื™ืš ืžื ื™ื— ืฉื›ื‘ืจ ื”ื’ื“ืจืช ื“ื•ืžื™ื™ืŸ ืขื ssl, ื•ืฉืœืฉืจืช ืขืฆืžื• ื‘ื• ืืชื” ืžืชื›ื ืŸ ืœื”ื’ื“ื™ืจ ืื•ืชื• ื™ืฉ ื’ื™ืฉื” ืœืฉืจืชื™ ื”ื˜ืœื’ืจื (ื‘ื›ืœ ื“ืจืš ืฉืชืจืฆื”)

ื ื ื™ื— ืฉื”-IP ืฉืœ ืฉืจืช ื–ื” ื”ื•ื 10.23.0.3, ื•ืฉื ื”ื“ื•ืžื™ื™ืŸ ื”ื•ื mywebogram.localhost

ื‘ื”ืชื‘ืกืก ืขืœ ืžื•ืกื›ืžื•ืช ืืœื•, ืืชืŸ ื“ื•ื’ืžืื•ืช ืœืชืฆื•ืจื•ืช. ืืœ ืชืฉื›ื— ืœืฉื ื•ืช ืืช ื”ืขืจื›ื™ื ืœืฉืœืš.

ืื– ื ืชื—ื™ืœ:

ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช Webogram, ืื ื—ื ื• ืฆืจื™ื›ื™ื nodejs. ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืื ื ืชืงื™ืŸ ืื•ืชื• ืžืžืื’ืจื™ ืื•ื‘ื•ื ื˜ื•, ื ืงื‘ืœ ืืช nodejs ื’ืจืกื” 8.x. ืื ื—ื ื• ืฆืจื™ื›ื™ื 12.x:

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

ืื ื• ื‘ื•ื—ืจื™ื ืืช ื”ืžืงื•ื ื‘ื• ื™ืชื‘ืกืก ื”ื•ื•ื‘ื•ื’ืจืžื” ืฉืœื ื•.

ืœื“ื•ื’ืžื”, ื‘ื•ืื• ื ืžืงื ืื•ืชื• ื‘ืฉื•ืจืฉ ืกืคืจื™ื™ืช ื”ื‘ื™ืช. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืฉื™ื‘ื˜ื• ืืช ื”ืžืื’ืจ ื”ืจืฉืžื™ ืœืฉืจืช ืฉืœื ื•:

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

ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ื”ืชืงื ืช ื›ืœ ื”ืชืœื•ืช ื”ื ื“ืจืฉืช ืœื”ืคืขืœืช ื”ืืคืœื™ืงืฆื™ื”:

cd webogram && npm install

ื‘ื•ื ื ื ืกื” ืจื™ืฆืช ืžื‘ื—ืŸ. ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื”:

npm start

ืœืื—ืจ ืžื›ืŸ, ืื ื• ืžื ืกื™ื ืœืคืชื•ื— ืื•ืชื• ื‘ื“ืคื“ืคืŸ

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

ืื ืขื“ ืœื ืงื•ื“ื” ื–ื• ืขืฉื™ืช ื”ื›ืœ ื ื›ื•ืŸ, ื™ื™ืคืชื— ื“ืฃ ื”ื”ืจืฉืื•ืช ืฉืœ ื”ื•ื•ื‘ื’ืจื.

ื›ืขืช ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ ืืช ื”ืืคืœื™ืงืฆื™ื” ืœืคืขื•ืœ ื›ืฉื™ืจื•ืช. ืœืฉื ื›ืš, ื‘ื•ืื• ื ื™ืฆื•ืจ ืงื•ื‘ืฅ

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

ืคืชื— ืื•ืชื• ื‘ื›ืœ ืขื•ืจืš ื•ืชืŸ ืœื• ืืช ื”ืžืจืื” ื”ื‘ื (ื”ื–ืŸ ืืช ื”ื ืชื™ื‘ ืฉืœืš ืœ-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

ืœืื—ืจ ืžื›ืŸ ืื ื• ืžืคืขื™ืœื™ื ืืช ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช:

ื™ื™ืฉื•ื ื”ืฉื™ื ื•ื™ื™ื

sudo systemctl daemon-reload

ืืคืฉืจ ื”ืคืขืœื” ืื•ื˜ื•ืžื˜ื™ืช:

sudo systemctl enable webogram.service

ื‘ื•ืื• ื ืชื—ื™ืœ ืืช ื”ืฉื™ืจื•ืช:

sudo systemctl start webogram.service

ืœืื—ืจ ื”ืฉืœืžืช ื”ืฉืœื‘ื™ื, Webogram ื™ืžืฉื™ืš ืœื”ื™ื•ืช ื–ืžื™ืŸ ื‘ื™ืฆื™ืื” 8000.

ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžื’ื“ื™ืจื™ื ื’ื™ืฉื” ืœ-Webogram ืฉืœื ื• ื“ืจืš nginx, ื ืกื’ื•ืจ ืืช ื™ืฆื™ืื” 8000 ืœื‘ืงืฉื•ืช ืžื‘ื—ื•ืฅ.

ืื ื• ืžืฉืชืžืฉื™ื ื‘ื›ืœื™ ื”ืฉื™ืจื•ืช udf ืขื‘ื•ืจ ื–ื” (ืื• ื›ืœ ืฉื™ื˜ื” ื”ื ื•ื—ื” ืœืš):

sudo ufw deny 8000

ืœืžืงืจื” ืฉืขื“ื™ื™ืŸ ืชื—ืœื™ื˜ ืœื”ืฉืชืžืฉ ื‘-udf, ืื‘ืœ ื”ื•ื ืžื•ืฉื‘ืช ื‘ืฉืจืช, ื”ื•ืกืฃ ื—ื•ืงื™ื ื ื•ืกืคื™ื (ื›ื“ื™ ืฉื”ื›ืœ ืœื ื™ืชืคืจืง) ื•ื”ืคืขืœ ืืช udf:

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

ืœืื—ืจ ืžื›ืŸ, ื‘ื•ืื• ื ืชื—ื™ืœ ืœืฉื ื•ืช ืืช ืชืฆื•ืจืช nginx.

ื›ืคื™ ืฉื”ื–ื”ืจืชื™ ืœืžืขืœื”, ื”ื”ื ื—ื” ื”ื™ื ืฉื“ื•ืžื™ื™ืŸ ืขื ssl ื›ื‘ืจ ืžื•ื’ื“ืจ ื‘ืฉืจืช ืฉืœืš. ืื ื™ ืจืง ืืคื ื” ืืช ืชืฉื•ืžืช ืœื‘ืš ืœืžื” ืฉืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืœืงื•ื‘ืฅ ืชืฆื•ืจืช ื”ื“ื•ืžื™ื™ืŸ ื›ื“ื™ ืฉื”ื•ื ื™ืคืขืœ ื›ื”ืœื›ื”:


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;
  }
}

ืžื” ืื ื—ื ื• ืžื•ืกื™ืคื™ื ืœืชืฆื•ืจืช nginx:

  • ืื ื• ืžืฉื ื™ื ืืช ืžื™ืงื•ื ื”ืฉื•ืจืฉ, ืืฉืจ ื™ื‘ืฆืข ื‘ืงืฉื•ืช ืคืจื•ืงืกื™ ืœื™ืฆื™ืื” 8000, ืขืœื™ื” ืžื’ื™ื‘ ื•ื•ื‘ื•ื’ืจืžื”
  • ืื ื• ืกื•ื’ืจื™ื ืืช ืžื™ืงื•ื ื”ืฉื•ืจืฉ ื‘ืืžืฆืขื•ืช basic-auth. ื–ื”ื• ืฆืขื“ ืกืžืœื™ ื’ืจื™ื“ื ืœืกื’ื™ืจืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืžืขื™ื ื™ื™ื ืกืงืจื ื™ื•ืช ื•ื‘ื•ื˜ื™ื. (ื•ื’ื ื›ื“ื™ ืœืžื ื•ืข ื‘ืขื™ื•ืช ื‘ื—ืกื™ืžื”)
  • ื—ื‘ื•ืจื” ืฉืœ ืžื™ืงื•ืžื™ื ืขื proxy_path ื‘ืฉืจืช ื”ื˜ืœื’ืจื ื”ื ื‘ื“ื™ื•ืง ื ืงื•ื“ื•ืช ื”ืงืฆื” ืฉืœื ื• ืฉื“ืจื›ืŸ ื ืขื‘ื™ืจ ืืช ื”ื‘ืงืฉื•ืช ืฉืœื ื•.

ื›ืžื• ื›ืŸ, ื‘ื•ืื• ื ื™ืฆื•ืจ ืงื•ื‘ืฅ /etc/nginx/passwd.htpasswd;ื›ืš ืฉืœ-nginx ื™ืฉ ืžืฉื”ื• ืœื‘ื“ื•ืง ืื™ืชื• ืกื™ืกืžืื•ืช ืžืฉืชืžืฉ.

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

ืื ื• ืžืขืœื™ื ืืช ืžื•ืคืข ื”-Webogram ืฉืœื ื• ืขื ืฉืจืช proxy ื“ืจืš nginx

ื”ืคืขืœ ืžื—ื“ืฉ ืืช nginx:

sudo systemctl restart nginx

ื›ืขืช Webogram ื™ื”ื™ื” ื–ืžื™ืŸ ืจืง ื‘ mywebogram.localhost/app/index.html ืœืื—ืจ ื”ื–ื ืช ื”ื›ื ื™ืกื” ื•ื”ืกื™ืกืžื” ืฉื”ื’ื“ืจืช ื‘ืขืช ื™ืฆื™ืจืช ื”ืคืงื•ื“ื” htpasswd.

ื ื•ืชืจ ืžืขื˜: ื ื‘ืฆืข ืฉื™ื ื•ื™ื™ื ืงื˜ื ื™ื ื‘ืคืจื•ื™ืงื˜ ืขืฆืžื•.

ืคืชื— ืืช ื”ืงื•ื‘ืฅ ื‘ืขื•ืจืš ~/webogram/app/js/lib/mtproto.js

ื•ื”ื‘ื™ืื• ืืช ืชื—ื™ืœืชื• ืœืฆื•ืจื” ื”ื‘ืื”:

/*!
 * 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
      }
...
 

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ืš ืœืจืขื ืŸ ืืช ื“ืฃ ื”ืืคืœื™ืงืฆื™ื” ื‘ื“ืคื“ืคืŸ.

ืคืชื— ืืช ืžืกื•ืฃ ื”ื“ืคื“ืคืŸ ืฉืœืš ื•ืขื™ื™ืŸ ื‘ื‘ืงืฉื•ืช ื”ืจืฉืช ืฉืœ ื”ื™ื™ืฉื•ื. ืื ื”ื›ืœ ืขื•ื‘ื“ ื•ื‘ืงืฉื•ืช XHR ืขื•ื‘ืจื•ืช ืœืฉืจืช ืฉืœืš, ืื– ื”ื›ืœ ื ืขืฉื” ื›ื”ืœื›ื”, ื•-Webogram ืžืงื‘ืœ ื›ืขืช ืคืจื•ืงืกื™ ื“ืจืš nginx.

ืื ื• ืžืขืœื™ื ืืช ืžื•ืคืข ื”-Webogram ืฉืœื ื• ืขื ืฉืจืช proxy ื“ืจืš nginx

ืื ื™ ืžืงื•ื•ื” ืฉื”ืžื“ืจื™ืš ื”ื–ื” ื™ื”ื™ื” ืฉื™ืžื•ืฉื™ ืœืžื™ืฉื”ื• ืื—ืจ ืžืœื‘ื“ื™.

ืชื•ื“ื” ืจื‘ื” ืœื›ืœ ืžื™ ืฉืงืจื ืขื“ ื”ืกื•ืฃ.

ืื ืœืžื™ืฉื”ื• ื™ืฉ ืงืฉื™ื™ื ืื• ืฉืขืฉื™ืชื™ ืื™ ื“ื™ื•ืงื™ื, ืืฉืžื— ืœืขื ื•ืช ื•ืœื ืกื•ืช ืœืขื–ื•ืจ ืœื›ื ื‘ืชื’ื•ื‘ื•ืช ืื• ื‘-PM.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”