{"id":40864715,"url":"https://github.com/ruslanlap/issue-telegram-notifier","last_synced_at":"2026-01-22T00:16:27.094Z","repository":{"id":331100612,"uuid":"1125240821","full_name":"ruslanlap/issue-telegram-notifier","owner":"ruslanlap","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-30T13:51:16.000Z","size":84,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-03T04:20:55.782Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruslanlap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-30T11:30:31.000Z","updated_at":"2025-12-30T13:51:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ruslanlap/issue-telegram-notifier","commit_stats":null,"previous_names":["ruslanlap/issue-telegram-notifier"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ruslanlap/issue-telegram-notifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanlap%2Fissue-telegram-notifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanlap%2Fissue-telegram-notifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanlap%2Fissue-telegram-notifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanlap%2Fissue-telegram-notifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruslanlap","download_url":"https://codeload.github.com/ruslanlap/issue-telegram-notifier/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanlap%2Fissue-telegram-notifier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28647913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T21:29:11.980Z","status":"ssl_error","status_checked_at":"2026-01-21T21:24:31.872Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-22T00:16:26.273Z","updated_at":"2026-01-22T00:16:27.059Z","avatar_url":"https://github.com/ruslanlap.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📬 GitHub → Telegram Notifier\n\nReal-time GitHub webhook notifications sent directly to your Telegram chat. Stay updated on issues, pull requests, comments, pushes, and stars without constantly checking GitHub.\n\n![Node.js](https://img.shields.io/badge/Node.js-18+-339933?style=flat\u0026logo=node.js\u0026logoColor=white)\n![Express](https://img.shields.io/badge/Express-5.x-000000?style=flat\u0026logo=express\u0026logoColor=white)\n![License](https://img.shields.io/badge/License-ISC-blue?style=flat)\n\n---\n\n## 🎯 Проблема\n\nРозробники часто пропускають важливі події у своїх GitHub репозиторіях:\n- Нові issues, які потребують уваги\n- Pull requests, що чекають на review\n- Коментарі від колег\n- Зміни в коді (push)\n\n**Постійно перевіряти GitHub — втомлює та відволікає від роботи.**\n\n---\n\n## ✅ Рішення\n\nЦей сервіс автоматично надсилає сповіщення в Telegram при:\n\n| Подія | Опис |\n|-------|------|\n| 🔵 **Issues** | Створення, закриття, повторне відкриття |\n| 💬 **Comments** | Нові коментарі до issues |\n| 🔀 **Pull Requests** | Створення, merge, закриття |\n| 📦 **Push** | Нові коміти з переліком змін |\n| ⭐ **Stars** | Коли хтось ставить зірку репозиторію |\n\n---\n\n## 📸 Скріншоти\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"data/issue.png\" width=\"400\" alt=\"GitHub Issue Notification\"\u003e\n    \u003cbr\u003e\n    \u003cem\u003eПриклад сповіщення про нове Issue та коментар\u003c/em\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"data/star.png\" width=\"400\" alt=\"GitHub Star Notification\"\u003e\n    \u003cbr\u003e\n    \u003cem\u003eСповіщення про нову зірку ⭐\u003c/em\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## 🚀 Швидкий старт\n\n### ⚡ Чеклист для продакшену (Render + GitHub App)\n\n- [ ] Створено Telegram бота через @BotFather\n- [ ] Отримано `TELEGRAM_BOT_TOKEN` та `TELEGRAM_CHAT_ID`\n- [ ] Створено GitHub App з правильним **Webhook URL** (`https://your-app.onrender.com/webhook` ⚠️ з `/webhook`!)\n- [ ] Згенеровано `WEBHOOK_SECRET` та додано в GitHub App та Render\n- [ ] Отримано `GITHUB_APP_ID` та `GITHUB_PRIVATE_KEY` з GitHub App\n- [ ] Задеплоєно на Render з усіма змінними оточення\n- [ ] Встановлено GitHub App на потрібний репозиторій\n- [ ] Налаштовано Telegram webhook через `setup-telegram-webhook.js`\n- [ ] Протестовано: створив issue → отримав повідомлення в Telegram ✅\n\n---\n\n### 1. Клонування та встановлення\n\n```bash\ngit clone https://github.com/yourusername/issue-telegram-notifier.git\ncd issue-telegram-notifier\nnpm install\n```\n\n### 2. Створення Telegram бота\n\n1. Напишіть [@BotFather](https://t.me/BotFather) в Telegram\n2. Надішліть `/newbot` та дотримуйтесь інструкцій\n3. Збережіть отриманий **Bot Token**\n\n### 3. Отримання Chat ID\n\n1. Додайте бота в чат/групу\n2. Напишіть боту будь-яке повідомлення\n3. Відкрийте: `https://api.telegram.org/bot\u003cYOUR_BOT_TOKEN\u003e/getUpdates`\n4. Знайдіть `\"chat\":{\"id\": XXXXXXXX}` — це ваш **Chat ID**\n\n### 4. Налаштування змінних оточення\n\nСтворіть файл `.env`:\n\n```env\n# Telegram\nTELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz\nTELEGRAM_CHAT_ID=-1001234567890\n\n# GitHub Webhook\nWEBHOOK_SECRET=your_secure_random_string\n\n# GitHub App (опціонально, якщо використовуєш GitHub App)\nGITHUB_APP_ID=2564133\nGITHUB_PRIVATE_KEY=\"-----BEGIN RSA PRIVATE KEY-----\\nMIIEpAIBAAKCAQEA...\\n-----END RSA PRIVATE KEY-----\"\n\n# Render keep-alive (для локального тестування)\nRENDER_EXTERNAL_URL=http://localhost:3000\nKEEPALIVE_ENABLED=true\nKEEPALIVE_INTERVAL_MS=300000\n\n# Server\nPORT=3000\n```\n\n**Примітки:**\n- `WEBHOOK_SECRET` — згенеруй через `openssl rand -hex 32`\n- `GITHUB_PRIVATE_KEY` — має бути в лапках, переноси рядків як `\\n`\n- `RENDER_EXTERNAL_URL` — на Render встановлюється автоматично, локально вкажи `http://localhost:3000`\n\n### 5. Запуск сервера\n\n```bash\nnode server.js\n```\n\nПовідомлення в консолі:\n```\n🚀 Server running on port 3000\n📡 Webhook endpoint: http://localhost:3000/webhook\n```\n\n---\n\n## 🔗 Налаштування GitHub App (рекомендовано)\n\nGitHub App дозволяє боту відповідати на коментарі з Telegram та писати їх у GitHub issues.\n\n### 1. Створення GitHub App\n\n1. Перейдіть на [GitHub Settings → Developer settings → GitHub Apps](https://github.com/settings/apps)\n2. Натисніть **\"New GitHub App\"**\n3. Заповніть обов'язкові поля:\n\n| Поле | Значення |\n|------|----------|\n| **GitHub App name** | `issue-telegram-notifier` (або будь-яке ім'я) |\n| **Homepage URL** | `https://your-app.onrender.com/` |\n| **Webhook URL** | `https://your-app.onrender.com/webhook` ⚠️ **ВАЖЛИВО: має бути `/webhook` в кінці!** |\n| **Webhook secret** | Той самий, що в `.env` (`WEBHOOK_SECRET`) |\n\n4. **Permissions** (обов'язково налаштуйте):\n\n| Permission | Access |\n|------------|--------|\n| **Issues** | Read \u0026 write (для відповідей з Telegram) |\n| **Pull requests** | Read |\n| **Metadata** | Read-only |\n\n5. **Subscribe to events** (включити):\n   - ✅ Issues\n   - ✅ Issue comment\n   - ✅ Pull request\n   - ✅ Push\n   - ✅ Star\n\n6. Натисніть **\"Create GitHub App\"**\n\n### 2. Отримання App ID та Private Key\n\n1. На сторінці App знайди **App ID** (наприклад, `2564133`)\n2. Натисни **\"Generate a new private key\"** → завантажиться `.pem` файл\n3. Відкрий `.pem` файл та скопіюй весь вміст (включно з `-----BEGIN RSA PRIVATE KEY-----` та `-----END RSA PRIVATE KEY-----`)\n\n### 3. Додавання змінних оточення\n\nДодай до `.env`:\n\n```env\nGITHUB_APP_ID=2564133\nGITHUB_PRIVATE_KEY=\"-----BEGIN RSA PRIVATE KEY-----\\nMIIEpAIBAAKCAQEA...\\n-----END RSA PRIVATE KEY-----\"\n```\n\n**Важливо:** `GITHUB_PRIVATE_KEY` має бути в лапках, а переноси рядків заміни на `\\n`.\n\n### 4. Встановлення App на репозиторій\n\n1. На сторінці App натисни **\"Install App\"**\n2. Вибери репозиторій (або всі репозиторії)\n3. Натисни **\"Install\"**\n\n---\n\n## 📱 Налаштування Telegram Webhook\n\nДля того, щоб бот міг отримувати відповіді з Telegram та писати їх у GitHub:\n\n```bash\n# Варіант 1: через curl (підстав свій токен)\ncurl -X POST \"https://api.telegram.org/bot\u003cYOUR_BOT_TOKEN\u003e/setWebhook\" \\\n  -d \"url=https://your-app.onrender.com/telegram-webhook\"\n\n# Варіант 2: через Node.js скрипт\nnode setup-telegram-webhook.js\n```\n\nПеревірка налаштування:\n\n```bash\ncurl \"https://api.telegram.org/bot\u003cYOUR_BOT_TOKEN\u003e/getWebhookInfo\"\n```\n\nМає повернути `\"url\": \"https://your-app.onrender.com/telegram-webhook\"`.\n\n---\n\n## ⚠️ Типові проблеми та вирішення\n\n### Проблема 1: Webhook не спрацьовує\n\n**Симптоми:**\n- Події з GitHub не надходять в Telegram\n- В логах Render немає записів `📨 GitHub: issues -\u003e opened`\n\n**Рішення:**\n\n1. **Перевір Webhook URL в GitHub App:**\n   - ❌ Неправильно: `https://your-app.onrender.com`\n   - ✅ Правильно: `https://your-app.onrender.com/webhook`\n   \n   **ВАЖЛИВО:** URL має закінчуватися на `/webhook`!\n\n2. **Перевір Webhook Secret:**\n   - `WEBHOOK_SECRET` на Render має **точно співпадати** з secret у GitHub App\n   - Якщо не співпадає → зміни в GitHub App → \"Change secret\" → онови на Render\n\n3. **Перевір, чи App встановлений:**\n   - GitHub → Settings → Integrations → GitHub Apps\n   - Знайди свій App → перевір, чи він встановлений на потрібний репозиторій\n\n### Проблема 2: \"Invalid signature\" в логах\n\n**Причина:** `WEBHOOK_SECRET` не співпадає між GitHub App та Render.\n\n**Рішення:**\n1. Згенеруй новий secret (наприклад, через `openssl rand -hex 32`)\n2. Онови в GitHub App → Webhook → \"Change secret\"\n3. Онови на Render → Environment → `WEBHOOK_SECRET`\n4. Перезапусти сервіс на Render\n\n### Проблема 3: Render instance \"спить\" (cold start)\n\n**Симптоми:** Перший запит після неактивності займає 30+ секунд.\n\n**Рішення:** Keep-alive вже налаштований в `render.yaml`:\n- `KEEPALIVE_ENABLED=true`\n- `KEEPALIVE_INTERVAL_MS=300000` (5 хвилин)\n\nЯкщо хочеш частіше (наприклад, кожні 30 секунд), зміни на Render:\n- `KEEPALIVE_INTERVAL_MS=30000`\n\n### Проблема 4: Telegram webhook не працює\n\n**Симптоми:** Відповіді з Telegram не потрапляють у GitHub issues.\n\n**Рішення:**\n1. Перевір, чи налаштований webhook:\n   ```bash\n   curl \"https://api.telegram.org/bot\u003cTOKEN\u003e/getWebhookInfo\"\n   ```\n2. Переконайся, що URL правильний: `https://your-app.onrender.com/telegram-webhook`\n3. Перевір логи Render на помилки типу `❌ Telegram error` або `❌ GitHub API Error`\n\n### Проблема 5: \"GitHub App initialized successfully\" не з'являється\n\n**Причина:** Неправильний формат `GITHUB_PRIVATE_KEY`.\n\n**Рішення:**\n- Private key має бути в лапках\n- Переноси рядків мають бути як `\\n`:\n  ```env\n  GITHUB_PRIVATE_KEY=\"-----BEGIN RSA PRIVATE KEY-----\\nMIIEpAIBAAKCAQEA...\\n-----END RSA PRIVATE KEY-----\"\n  ```\n\n---\n\n## 🔗 Альтернатива: Звичайний GitHub Webhook (без App)\n\nЯкщо не потрібна функція відповідей з Telegram:\n\n1. Перейдіть у **Settings** → **Webhooks** → **Add webhook**\n2. Заповніть поля:\n\n| Поле | Значення |\n|------|----------|\n| **Payload URL** | `https://your-domain.com/webhook` |\n| **Content type** | `application/json` |\n| **Secret** | Той самий, що в `.env` (`WEBHOOK_SECRET`) |\n| **Events** | Виберіть: `Issues`, `Issue comments`, `Pull requests`, `Pushes`, `Stars` |\n\n3. Натисніть **Add webhook**\n\n---\n\n## 🌐 Деплой\n\n### Render (рекомендовано) — безкоштовно\n\n[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy)\n\n**Автоматичний деплой:**\n\n1. Перейдіть на [render.com](https://render.com)\n2. Натисніть **\"New\"** → **\"Web Service\"**\n3. Підключіть GitHub репозиторій `ruslanlap/issue-telegram-notifier`\n4. Render автоматично виявить `render.yaml` та налаштує сервіс\n5. Додайте змінні оточення в **Settings → Environment**:\n\n   **Обов'язкові:**\n   - `TELEGRAM_BOT_TOKEN` — токен від @BotFather\n   - `TELEGRAM_CHAT_ID` — ID чату/групи\n   - `WEBHOOK_SECRET` — випадковий рядок (наприклад, через `openssl rand -hex 32`)\n   \n   **Для GitHub App (якщо використовуєш App замість звичайного webhook):**\n   - `GITHUB_APP_ID` — ID з GitHub App settings\n   - `GITHUB_PRIVATE_KEY` — вміст `.pem` файлу (з переносами як `\\n`)\n   \n   **Опціональні:**\n   - `KEEPALIVE_ENABLED` — `true` (за замовчуванням, для запобігання cold start)\n   - `KEEPALIVE_INTERVAL_MS` — `300000` (5 хв, за замовчуванням)\n\n6. Натисніть **\"Create Web Service\"**\n\n**Важливо після деплою:**\n\n1. Скопіюй URL сервісу (наприклад, `https://github-telegram-notifier.onrender.com`)\n2. Онови **Webhook URL** в GitHub App: `https://your-app.onrender.com/webhook` ⚠️ **Не забудь `/webhook` в кінці!**\n3. Налаштуй Telegram webhook (див. секцію вище)\n\n**Або вручну (якщо не використовуєш `render.yaml`):**\n\n1. **Build Command**: `npm install`\n2. **Start Command**: `npm start`\n3. **Environment**: Node\n4. Додай всі змінні оточення вручну\n\nRender надає:\n- ✅ Безкоштовний SSL сертифікат\n- ✅ Автоматичні деплої з GitHub\n- ✅ 750 годин/місяць безкоштовно\n\n### Railway\n\n⚠️ **Увага:** Railway має обмеження на безкоштовному плані.\n\nЯкщо у вас є платний план:\n1. `railway init`\n2. `railway service`\n3. Встановіть змінні: `railway variables --set \"KEY=value\"`\n4. Підключіть GitHub репозиторій через веб-інтерфейс\n\n### Інші варіанти\n\n- **VPS/Ubuntu**: Використовуйте PM2 (`pm2 start server.js`)\n- **Docker**: Створіть Dockerfile\n- **Fly.io**, **Cyclic**, **Koyeb**\n\n---\n\n## 🧪 Тестування\n\nЗапустіть тестовий webhook локально:\n\n```bash\n# В першому терміналі\nnode server.js\n\n# В другому терміналі\nnode test-webhook.js\n```\n\nЯкщо все налаштовано правильно, ви отримаєте сповіщення в Telegram.\n\n---\n\n## 📁 Структура проекту\n\n```\nissue-telegram-notifier/\n├── server.js                    # Основний сервер з обробкою webhooks\n├── test-webhook.js              # Скрипт для тестування локального webhook\n├── test-render.js               # Скрипт для тестування Render instance\n├── setup-telegram-webhook.js    # Налаштування Telegram webhook\n├── render.yaml                  # Конфігурація для Render\n├── package.json                 # Залежності\n├── .env                         # Змінні оточення (не комітити!)\n├── .gitignore          \n└── README.md\n```\n\n---\n\n## 🔒 Безпека\n\n- ✅ Верифікація підпису GitHub webhook (`x-hub-signature-256`)\n- ✅ Секрет зберігається в змінних оточення\n- ✅ Використовуйте HTTPS у production\n\n---\n\n## 📝 Ліцензія\n\nISC © 2024\n\n---\n\n## 🤝 Contributing\n\nPull requests вітаються! Для великих змін спершу відкрийте issue для обговорення.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Зроблено з ❤️ для продуктивності розробників**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruslanlap%2Fissue-telegram-notifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruslanlap%2Fissue-telegram-notifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruslanlap%2Fissue-telegram-notifier/lists"}