لماذا صفحة حالة عامة
أداة المراقبة تخبر فريقك بأن خدمة متعطلة. أما صفحة الحالة فتخبر مستخدميك — وهذا ما ينقص غالبًا أثناء الحادثة: لا يعرف العملاء إن كانت المشكلة من جهتهم، فيفتحون تذاكر مكررة ويلاحقونك على الشبكات الاجتماعية.
يجمع Kener الدورين. تفحص فحوصه خدماتك على فترات منتظمة وتنشر سجل التوفر؛ وعند وقوع حادثة تضيف تحديثات يقرؤها الجميع في مكان واحد. استضافة هذه الصفحة بنفسك تغنيك عن اشتراك في خدمة صفحات حالة تُحتسب بعدد المشتركين أو الصفحات، وتُبقي بيانات المراقبة لديك.
ما يقدّمه Kener
- فحوص مدمجة — API وHTTP وping وTCP وDNS وSSL وSQL وheartbeat للمهام المجدولة.
- حوادث بتسلسل زمني — يبقى كل تحديث ظاهرًا من الاكتشاف حتى الحل.
- صيانة مجدولة — تُعلَن مسبقًا، دون تنبيه كاذب أثناء التدخل.
- اشتراكات بالبريد — يشترك الزوار في الحوادث والصيانة التي تعنيهم.
- تنبيهات الفريق — webhook وSlack وDiscord والبريد، مع قوالب للرسائل.
- بهويتك — شعار، وألوان، ووضع فاتح أو داكن، وعدة صفحات، وشارات وعناصر.
Kener وUptime Kuma وGatus
مرّر الجدول أفقيًا
| Kener | Uptime Kuma | Gatus | |
|---|---|---|---|
| الدور الأساسي | صفحة حالة مع مراقبة مدمجة | مراقبة مع صفحات حالة اختيارية | مراقبة مُعرَّفة بملف YAML |
| الإعداد | واجهة إدارة على الويب | واجهة ويب | ملف YAML |
| اشتراكات الزوار بالبريد | نعم (SMTP أو Resend) | لا | لا |
| عدة صفحات حالة | نعم | نعم | لا، لوحة واحدة |
| صيانة مجدولة | نعم | نعم | نعم، مُعرَّفة بـ YAML |
| التخزين | SQLite أو PostgreSQL أو MySQL، مع Redis | SQLite أو MariaDB | الذاكرة أو SQLite أو PostgreSQL |
المتطلبات
خادم VPS بنظام Ubuntu 24.04 وذاكرة 1 غيغابايت وقرص 10 غيغابايت، مع Docker وإضافة Compose، واسم مضيف يشير إلى الخادم — مثل status.example.com. يحتاج Kener إلى معرفة عنوانه العام: المتغير ORIGIN يحكم حمايته من الطلبات عبر المواقع، ويُرفض كل طلب من مصدر آخر. جهّز أيضًا nginx وCertbot من أجل HTTPS.
تثبيت Kener باستخدام Docker Compose
تحضير المجلد والمفتاح السري
أنشئ مجلد التطبيق وملف
.envيحمل مفتاح توقيع الجلسات والعنوان العام.mkdir -p /opt/kener && cd /opt/kener echo "SECRET_KEY=$(openssl rand -hex 32)" > .env echo "DOMAIN=status.example.com" >> .env chmod 600 .envكتابة ملف docker-compose.yml
خدمتان: Redis الذي يحمل طوابير المهام ومجدول الفحوص، وKener مع قاعدة SQLite في وحدة تخزين. المنفذ منشور على العنوان المحلي فقط: لا يصل إليه إلا nginx.
services: redis: image: redis:7.4-alpine restart: unless-stopped command: ["redis-server", "--appendonly", "yes"] volumes: - kener-redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 10 kener: image: rajnandan1/kener:4.1.10 restart: unless-stopped depends_on: redis: condition: service_healthy ports: - "127.0.0.1:3000:3000" environment: KENER_SECRET_KEY: ${SECRET_KEY} ORIGIN: https://${DOMAIN} REDIS_URL: redis://redis:6379 DATABASE_URL: sqlite://./database/kener.sqlite.db volumes: - kener-data:/app/database volumes: kener-data: {} kener-redis: {}التشغيل والتحقق
شغّل الحزمة ثم استعلم عن نقطة الصحة: تستجيب فور جاهزية التطبيق، عادة خلال خمس عشرة ثانية تقريبًا.
docker compose up -d docker compose ps curl -fsS http://127.0.0.1:3000/healthcheckالنشر عبر HTTPS مع nginx
أنشئ مضيفًا افتراضيًا يمرر الطلبات إلى Kener، ثم احصل على الشهادة بالأمر
certbot --nginx -d status.example.com.server { listen 443 ssl http2; server_name status.example.com; # ssl_certificate / ssl_certificate_key: added by Certbot location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
أنشئ حساب المسؤول دون تأخير
لا ينشئ Kener أي حساب مسبقًا: أول زائر لـ /account/signin يرى نموذج Create Admin Account ويصبح المسؤول. افتح هذه الصفحة فور عمل HTTPS وأنشئ حسابك بكلمة مرور قوية. بعدها يختفي النموذج ويُرفض أي إنشاء جديد.
إنشاء الفحوص الأولى
في لوحة الإدارة، كل مراقب يقابل سطرًا في الصفحة العامة. ابدأ بثلاثة فحوص: فحص API على الصفحة الرئيسية لتطبيقك أو نقطة صحته (رمز HTTP المتوقع والمهلة القصوى)، وفحص SSL ينبّه قبل أيام من انتهاء الشهادة، وفحص TCP على منفذ قاعدة بياناتك إن كان متاحًا من الخادم.
للمهمة المجدولة — نسخ احتياطي أو تصدير أو مزامنة — استخدم فحص heartbeat: المهمة هي التي تستدعي Kener عند انتهائها، وغياب الإشارة في الموعد يُطلق العطل.
# at the end of your backup script
curl -fsS -m 10 https://status.example.com/ext/heartbeat/nightly-backup/YOUR_SECRETجمّع المراقبين حسب الخدمة (الموقع، الواجهة البرمجية، الدفع) لتبقى الصفحة مقروءة، وأخفِ ما يخص الفريق وحده.
إعلان حادثة وجدولة صيانة
تُنشأ الحادثة من لوحة الإدارة: عنوان، والمراقبون المتأثرون، والخطورة، ثم تحديثات متتالية — «قيد التحقيق»، «تم تحديد السبب»، «تم الحل». يبقى كل تحديث ظاهرًا في التسلسل الزمني، وهذا أفضل من رسالة واحدة تُعدَّل باستمرار.
تُجدوَل الصيانة مسبقًا بنافذة بداية ونهاية. تظهر على الصفحة قبل التدخل، ولا يحتسب المراقبون المعنيون الانقطاع عطلًا.
إبلاغ فريقك ومستخدميك
قناتان منفصلتان. للفريق، تنطلق التنبيهات بحسب حالة المراقب وتُرسل إلى webhook أو Slack أو Discord أو بريد، مع قوالب رسائل قابلة للضبط. وللزوار، ترسل الاشتراكات الحوادث والصيانة بالبريد بعد تأكيد العنوان برمز.
كلاهما يتطلب ضبط إرسال البريد: أضف إلى بيئة الخدمة kener المتغيرات SMTP_HOST وSMTP_PORT وSMTP_USER وSMTP_PASSWORD وSMTP_SENDER، أو RESEND_API_KEY وRESEND_SENDER_EMAIL، ثم أعد التشغيل بـ docker compose up -d. بعد ذلك فعّل الاشتراكات في لوحة الإدارة.
النسخ الاحتياطي والتحديث
يعيش كل الإعداد والسجل في قاعدة SQLite ضمن وحدة التخزين kener-data؛ أما Redis فلا يحمل سوى الطوابير والذاكرة المؤقتة. انسخ وحدة التخزين بعد إيقاف قصير للخدمة للحصول على نسخة متسقة:
cd /opt/kener
docker compose stop kener
docker run --rm -v kener_kener-data:/data -v "$PWD":/backup alpine \
tar czf /backup/kener-$(date +%F).tar.gz -C /data .
docker compose start kenerللتحديث، اقرأ ملاحظات الإصدار في صفحة إصدارات المستودع، وغيّر وسم الصورة في docker-compose.yml، ثم شغّل docker compose pull && docker compose up -d. تحدّث الحاوية قاعدتها عند الإقلاع: خذ النسخة الاحتياطية قبل ذلك.
التثبيت بنقرة واحدة من متجر ServOrbit
على خادم VPS من ServOrbit، يُثبَّت Kener من المتجر في مساحة العميل: اختر العنوان — نطاقًا فرعيًا من أحد نطاقاتك أو النطاق الفرعي المجاني للخادم، مع HTTPS — وانقر «تثبيت». ينشر السكربت Kener وRedis، ويولّد المفتاح السري، ويضبط العنوان العام وnginx. لا يبقى إلا فتح /account/signin لإنشاء حساب المسؤول، ثم إضافة فحوصك.