laravel-telegram-deployer maintained by enessvg
enessvg/laravel-telegram-deployer
English | Turkce
Telegram webhook-triggered, TOTP-protected, queue-based deploy/action runner for Laravel.
Supported Versions
- Laravel 11.x
- Laravel 12.x
- Laravel 13.x (PHP 8.3+)
Command Format
Only this format is supported:
/run {action} [key=value ...] {token}
Examples:
/run deploy 123456/run seed class=Database\\Seeders\\UserSeeder 123456
Features
- Telegram webhook secret validation
- Chat/User allowlist authorization
- TOTP validation (
period,digits,window) - Replay protection (single use per token+window)
- Global single-run lock
- Fail-fast action pipeline (
artisan+shell) - DB run logs (
telegram_deployer_runs) - Telegram status messaging
Installation (Host App)
- Install the package:
composer require enessvg/laravel-telegram-deployer
- Publish config and migrations:
php artisan vendor:publish --tag=telegram-deployer-config
php artisan vendor:publish --tag=telegram-deployer-migrations
- Add these env keys to
.env(fill values as needed):
TELEGRAM_DEPLOYER_BOT_TOKEN=
TELEGRAM_DEPLOYER_WEBHOOK_PATH=
TELEGRAM_DEPLOYER_WEBHOOK_SECRET=
TELEGRAM_DEPLOYER_ALLOWED_CHAT_IDS=
TELEGRAM_DEPLOYER_ALLOWED_USER_IDS=
TELEGRAM_DEPLOYER_OTP_SECRET=
TELEGRAM_DEPLOYER_OTP_PERIOD=
TELEGRAM_DEPLOYER_OTP_DIGITS=
TELEGRAM_DEPLOYER_OTP_WINDOW=
TELEGRAM_DEPLOYER_OTP_ISSUER=
TELEGRAM_DEPLOYER_OTP_LABEL=
TELEGRAM_DEPLOYER_QUEUE_CONNECTION=
TELEGRAM_DEPLOYER_QUEUE=
TELEGRAM_DEPLOYER_GLOBAL_LOCK_KEY=
TELEGRAM_DEPLOYER_GLOBAL_LOCK_SECONDS=
TELEGRAM_DEPLOYER_STEP_TIMEOUT=
TELEGRAM_DEPLOYER_WORKING_DIRECTORY=
- Run migrations:
php artisan migrate --force
- Run a queue worker.
- Set Telegram webhook.
Artisan Commands
php artisan telegram-deployer:generate-secretphp artisan telegram-deployer:generate-secret --qr(prints QR in terminal ifqrencodeis installed)php artisan telegram-deployer:set-webhook {url?}
Core Config Keys
telegram.bot_tokentelegram.webhook_pathtelegram.webhook_secrettelegram.allowed_chat_idstelegram.allowed_user_idsotp.secret,otp.period,otp.digits,otp.windowqueue.connection,queue.namelocks.global_lock_secondsactions
Parameterized Action Example
'actions' => [
'seed' => [
[
'type' => 'artisan',
'command' => 'db:seed --class={class} --force',
],
],
],