المنصة
الاستضافة الذاتية
الصورة نفسها تعمل على مضيفك أو مضيفنا. وهذه الصفحة عرض المشغّل: ما تضبطه، وما تضعه أمامه، وكيف تبقيه يعمل دون أن يغادر شيء المبنى.
التخطيط
- عملية Python واحدة تشغّل مستمع المحادثة والمجدول وواجهة API مع لوحة التحكم في حلقة أحداث واحدة.
- تستمع الحاوية على واجهة الاسترجاع فقط؛ ووكيل عكسي (Nginx أو Caddy) ينهي TLS ويمرر إليها.
- تقيم الحالة في دليل بيانات: قاعدة بيانات SQLite، والمرفوعات، وبيانات GeoIP، والمفاتيح المولَّدة، وأوزان النموذج. وجّه DATABASE_URL إلى Postgres للنشر على عدة مضيفين؛ ومجموعة الترحيل الإضافية تعمل على كليهما.
- يمكن أن يكون خادم المحادثة (Synapse أو خادم Matrix رئيسي آخر) في أي مكان يمكن الوصول إليه.
البيئة
| MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKEN | حساب الروبوت |
|---|---|
| MATRIX_STANDUP_ROOM_ID | غرفة التحديثات اليومية الافتراضية |
| MATRIX_ADMIN_TOKEN | رمز مسؤول الخادم الرئيسي للتزويد وعمليات البحث؛ في البيئة فقط، ولا يُحفظ أبدًا |
| SECRET_KEY | سلسلة عشوائية من 64 حرفًا فأكثر توقّع جلسات لوحة التحكم |
| DATABASE_URL | sqlite افتراضيًا، أو عنوان URL لـ Postgres |
| BOOTSTRAP_ADMIN_MATRIX_ID | المسؤول الأول، يُرقَّى عند بدء التشغيل |
| AI_PROVIDER ومفتاح المزوّد | انظر "مزوّدو الذكاء الاصطناعي" |
| INTEGRATION_VAULT_KEY | المفتاح الذي يشفّر بيانات اعتماد التكاملات المخزّنة |
| TZ وMAX_BODY_BYTES وAI_REASONING_MODEL | اختيارية |
الوكيل العكسي
- مرّر X-Forwarded-For وX-Forwarded-Proto؛ فدون الأخير لا يستطيع المنتج التمييز بين HTTP وHTTPS ويتخطى ترويسة HSTS.
- فعّل الضغط للاستجابات الممرَّرة وHTTP/2؛ فلوحة التحكم تسحب عشرات الأصول عند التحميل البارد.
- لا تضغط أبدًا نقطة نهاية تدفق الأحداث ولا تخزّنها مؤقتًا؛ فالتحديثات الحية أحداث مرسلة من الخادم.
- تحديد المعدل لكل IP مهمة الوكيل؛ والمنتج يحدّ طلبات الرموز وتسجيلات الدخول بنفسه.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; gzip_proxied any; http2 on;
ترويسات الأمان والحدود
تحمل كل استجابة nosniff، ومنع الأطر، وسياسة عدم الإحالة، وسياسة صلاحيات مقيِّدة، وHSTS لسنتين على TLS، وسياسة أمان المحتوى. وتُحدّ أجسام الطلبات عند 5 MiB افتراضيًا. ويُتحقق من كل مدخل بمخطط قبل تشغيل المعالج؛ وتُفحص معرّفات المحادثة بتعبير نمطي قبل أي استدعاء للخادم الرئيسي؛ ويُثبَّت HTTP الصادر على الخادم الرئيسي ومضيف المزوّد المضبوط.
التشغيل
- الترقية: سحب، وإعادة بناء، وإعادة تشغيل. وتعمل الترحيلات عند الإقلاع وتتخطى ما هو موجود.
- انسخ دليل البيانات احتياطيًا كل ليلة؛ ولـ Postgres استخدم pg_dump.
- الصحة: نقطة نهاية حيوية سريعة دون مصادقة لفحص الحاوية، ونقطة مفصّلة مقيَّدة بالمسؤول مع وقت التشغيل وحجم قاعدة البيانات وحالة المزوّد.
- GeoIP: شغّل نص التحديث البرمجي أسبوعيًا (db-ip Lite دون مفتاح، أو MaxMind بمفتاح مجاني)؛ والنسخة في وحدة تخزين البيانات تُلتقط عند إعادة التشغيل دون تهيئة.
- يدير المجدول يوم العمل: عينات الحضور كل خمس دقائق، وفحوص الغياب كل خمس عشرة، والتجميعات الليلية وحساب الدرجات المسبق، والملخصات والتقارير بإيقاعاتها.
docker compose up -d --build docker exec inroots sqlite3 /app/data/standup.db ".backup /tmp/backup.db" GEO_DATA_DIR=/app/data/geo scripts/update_geoip.sh
معزول تمامًا
مع خادم Matrix مستضاف ذاتيًا، وOllama مزوّدًا، وقاعدة بيانات IP محلية على المضيف، والردود المنطوقة معطّلة، ودون تفعيل أي تكاملات، لا يحتاج المنتج إلى إنترنت إطلاقًا. لا قياس عن بُعد، ولا إشارة استخدام، ولا مُبلِّغ أعطال يتصل بالخارج؛ صفر بايت يغادر ما لم تضبط وجهة.