Обработка вебхуков на Ruby

Осваиваю Ruby, и в процессе решил настроить принятие 2-3 вебхуков, их обработку и взаимодействие с сервисом по API по определенной логике. Настроил nginx, поставил Ruby, но не могу понять, как получить данные с сокета, который уже слушает nginx, на 443 порту. Можно было бы поднять отдельный сервер через TCPServer, в целом это может сработать, но в таком случае придется открывать отдельный порт, а задача в том, чтобы через HTTPS получать на разные URL разные данные и по разному их обрабатывать - к примеру, один из вебхуков отправляется на /orders/short-description/, nginx ведет запрос в нужный location, и там выполняется соотв. скрипт на Ruby. Т.е. должен получиться сервер, который хранит несколько отдельных скриптов по разным URL, но на одном и том же порту - данные принимает nginx на 443, и скрипт их забирает. Направление в нужный location уже реализовано, но не могу понять, как реализовать получение данных без открытия дополнительного порта. Подскажите пожалуйста, возможно ли реализовать что-то подобное?


Ответы (1 шт):

Автор решения: Лютов

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

Пример простого веб-приложения на Rack:

require 'rack'

class WebhookHandler def call(env) request = Rack::Request.new(env)

# Здесь можно обрабатывать запросы по нужному URL
if request.path_info == '/orders/short-description/'
  # Обработка логики для данного URL
  [200, {'Content-Type' => 'text/plain'}, ['Short description webhook received']]
else
  [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
end

end end

Rack::Handler::WEBrick.run WebhookHandler.new, Port: 443

Затем в настройках Nginx нужно добавить прокси-пас к вашему веб-приложению на Rack. Например:

server { listen 443 ssl;

server_name example.com;

ssl_certificate /path/to/ssl.crt;
ssl_certificate_key /path/to/ssl.key;

location / {
    proxy_pass http://localhost:443/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

}

Таким образом, Nginx будет принимать запросы на порту 443 и передавать их вашему веб-приложению на Ruby, которое будет обрабатывать запросы по нужным URL.

→ Ссылка