Стартираме своя инстанс Webogram с проксириране чрез nginx

Здравей, Хабр!

Наскоро попаднах в ситуация, в която трябваше да работя в корпоративна мрежа с ограничен достъп до интернет и, както можете да се досетите от заглавието, Telegram беше блокиран. Сигурен съм, че много хора познават тази ситуация.

Мога да се справя и без месинджъри, но точно Telegram ми беше необходим за работа. Не беше възможно да инсталирам клиента на работния компютър, а използването на личен лаптоп също не беше опция. Едно от решенията е да използвам официалната уеб версия, но, както можете да се досетите, тя също беше недостъпна. Вариантът с търсене на неофициално огледало веднага го отхвърлям (надявам се по напълно очевидни причини).

За щастие, Webogram е проект с отворен код, чиито изходен код е достъпен на github неговия автор (за което му благодаря!)
Самото инсталиране и стартиране не е трудно, но в условията на експлоатация в мрежа с блокиран достъп до сървърите на Telegram, по-скоро ще се сблъскате с разочарование, отколкото с успех, тъй като уеб версията изпраща заявки към сървърите на Telegram от машината на потребителя.

За щастие, е доста лесно (но не много очевидно) да се поправи. Искам да предупредя, че не съм автор на това решение. Успях да го намеря в нишка, в която беше обсъждан проблем, подобен на моя. Решението, предложено от потребителя на github tecknojock, ми помогна много, но съм сигурен, че може да помогне и на други, затова реших да напиша този туториал.

Под кат ще намерите стъпка по стъпка настройка на вашето огледало на Webogram и настройка на проксирване на неговите заявки до сървърите на Telegram с помощта на nginx.

Като пример избрах току-що инсталиран и актуализиран Ubuntu Server 18.04.3.

Внимание: В рамките на този туториал не ще има инструкции за настройка на домейн в nginx. Това трябва да направите сами. Туториалът предполага, че вече имате настроен домейн с ssl, а също и че самият сървър, на който планирате настройката, има достъп до сървърите на Telegram (по какъвто и да е начин по ваш вкус)

Да предположим, че ip адресът на този сървър е 10.23.0.3, а домейна е mywebogram.localhost

Изхождайки от тези условия, ще давам примери за конфигурации. Не забравяйте да промените стойностите на вашите.

Така че, нека да започнем:

За да стартирате Webogram, необходим е nodejs. По подразбиране, ако го инсталирате от репозиториите на Ubuntu — ще получите 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

Избираме място, където ще се базира нашият Webogram.

За пример — ще го разположим в корена на домашната директория. За целта клонираме официалното репо на нашия сървър:

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

Следващата стъпка — да инсталираме всички зависимости, необходими за стартиране на приложението:

cd webogram && npm install

Нека опитаме да направим тестов старт. Изпълнете командата:

npm start

След което, опитайте да отворите в браузъра

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

Ако до този момент всичко сте направили правилно — ще се отвори страницата за авторизация на Webogram.

Сега е необходимо да конфигурираме старта на приложението като услуга. За целта ще създадем файл

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. Обърнете внимание, че е необходимо да добавите в конфигурационния файл на домейна за коректна работа:


сървър {
...
  местоположение ^~ /pluto/apiw1/ {
    proxy_pass https://pluto.web.telegram.org/apiw1/;
  }
  местоположение ^~ /venus/apiw1/ {
    proxy_pass https://venus.web.telegram.org/apiw1/;
  }
  местоположение ^~ /aurora/apiw1/ {
    proxy_pass https://aurora.web.telegram.org/apiw1/;
  }
  местоположение ^~ /vesta/apiw1/ {
    proxy_pass https://vesta.web.telegram.org/apiw1/;
  }
  местоположение ^~ /flora/apiw1/ {
    proxy_pass https://flora.web.telegram.org/apiw1/;
  }
  местоположение ^~ /pluto-1/apiw1/ {
    proxy_pass https://pluto-1.web.telegram.org/apiw1/;
  }
  местоположение ^~ /venus-1/apiw1/ {
    proxy_pass https://venus-1.web.telegram.org/apiw1/;
  }
  местоположение ^~ /aurora-1/apiw1/ {
    proxy_pass https://aurora-1.web.telegram.org/apiw1/;
  }
  местоположение ^~ /vesta-1/apiw1/ {
    proxy_pass https://vesta-1.web.telegram.org/apiw1/;
  }
  местоположение ^~ /flora-1/apiw1/ {
    proxy_pass https://flora-1.web.telegram.org/apiw1/;
  }
  местоположение ^~ /DC1/ {
    proxy_pass http://149.154.175.10:80/;
  }
  местоположение ^~ /DC2/ {
    proxy_pass http://149.154.167.40:80/;
  }
  местоположение ^~ /DC3/ {
    proxy_pass http://149.154.175.117:80/;
  }
  местоположение ^~ /DC4/ {
    proxy_pass http://149.154.175.50:80/;
  }
  местоположение ^~ /DC5/ {
    proxy_pass http://149.154.167.51:80/;
  }
  местоположение ^~ /DC6/ {
    proxy_pass http://149.154.175.100:80/;
  }
  местоположение ^~ /DC7/ {
    proxy_pass http://149.154.167.91:80/;
  }
  местоположение ^~ /DC8/ {
    proxy_pass http://149.154.171.5:80/;
  }
  местоположение / {
    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, на който отговаря Webogram.
  • Кореновото местоположение затваряме с помощта на basic-auth. Това е чисто символичен ход, за да защитим приложението си от нежелани погледи и ботове. (И също за да избегнем проблеми с блокировки.)
  • Много местоположения с proxy_path към сървърите на Telegram — това са нашите крайни точки, през които ще проксираме нашите заявки.

Също така, ще създадем файл /etc/nginx/passwd.htpasswd;, за да има nginx с какво да сравнява паролите на потребителите.

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

Стартираме своя инстанс Webogram с проксириране чрез 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 <igor.beatle@gmail.com>
 * 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 с проксириране чрез nginx

Надявам се, че този туториал ще бъде полезен и на някой освен на мен.

Благодаря на всички, които прочетоха до края.

Ако някой е имал трудности или съм допуснал неточности — с удоволствие ще отговоря и ще се постарая да помогна в коментарите или на лични съобщения.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster