Hej Habra!
Ostatnio znalazłem się w sytuacji, w której konieczna była praca w sieci firmowej z niepełnym dostępem do Internetu i jak można się domyślić z tytułu, Telegram został w niej zablokowany. Jestem pewien, że ta sytuacja jest znana wielu.
Obejdę się bez komunikatorów internetowych, ale do pracy potrzebowałem Telegramu. Nie było możliwości zainstalowania klienta na komputerze służbowym, nie było też możliwości korzystania z laptopa osobistego. Innym rozwiązaniem wydaje się być jego wykorzystanie
Na szczęście Webogram jest projektem typu open source, którego kod źródłowy jest dostępny w
Sama instalacja i uruchomienie nie jest trudne, jednak w warunkach pracy w sieci z zablokowanym dostępem do serwerów Telegramu bardziej prawdopodobne jest rozczarowanie niż sukces, ponieważ wersja internetowa wysyła żądania do serwerów Telegramu z komputera użytkownika.
Na szczęście jest to dość proste (ale niezbyt oczywiste) rozwiązanie. Pragnę uprzedzić, że nie jestem autorem tego rozwiązania. Udało mi się to znaleźć
Poniżej znajdziesz szczegółową konfigurację swojego serwera lustrzanego Webogram i konfigurację proxy jego żądań do serwerów Telegramu za pomocą nginx.
Jako przykład wybrałem świeżo zainstalowany i zaktualizowany Ubuntu Server 18.04.3.
Uwaga: Ten samouczek nie będzie zawierał instrukcji dotyczących konfigurowania domeny w Nginx. Musisz to zrobić sam. W tutorialu założono, że masz już skonfigurowaną domenę za pomocą ssl i że sam serwer, na którym planujesz ją skonfigurować, ma dostęp do serwerów Telegramu (w dowolny sposób)
Załóżmy, że adres IP tego serwera to 10.23.0.3, a nazwa domeny to mywebogram.localhost
W oparciu o te konwencje podam przykłady konfiguracji. Nie zapomnij zmienić wartości na własne.
A więc zacznijmy:
Aby uruchomić Webogram, potrzebujemy nodejs. Domyślnie, jeśli zainstalujemy go z repozytoriów Ubuntu, otrzymamy wersję nodejs 8.x. Potrzebujemy 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Wybieramy miejsce, w którym będzie oparty nasz Webogram.
Na przykład umieśćmy go w katalogu głównym katalogu domowego. W tym celu sklonuj oficjalne repozytorium na nasz serwer:
cd ~ && git clone https://github.com/zhukov/webogram.git
Następnym krokiem jest instalacja wszystkich zależności wymaganych do uruchomienia aplikacji:
cd webogram && npm install
Spróbujmy uruchomić test. Uruchom polecenie:
npm start
Następnie próbujemy otworzyć go w przeglądarce
http://10.23.0.3:8000/app/index.html
Jeśli do tego momentu wszystko wykonałeś poprawnie, otworzy się strona autoryzacji Webogramu.
Teraz musimy skonfigurować aplikację tak, aby działała jako usługa. Aby to zrobić, utwórzmy plik
sudo touch /lib/systemd/system/webogram.service
otwórz go w dowolnym edytorze i nadaj mu następujący wygląd (wpisz swoją ścieżkę do 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
Następnie uruchamiamy następujące polecenia:
Stosowanie zmian
sudo systemctl daemon-reload
Włącz automatyczne uruchamianie:
sudo systemctl enable webogram.service
Uruchommy usługę:
sudo systemctl start webogram.service
Po wykonaniu tych kroków Webogram będzie nadal dostępny na porcie 8000.
Ponieważ będziemy konfigurować dostęp do naszego Webogramu za pośrednictwem Nginx, zamkniemy port 8000 dla żądań z zewnątrz.
Używamy do tego narzędzia udf (lub dowolnej dogodnej dla Ciebie metody):
sudo ufw deny 8000
Jeśli nadal decydujesz się na użycie udf, ale jest ono wyłączone na serwerze, dodaj więcej reguł (aby wszystko się nie rozpadło) i włącz udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Następnie zacznijmy zmieniać konfigurację nginx.
Jak ostrzegałem powyżej, zakłada się, że domena z protokołem SSL jest już skonfigurowana na Twoim serwerze. Zwrócę tylko uwagę na to, co trzeba będzie dodać do pliku konfiguracyjnego domeny, aby działała poprawnie:
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;
}
}
Co dodajemy do konfiguracji nginx:
- Zmieniamy lokalizację root, która będzie przesyłać żądania proxy do portu 8000, na który odpowiada Webogram
- Zamykamy lokalizację główną za pomocą podstawowego uwierzytelniania. To czysto symboliczny krok, aby zamknąć naszą aplikację przed ciekawskimi oczami i botami. (A także, aby uniknąć problemów z blokowaniem)
- Kilka lokalizacji z proxy_path na serwerze Telegramu to dokładnie nasze punkty końcowe, przez które będziemy przesyłać proxy nasze żądania
Utwórzmy także plik /etc/nginx/passwd.htpasswd;
aby nginx miał coś do sprawdzania haseł użytkowników.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Uruchom ponownie Nginxa:
sudo systemctl restart nginx
Teraz Webogram będzie dostępny tylko pod adresem
Niewiele zostało: drobne zmiany wprowadzimy w samym projekcie.
Otwórz plik w edytorze ~/webogram/app/js/lib/mtproto.js
I sprowadź jego początek do następującej postaci:
/*!
* 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
}
...
Następnie musisz odświeżyć stronę aplikacji w przeglądarce.
Otwórz konsolę przeglądarki i przejrzyj żądania sieciowe aplikacji. Jeśli wszystko działa i żądania XHR trafiają do Twojego serwera, oznacza to, że wszystko zostało wykonane poprawnie, a Webogram jest teraz przesyłany przez serwer proxy przez Nginx.
Mam nadzieję, że ten tutorial przyda się komuś innemu oprócz mnie.
Serdecznie dziękuję wszystkim, którzy doczytali do końca.
Jeżeli ktoś miałby jakieś trudności lub popełniłem jakieś nieścisłości chętnie odpowiem i postaram się pomóc w komentarzach lub na PW.
Źródło: www.habr.com