پرش به محتویات

پیکربندی

همه‌چیز یک بار، موقع بالا آمدن، از محیط خوانده می‌شود، در shared/settings.py. روی سرور آن فایل /opt/kasbbook/.env است، با دسترسی 600، نوشتهٔ نصب‌کننده.

هر مقدار پیش‌فرض امنی دارد جز آن دوتایی که نمی‌توانند داشته باشند: توکن ربات و کلید امضا.

هسته

متغیر پیش‌فرض توضیح
KASBBOOK_DATABASE_URL sqlite+aiosqlite:///kasbbook.db پیش‌فرض SQLite است تا برنامه‌نویس بتواند بدون بالا آوردن پستگرس ربات را اجرا کند. محیط عملیاتی بازنویسی‌اش می‌کند.
REDIS_URL (تنظیم‌نشده) بدونش، وضعیت گفتگو و محدودیت نرخ درون‌پروسه‌اند — روی یک کارگر درست، روی چندتا غلط.
KASBBOOK_LOG_LEVEL INFO httpx و httpcore در هر حال روی WARNING قفل‌اند، چون نشانی کامل درخواست را لاگ می‌کنند و در همهٔ این APIها توکن داخل مسیر است.

این پروسه کدام پیام‌رسان را اجرا می‌کند

یک پروسه، یک پیام‌رسان.

متغیر پیش‌فرض توضیح
KASBBOOK_PROVIDER telegram telegram، bale یا rubika. مقدار ناشناخته موقع بالا آمدن با فهرست گزینه‌ها شکست می‌خورد.

هر پیام‌رسان اعتبارنامهٔ خودش را می‌خواند، پس پروسهٔ بله نمی‌تواند بی‌سروصدا با توکن تلگرام بالا بیاید:

پیام‌رسان توکن نام‌کاربری راز وب‌هوک
تلگرام TELEGRAM_BOT_TOKEN TELEGRAM_BOT_USERNAME TELEGRAM_WEBHOOK_SECRET
بله BALE_BOT_TOKEN BALE_BOT_USERNAME —
روبیکا RUBIKA_BOT_TOKEN RUBIKA_BOT_USERNAME —

نام‌کاربری فقط برای ساختن پیوند عمیق لازم است (t.me/…?start=…). بدونش create_deep_link خطا می‌دهد، به‌جای ساختن پیوندی که به جایی نمی‌رسد.

فقط تلگرام راز وب‌هوک دارد؛ توکنی را که ثبت کرده‌ایم در یک هدر بازتاب می‌دهد. بله و روبیکا هیچ چیزی را امضا نمی‌کنند — برای اینکه به‌جایش چه می‌کنیم امنیت را ببین.

برای اجرای پیام‌رسان دوم: یونیت و فایل محیط را کپی کن.

sudo cp /etc/systemd/system/kasbbook-bot.service /etc/systemd/system/kasbbook-bale.service
# EnvironmentFile را به /opt/kasbbook/.env.bale اشاره بده
# در آن فایل: KASBBOOK_PROVIDER=bale و BALE_BOT_TOKEN=...

هر دو پروسه یک دیتابیس دارند، و نکته هم همین است: حسابی که به هر دو پیام‌رسان وصل باشد یک مجموعه دفتر دارد.

رابط برنامه‌نویسی

متغیر پیش‌فرض توضیح
KASBBOOK_SECRET_KEY ندارد توکن دسترسی را امضا می‌کند. API بدونش بالا نمی‌آید. تولیدش کن، هرگز تایپش نکن.
KASBBOOK_ACCESS_MINUTES 30 توکن دسترسی قابل باطل‌کردن نیست، پس کوتاه است.
KASBBOOK_REFRESH_DAYS 30 توکن تازه‌سازی در هر استفاده از دیتابیس خوانده می‌شود، پس می‌شود باطلش کرد.
KASBBOOK_CORS_ORIGINS (تنظیم‌نشده) با ویرگول جدا شده. هرگز *: این نقاط پایانی اعتبارنامه حمل می‌کنند.
KASBBOOK_TRUSTED_PROXY (تنظیم‌نشده) فقط وقتی تنظیمش کن که پراکسی خودت جلوی برنامه باشد. باعث می‌شود X-Forwarded-For برای محدودیت نرخ معتبر شمرده شود — بدون پراکسی واقعی، هر کسی می‌تواند آن هدر را بگذارد و محدودیت نرخ تزئینی می‌شود.
KASBBOOK_WEB_URL (تنظیم‌نشده) نشانی پایه در پیوندهایی که ربات می‌فرستد.
KASBBOOK_DOCS_URL (سایت همین پروژه) راهنمای نوشتاری‌ای که ربات کنار مرجع API به آن پیوند می‌دهد. نرم‌افزار را مستند می‌کند نه استقرار تو را، و به همین دلیل اصلاً پیش‌فرض دارد؛ اگر نسخه‌ات جدا افتاده به مال خودت اشاره بده، یا خالی بگذار تا دکمه حذف شود.
KASBBOOK_UPDATE_MODE polling polling یا webhook. پولینگ یک اتصال خروجی نگه می‌دارد و لازم نیست چیزی از بیرون در دسترس باشد. وب‌هوک نقطهٔ پایانی HTTPS عمومی می‌خواهد و به‌روزرسانی‌هایی را که هنگام راه‌اندازی مجدد API می‌رسند از دست می‌دهد، چون سرویس‌دهنده مدتی تلاش می‌کند و بعد رها می‌کند.
KASBBOOK_WEBHOOK_PATH (تنظیم‌نشده) بخش غیرقابل‌حدس در /webhooks/<provider>/<secret>. در حالت وب‌هوک اجباری است. تولیدش کن، هرگز انتخابش نکن.
KASBBOOK_API_URL (تنظیم‌نشده) جایی که API منتشر شده، مثلاً https://kasbbook.example.com. ربات از صفحهٔ API‌اش به <url>/docs پیوند می‌دهد؛ تنظیم‌نبودنش یعنی بی‌پیوند، نه پیوند مرده.

برای تولید کلید:

python3 -c 'import secrets; print(secrets.token_urlsafe(48))'

انبارهای داده

deploy/.env، که docker compose می‌خواندش. آن را هم نصب‌کننده می‌نویسد.

متغیر پیش‌فرض
POSTGRES_DB kasbbook
POSTGRES_USER kasbbook
POSTGRES_PASSWORD (تولیدشده)
POSTGRES_PORT 5435
REDIS_PORT 6382

هر دو فقط به 127.0.0.1 گوش می‌دهند. پورت‌ها غیرمعمول‌اند چون روی سروری نوشته شدند که ۵۴۳۲ تا ۵۴۳۴ و ۶۳۸۰ تا ۶۳۸۱ در آن اشغال بود؛ راحت عوضشان کن.

این‌ها عمداً پستگرس خودِ سرور نیستند. آن نمونه ناوگانی از سرویس‌های بی‌ربط را حمل می‌کند، و اشتراکش یک مهاجرت بی‌احتیاط را مسئلهٔ همه می‌کرد.

عملیاتی

اسکریپت‌ها می‌خوانندشان، نه خود برنامه.

متغیر پیش‌فرض
KASBBOOK_HOME /opt/kasbbook
KASBBOOK_BRANCH main
KASBBOOK_BACKUP_DIR /var/backups/kasbbook
KASBBOOK_BACKUP_KEEP 14

آزمون

متغیر اثر
KASBBOOK_TEST_POSTGRES_URL tests/test_migrations_postgres.py را فعال می‌کند. بدونش آن شش تست رد می‌شوند، و به همین دلیل لپ‌تاپی بدون پستگرس هم بقیهٔ مجموعه را اجرا می‌کند.

یک فایل کامل عملیاتی

KASBBOOK_PROVIDER=telegram
TELEGRAM_BOT_TOKEN=123456:ABC-DEF...
TELEGRAM_BOT_USERNAME=KasbBook_BOT

KASBBOOK_DATABASE_URL=postgresql+asyncpg://kasbbook:PASSWORD@127.0.0.1:5435/kasbbook
REDIS_URL=redis://127.0.0.1:6382/0

KASBBOOK_SECRET_KEY=GENERATED-48-BYTES
KASBBOOK_ACCESS_MINUTES=30
KASBBOOK_REFRESH_DAYS=30

KASBBOOK_LOG_LEVEL=INFO

اگر توکنی درز کرد

اینجا اتفاق افتاده. httpx نشانی کامل درخواست را در سطح INFO لاگ می‌کند، و نشانی تلگرام توکن را در خود دارد، پس یک جلسهٔ اشکال‌زدایی یکی را در ژورنال گذاشت.

در @BotFather بچرخانش (/revoke)، تازه را در .env بگذار و سرویس را دوباره راه بینداز. توکن قدیمی بلافاصله ۴۰۴ برمی‌گرداند، و از همان می‌فهمی.

سطح‌های لاگری که جلوی این را می‌گیرند در apps/bot/runner.py تنظیم شده‌اند و اختیاری نیستند.