Быстрый Обратный Прокси Как Альтернатива Ngrok

Создание общедоступного URL-адреса в Интернете для вашего локального проекта Каждый разработчик веб-приложений наверняка знает, что такое Ngrok, и многие им пользуются.

Немного предыстории.

Присоединившись к новому крупному проекту, над которым трудятся десятки разработчиков и QA-специалистов, я столкнулся с тем, что разработка ведется удаленно на специально выделенных серверах.

А потому, что я уже несколько лет занимаюсь разработкой приложений исключительно в Docker; Я не смог адаптироваться к нынешнему подходу.

Думаю, каждый, кто более-менее освоил работу в Docker, уже не представляет, как развиваться без него.

Есть много причин для этого.

Конечно, как и везде, у докера есть своя цена, и это тоже неоднократно обсуждалось.

Итак, новый проект не похож на предыдущие.

Он имеет множество зависимостей с другими сервисами, как внутренними, так и внешними.

Большое количество внешних интеграций породило проблему связи локального приложения с внешним миром.

И если объединение внутренних сервисов с помощью docker netwokr не вызвало никаких проблем, то необходимость подключения внешнего сервиса уже требовала дополнительных инструментов.

Интеграция платежных систем всегда подразумевает обратный звонок (уведомление).

Когда возникает такая необходимость, часто выбирают Нгрока.

Хорошее решение, но в удобном варианте - платное.

Особенно это чувствуется, когда разработчиков много.

Поскольку Ngrok не подошел, первое, что пришло в голову — создать виртуальную машину, создать на ней домен и создать с ним ssh-туннель.

docker-compose.yml

  
  
  
  
  
   

version: '3.7' services: callback-tunnel: build: context: .

/.

docker/ssh-tunnel-callback restart: unless-stopped volumes: - ~/.

ssh:/root/ssh:ro environment: TUNNEL_HOST: ${CALLBACK_TUNNEL_HOST} LOCAL_PORT: ${CALLBACK_TUNNEL_LOCAL_PORT} LOCAL_HOST: ${CALLBACK_TUNNEL_LOCAL_HOST} REMOTE_PORT: ${CALLBACK_TUNNEL_REMOTE_PORT} networks: - local app: image: php restart: unless-stopped tty: true volumes: - .

/:/var/www/html

где туннель обратного вызова Dockerfile выглядел так Докерфайл

FROM alpine RUN apk add --update openssh-client && rm -rf /var/cache/apk/* CMD rm -rf /root/.

ssh && mkdir /root/.

ssh && cp -R /root/ssh/* /root/.

ssh/ && chmod -R 600 /root/.

ssh/* && \ ssh \ -vv \ -o StrictHostKeyChecking=no \ -N $TUNNEL_HOST \ -R *:$REMOTE_PORT:$LOCAL_HOST:$LOCAL_PORT \ && while true; do sleep 30; done;

Этот подход решил проблему переадресации запросов обратного вызова от внешних поставщиков, но он не был надежным.

Иногда при резком обрыве соединения порт на виртуальной машине оставался занятым.

В ходе совместной разработки нужно было договориться, кто какой порт будет использовать.

Короче говоря, решение — это просто костыль.

Дальше - больше, при локальной разработке возникает необходимость протестировать приложение на другом устройстве, например на телефоне или планшете, либо в определенной версии браузера поведение фронта не адекватно.

И снова мысли о Нгроке.

Мне пришлось посмотреть.

В какой-то момент я наткнулся на список бесплатных инструментов, решающих эту проблему.

Сам список найти не могу, но один инструмент меня очень заинтересовал, и я решил его попробовать.



Быстрый обратный прокси

https://github.com/fatedier/frp Сервер написан на Go JS, Vue для информационной панели

Схема



Быстрый обратный прокси как альтернатива Ngrok

Репозиторий с примерами https://github.com/anydasa/frp-example

Как я это подобрал

  1. Подготовил репозиторий на github.
  2. Купил домен
  3. Создал дроплет в Digital Ocean (докер за 5 долларов).

  4. Установил туда nginx
  5. Установил letsenscript и создал SSL-сертификат Wildcard, используя этот док .

    Подстановочный знак необходим для того, чтобы общедоступные URL-адреса были https.

  6. Я настроил nginx, он выступает в роли первого прокси-сервера.

    Можно и без этого, но мне было проще

  7. Отклоненный https://github.com/anydasa/frp-example и запустил серверную часть
  8. Локально,
    1. поклонился https://github.com/anydasa/frp-example
    2. Создал .

      env из .

      env-example и указал необходимые переменные.

    3. запустил клиент docker-compose
  9. В зависимости от того, какой REVERSE_PROXY_PERSONAL_ALIAS был указан, мой URL-адрес будет таким.

В моем примере есть 3 хоста (обычно нужны для проекта), и в зависимости от того, какой PERSONAL_ALIAS указан, URL-адреса будут доступны.

Например, PERSONAL_ALIAS=проект, затем

Поскольку на *.

frp.example.com настроен Wildcard SSL, все поддомены необходимо указывать без точек.

Сервер Nginx

server { listen 443 ssl; server_name dashboard.frp.example.com; ssl_certificate /etc/letsencrypt/live/ frp.example.com/fullchain.pem ; ssl_certificate_key /etc/letsencrypt/live/ frp.example.com/privkey.pem ; location / { proxy_pass http://127.0.0.1:7500/ ; proxy_set_header host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-forward-for $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; proxy_redirect off; } } server { listen 443 ssl; server_name ~^.

+\.

frp\.

example\.

com$; ssl_certificate /etc/letsencrypt/live/ frp.example.com/fullchain.pem ; ssl_certificate_key /etc/letsencrypt/live/ frp.example.com/privkey.pem ; location / { proxy_pass http://127.0.0.1:7000/ ; proxy_set_header host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-forward-for $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; proxy_redirect off; } } server { listen 80; server_name ~^.

+\.

frp\.

example\.

com$; return 301 https://$host$request_uri ; }

Docker-файл FRP сервера

FROM alpine:3 MAINTAINER Sykchin Artem ENV FRP_VERSION=0.37.1 ENV FRP_URL= https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz WORKDIR /opt/frp ADD ${FRP_URL} /tmp/frp.tar.gz RUN tar --strip 1 -xvzf /tmp/frp.tar.gz -C /opt/frp && rm /tmp/frp.tar.gz ADD frps.ini /opt/frp ADD 404.html /opt/frp ADD entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"]

Клиент docker-compose.yml

version: '3.7' services: proxy: build: docker/proxy depends_on: - webserver environment: PERSONAL_ALIAS: ${REVERSE_PROXY_PERSONAL_ALIAS} SERVER_HOST: ${REVERSE_PROXY_SERVER_HOST} SERVER_TOKEN: ${REVERSE_PROXY_SERVER_TOKEN} SERVER_PORT: ${REVERSE_PROXY_SERVER_PORT} webserver: image: nginx:alpine restart: unless-stopped volumes: - .

/docker/nginx/templates:/etc/nginx/templates depends_on: - app app: image: php:8-fpm-alpine restart: unless-stopped volumes: - .

/src:/var/www/html

настройки клиентского прокси (прокси — это контейнер) FRP-клиент.ini

[common] server_addr = {SERVER_HOST} server_port = {SERVER_PORT} token = {SERVER_TOKEN} login_fail_exit = true [frontend-{PERSONAL_ALIAS}] type = http local_ip = webserver local_port = 8081 subdomain = {PERSONAL_ALIAS} [admin-{PERSONAL_ALIAS}] type = http local_ip = webserver local_port = 8082 subdomain = admin-{PERSONAL_ALIAS} [api-{PERSONAL_ALIAS}] type = http local_ip = webserver local_port = 8083 subdomain = api-{PERSONAL_ALIAS}

Выполняя docker-compose up, вы берете проект + прокси-клиент и связываете все вместе.

Соответственно, выполняя docker-compose down вы «гасите» проект вместе с проксированием.

Теги: #разработка сайтов #docker #web #разработка #обратный прокси

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.