Свой relay для вебхуков. Отвечает сразу, а сообщения доставляет в фоне: если Discord вернул 429 или соединение оборвалось, сообщение подождёт в очереди и уйдёт позже. Порядок при этом сохраняется, а на каждый вебхук своя очередь: разные вебхуки отправляются параллельно и не мешают друг другу. Все разом встают на паузу только на глобальном лимите Discord.

Сборка

git clone "https://github.com/lashkinse/discord-proxy.git"
cd discord-proxy
.\build.bat   # -> artifacts\publish\DiscordProxy.exe

На сервер копируете всю папку artifacts\publish: appsettings.json должен лежать рядом с exe.

Конфигурация

Всё в секции Proxy файла appsettings.json:

{
  "Proxy": {
    "Port": 7070,
    "DbPath": "queue.db",
    "MaxPayloadBytes": 65536,
    "MaxPending": 10000,
    "PaceSeconds": 2.2,
    "MaxAttemptsNet": 48,
    "MaxAttempts429": 25,
    "DiscordTimeoutSeconds": 15
  }
}

Значения по умолчанию обычно менять не приходится:

  • Port - порт, который слушает прокси;
  • PaceSeconds - пауза между отправками одного вебхука (2.2 с - официальный лимит Discord);
  • MaxAttempts429 / MaxAttemptsNet - сколько раз повторять при rate limit и при сетевых/5xx ошибках;
  • MaxPending - сколько сообщений максимум ждёт в очереди.

Конфиг читается только при старте: после изменения нужен перезапуск.

Запуск

.\DiscordProxy.exe
.\DiscordProxy.exe --Proxy:Port=8080 --Proxy:DbPath=D:\discord\queue.db

Как служба Windows - WinSW уже внутри, ничего доустанавливать не нужно, из папки artifacts\publish в консоли от администратора:

.\install_service.bat

Служба DiscordProxySvc стартует автоматически и перезапускается через 10 секунд после падения. Логи пишутся в logs\proxy-ДАТА.log. Убрать службу:

.\uninstall_service.bat

Подключение

Меняется только хост, формат запроса остаётся дискордовским:

- https://discord.com/api/webhooks/<id>/<token>
+ http://localhost:7070/api/webhooks/<id>/<token>

Такой же адрес можно вписать в любой клиент, который умеет слать вебхуки: игровой сервер, CI-скрипт, cron-задача, домашний бот.

Проверка и диагностика

curl http://localhost:7070/health/ready
curl http://localhost:7070/stats

/stats - главный индикатор: растущий счётчик dead означает, что Discord отвергает сообщения навсегда, то есть токен неверный или вебхук удалён.

🔗 Исходный код и документация: github.com/lashkinse/discord-proxy