Проброс webhook через VPS на localhost

В предыдущей статье я показал пример использования сервиса ngrok. Но если есть свой VPS с настроенным доменом и SSL-сертификатом, для тестовых webhook-запросов удобнее использовать его.

Настройка VPS, домена и SSL в данной заметке не рассматривается.

Настройка Nginx на VPS

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

server {
      server_name your-website.ru www.your-website.ru;

      root /var/www/laravel;
      index index.php;

      location /webhook {
          proxy_pass http://localhost:5050; # Перенаправляем на порт туннеля
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
      }

      # ...
}

Проверяем конфиг и перезагружаем Nginx:

$ nginx -t && service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Обратный SSH-туннель

На своей локальной машине открываем обратный туннель:

$ ssh -R 5050:localhost:3000 -N your-user@your-vps-ip

Соединение не закрываем.

Проверка

На VPS проверяем, что порт туннеля доступен:

$ curl -Is http://localhost:5050 | head -n 1
HTTP/1.1 200 OK

Теперь тестируем публичный webhook.

$ curl -X POST https://your-website.ru/webhook \
  -H "Content-Type: application/json" \
  -d '{"data":"test"}'

Важно: URL должен совпадать с location в Nginx.

На локальной машине приложение должно получить запрос. Если возвращается ошибка, например 502, смотрим логи Nginx:

$ sudo tail -f /var/log/nginx/error.log

После тестирования временный location нужно закрыть или удалить.