[{"data":1,"prerenderedAt":193},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-questdb-على-vps-قاعدة-سلاسل-زمنية-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-questdb-على-vps-قاعدة-سلاسل-زمنية-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":20,"publishedAt":21,"updatedAt":22,"category":23,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":130,"ctaBody":131,"ctaButton":132,"ctaUrl":133,"relatedPosts":134},568,"استضافة-questdb-على-vps-قاعدة-سلاسل-زمنية",{"fr":12,"en":13,"ar":10,"es":14},"self-host-questdb-vps","self-host-questdb-vps-time-series-database","autoalojar-questdb-vps-base-series-temporales","QuestDB على خادم VPS: قاعدة سلاسل زمنية بلغة SQL","ثبّت QuestDB على خادم VPS: قاعدة بيانات مفتوحة المصدر للسلاسل الزمنية، باستيعاب سريع واستعلامات SQL وواجهة ويب وواجهة REST.",7,0,false,true,"2026-11-06T00:00:00+00:00","2026-11-08T01:13:02+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},"الاستضافة الذاتية","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":17,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-questdb-vps-poster.svg",{"categorySlug":34,"appSlug":35},"قواعد-البيانات","questdb","القياسات المؤرَّخة تأتي من كل مكان: الحساسات، وأزمنة استجابة واجهة برمجية، وأسعار الأسواق، وأحداث التطبيقات. تخزينها في قاعدة علائقية تقليدية ينجح في البداية، ثم تكبر الجداول ويصبح التجميع لكل ساعة بطيئًا. QuestDB قاعدة بيانات مفتوحة المصدر للسلاسل الزمنية (رخصة Apache-2.0) صُممت لهذه الحالة بالضبط: تستقبل البيانات بشكل متواصل وتجعلها قابلة للاستعلام فورًا بلغة SQL. يثبّتها هذا الدليل على خادم افتراضي باستخدام Docker Compose، ويحميها بكلمة مرور، ويرسل إليها بيانات من curl وPython، ثم يتناول الاستعلام واستيراد CSV والاحتفاظ بالبيانات والنسخ الاحتياطي.",[38,42,52,83,86,102,106,109,112,115,118,121,124,127],{"type":39,"title":40,"body":41},"h2","لماذا قاعدة بيانات للسلاسل الزمنية","السلسلة الزمنية تتابع من القيم المؤرَّخة: حرارة مجس كل عشر ثوانٍ، أو عدد الطلبات في الدقيقة. تُكتب كثيرًا ونادرًا ما تُعدَّل، ويُستعلم عنها دائمًا تقريبًا حسب فترة زمنية.\n\nبُنيت QuestDB حول هذا الاستخدام. لكل جدول عمود زمني محدد، ويُقسَّم إلى أقسام (حسب اليوم أو الساعة)، ما يُبقي الاستعلامات على فترة ما سريعة ويجعل حذف البيانات القديمة فوريًا. وتبقى لغتها SQL، مع بعض الكلمات المفتاحية الخاصة بالزمن.",{"type":43,"title":44,"items":45},"ul","ما تقدّمه QuestDB",[46,47,48,49,50,51],"**SQL للسلاسل الزمنية** — `SAMPLE BY` و`LATEST ON` و`ASOF JOIN` إضافةً إلى SQL القياسية.","**استيعاب متواصل** — InfluxDB Line Protocol فوق HTTP، مع عملاء رسمية لـ Python وGo وJava وNode.js وRust و‎.NET.","**واجهة ويب** — محرر SQL، واستيراد CSV بالسحب والإفلات، ورسوم بيانية للنتائج.","**واجهة REST** — استعلامات واستيراد وتصدير CSV عبر HTTP.","**بروتوكول PostgreSQL** — مشغّلات وأدوات PostgreSQL المعتادة لديك.","**أقسام زمنية** — استعلامات سريعة على فترة، وحذف البيانات القديمة بأمر واحد.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","QuestDB مقارنةً بجدول PostgreSQL تقليدي",[5,56,57],"QuestDB","PostgreSQL وحده",[59,63,67,71,75,79],[60,61,62],"مصممة لـ","قياسات مؤرَّخة متواصلة","بيانات علائقية عامة",[64,65,66],"التجميع حسب الفترة","SAMPLE BY 1h","date_trunc وGROUP BY",[68,69,70],"آخر قيمة لكل سلسلة","LATEST ON","استعلام فرعي أو DISTINCT ON",[72,73,74],"محاذاة تدفقين زمنيًا","ASOF JOIN","ربط جانبي يجب كتابته",[76,77,78],"حذف السجل القديم","DROP PARTITION","DELETE ثم VACUUM",[80,81,82],"الاستيعاب","Line Protocol وCSV وSQL","SQL وCOPY",{"type":39,"title":84,"body":85},"المتطلبات المسبقة","خادم افتراضي بنظام Ubuntu 24.04 بذاكرة 2 غيغابايت على الأقل وقرص 20 غيغابايت، مع تثبيت Docker وإضافة Compose، واسم (نطاق فرعي) يشير إلى الخادم من أجل HTTPS. تعمل QuestDB على JVM: خطّط لذاكرة 4 غيغابايت إذا كنت تستوعب بيانات كثيرة أو تنفّذ استعلامات ثقيلة.",{"type":87,"title":88,"steps":89},"steps","تثبيت QuestDB باستخدام Docker Compose",[90,93,96,99],{"title":91,"body":92},"تجهيز المجلد وكلمة المرور","أنشئ مجلد التطبيق وملف `.env` يحمل كلمة مرور المستخدم `admin`.\n```bash\nmkdir -p \u002Fopt\u002Fquestdb && cd \u002Fopt\u002Fquestdb\necho \"ADMIN_PASSWORD=$(openssl rand -hex 16)\" > .env\nchmod 600 .env\n```",{"title":94,"body":95},"كتابة ملف docker-compose.yml","لا تُنشر المنافذ إلا على واجهة loopback: وحده nginx يصل إلى الواجهة وواجهة البرمجة. يحمي `QDB_HTTP_USER` و`QDB_HTTP_PASSWORD` واجهة HTTP كاملة، ويستبدل `QDB_PG_PASSWORD` كلمة مرور المصنع لبروتوكول PostgreSQL. يُوقَف الاستيعاب عبر TCP، لأنه بلا مصادقة في النسخة مفتوحة المصدر، ويعطّل `QDB_TELEMETRY_ENABLED` القياس عن بُعد المجهول.\n```yaml\nservices:\n  questdb:\n    image: questdb\u002Fquestdb:10.1.0\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:9000:9000\"\n      - \"127.0.0.1:8812:8812\"\n    environment:\n      QDB_HTTP_USER: \"admin\"\n      QDB_HTTP_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_PG_USER: \"admin\"\n      QDB_PG_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_LINE_TCP_ENABLED: \"false\"\n      QDB_HTTP_SETTINGS_READONLY: \"true\"\n      QDB_TELEMETRY_ENABLED: \"false\"\n    volumes:\n      - questdb-data:\u002Fvar\u002Flib\u002Fquestdb\n\nvolumes:\n  questdb-data: {}\n```",{"title":97,"body":98},"التشغيل والتحقق","يستغرق التشغيل بضع ثوانٍ. بدون بيانات اعتماد تجيب الواجهة بالرمز 401، ومعها تعيد الإصدار المثبّت.\n```bash\ndocker compose up -d\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%201'\ncurl -u admin:VOTRE_MOT_DE_PASSE 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%20build()'\n```",{"title":100,"body":101},"النشر عبر HTTPS باستخدام nginx","في المضيف الافتراضي لنطاقك (بشهادة من certbot)، وجّه الطلبات إلى المنفذ المحلي. ارفع قيمة `client_max_body_size` من أجل استيراد ملفات CSV.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:9000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    client_max_body_size 256m;\n}\n```",{"type":103,"title":104,"body":105},"tip","بدون QDB_HTTP_USER تكون الواجهة مفتوحة للجميع","عند عدم تعريف مستخدم، تقبل QuestDB كل طلب HTTP: يستطيع أي شخص يعرف العنوان قراءة بياناتك **و**إنشاء الجداول أو تعديلها أو حذفها بلغة SQL. أبقِ المصادقة مفعّلة، وغيّر كلمة مرور المصنع لبروتوكول PostgreSQL، ولا تنشر أبدًا المنافذ 9000 أو 8812 أو 9009 مباشرة على عنوان IP العام: مرّ دائمًا عبر الوكيل العكسي HTTPS.",{"type":39,"title":107,"body":108},"إرسال البيانات","أبسط طريقة هي InfluxDB Line Protocol فوق HTTP: سطر لكل قياس، يحمل اسم الجدول والوسوم والقيم. يُنشأ الجدول وأعمدته مع أول كتابة.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -X POST \\\n  --data-binary 'capteurs,sonde=s1 temperature=21.5' \\\n  https:\u002F\u002Fvotre-domaine\u002Fwrite\n```\n\nومن شيفرتك، يجمّع العميل الرسمي الأسطر ويتولّى إعادة المحاولة. في Python، بعد `pip install questdb`:\n```python\nfrom questdb.ingress import Sender, TimestampNanos\n\nconf = \"https::addr=votre-domaine:443;username=admin;password=VOTRE_MOT_DE_PASSE;\"\nwith Sender.from_conf(conf) as sender:\n    sender.row(\n        \"capteurs\",\n        symbols={\"sonde\": \"s1\"},\n        columns={\"temperature\": 21.5},\n        at=TimestampNanos.now(),\n    )\n```",{"type":39,"title":110,"body":111},"الاستعلام عن سلاسلك بلغة SQL","في واجهة الويب أو عبر واجهة REST (`\u002Fexec?query=…`)، تعمل SQL القياسية، وتغنيك امتدادات الزمن عن الاستعلامات المعقدة.\n```sql\n-- Moyenne horaire par sonde\nSELECT timestamp, sonde, avg(temperature)\nFROM capteurs\nSAMPLE BY 1h;\n\n-- Dernière valeur connue de chaque sonde\nSELECT * FROM capteurs LATEST ON timestamp PARTITION BY sonde;\n```\n\nويمكن لبرنامج يعمل على الخادم نفسه الاتصال أيضًا عبر بروتوكول PostgreSQL على `127.0.0.1:8812`، بقاعدة `qdb` والمستخدم `admin` وكلمة المرور نفسها.",{"type":39,"title":113,"body":114},"تصميم جدول السلاسل الزمنية بشكل صحيح","يكفي الإنشاء التلقائي مع أول كتابة للبدء. أما الجدول المعدّ للبقاء طويلًا فعرّفه بنفسك: تختار الأنواع والعمود الزمني وطريقة التقسيم.\n```sql\nCREATE TABLE capteurs (\n  timestamp TIMESTAMP,\n  sonde SYMBOL,\n  temperature DOUBLE\n) TIMESTAMP(timestamp) PARTITION BY DAY WAL\nDEDUP UPSERT KEYS(timestamp, sonde);\n```\n\nثلاثة اختيارات مهمة. **العمود الزمني المحدد** (`TIMESTAMP(...)`) هو الذي ترتّب QuestDB البيانات وتقسّمها وفقه: تعتمد عليه كل امتدادات الزمن. **النوع `SYMBOL`** يناسب الوسوم المتكررة (اسم المجس، رمز الجهاز، رمز السهم): تُخزَّن القيمة مرة واحدة ويُشار إليها، ما يوفّر القرص ويسرّع التصفية. **التقسيم** (`PARTITION BY DAY` أو `HOUR`) يُختار حسب الحجم: يجب أن يبقى القسم بحجم معقول، وهو الوحدة التي ستحذفها لاحقًا.\n\nتجعل العبارة `DEDUP UPSERT KEYS` الاستيعاب متساوي الأثر: إذا أعاد عميل إرسال القياس نفسه بعد انقطاع الشبكة، يُستبدل السطر بدل أن يتكرر.",{"type":39,"title":116,"body":117},"استيراد ملفات CSV وتصديرها","تقبل الواجهة ملفات CSV بالسحب والإفلات. ومن سطر الأوامر، يستورد `\u002Fimp` ملفًا إلى جدول ويصدّر `\u002Fexp` نتيجة استعلام.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -F data=@mesures.csv 'https:\u002F\u002Fvotre-domaine\u002Fimp?name=mesures'\ncurl -u admin:VOTRE_MOT_DE_PASSE -G --data-urlencode 'query=SELECT * FROM mesures' https:\u002F\u002Fvotre-domaine\u002Fexp > export.csv\n```",{"type":39,"title":119,"body":120},"الاحتفاظ بالبيانات والقرص والنسخ الاحتياطي","لا شيء ينتهي من تلقاء نفسه. احذف الأقسام القديمة بلغة SQL وجدول الأمر عند الحاجة. وللحصول على نسخة احتياطية متسقة، جمّد حالة القاعدة أثناء نسخ وحدة التخزين `questdb-data`.\n```sql\nALTER TABLE capteurs DROP PARTITION\nWHERE timestamp \u003C dateadd('d', -90, now());\n\nCHECKPOINT CREATE;\n-- copiez le volume questdb-data, puis :\nCHECKPOINT RELEASE;\n```",{"type":39,"title":122,"body":123},"تحديث QuestDB","اقرأ ملاحظات الإصدار قبل الانتقال إلى إصدار رئيسي جديد، ثم استبدل وسم الصورة وأعد التشغيل: تبقى البيانات في وحدة التخزين محفوظة.\n```bash\ncd \u002Fopt\u002Fquestdb\n# changez le tag de l'image dans docker-compose.yml, puis :\ndocker compose pull && docker compose up -d\n```",{"type":39,"title":125,"body":126},"الأخطاء الشائعة وحلّها","**الرمز 401 على كل طلب.** المستخدم أو كلمة المرور لا يطابقان `QDB_HTTP_USER` و`QDB_HTTP_PASSWORD`. تحقّق من ملف `.env` ثم أعد تشغيل الحاوية بعد أي تعديل: لا تُقرأ المتغيرات إلا عند التشغيل.\n\n**الرمز 413 أثناء استيراد CSV.** يتجاوز الملف حدّ nginx. ارفع `client_max_body_size` في المضيف الافتراضي وأعد تحميل nginx، أو قسّم الملف.\n\n**الحاوية تعيد التشغيل باستمرار.** اقرأ `docker compose logs questdb`. السبب الأكثر شيوعًا هو الذاكرة: تعمل QuestDB على JVM ولا يكفي خادم بذاكرة 1 غيغابايت. انتقل إلى 2 غيغابايت على الأقل.\n\n**القرص يمتلئ.** لا شيء ينتهي افتراضيًا: جدول حذف الأقسام القديمة وراقب حجم وحدة التخزين `questdb-data` بالأمر `docker system df -v`.\n\n**تطبيق على الخادم لا يتصل عبر PostgreSQL.** استخدم `127.0.0.1:8812` والقاعدة `qdb` والمستخدم `admin` وكلمة المرور من `.env`: كلمة مرور المصنع `quest` مرفوضة.",{"type":39,"title":128,"body":129},"تثبيت بنقرة واحدة من متجر ServOrbit","على خادم ServOrbit، يُثبَّت QuestDB من المتجر: ينشر السكربت الحاوية الرسمية، ويولّد كلمة مرور المستخدم `admin`، ويفعّل المصادقة على واجهة HTTP وبروتوكول PostgreSQL، ويوقف القياس عن بُعد، ويضبط nginx عبر HTTPS، على نطاق فرعي من نطاقك أو على النطاق الفرعي المجاني للخادم. تظهر كلمة المرور في مساحة العميل.","سلاسلك الزمنية على خادمك الخاص","يكفي خادم ServOrbit بنظام Ubuntu 24.04 وذاكرة 2 غيغابايت لتشغيل QuestDB. تثبيت بنقرة واحدة من المتجر، وHTTPS على نطاقك أو على النطاق الفرعي المجاني للخادم، وكلمة مرور مولّدة لك.","تثبيت QuestDB","\u002Fapplications\u002Fقواعد-البيانات\u002Fquestdb",[135,158,175],{"id":136,"slug":137,"slugs":138,"title":142,"excerpt":143,"readTime":144,"views":18,"isPinned":19,"noindex":19,"publishedAt":145,"updatedAt":146,"category":147,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":156},64,"استضافة-clickhouse-على-خادم-vps",{"fr":139,"en":140,"ar":137,"es":141},"heberger-clickhouse-vps","hosting-clickhouse-on-a-vps","alojar-clickhouse-en-un-vps","استضافة ClickHouse على خادم VPS","استضِف ClickHouse على خادم VPS الخاص بك: قاعدة بيانات تحليلية عمودية لسجلّاتك ومقاييسك ولوحات المعلومات. دليل Docker وضبط الذاكرة وSSL.",9,"2026-04-17T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},6,"قواعد البيانات","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[154],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fheberger-clickhouse-vps-poster.svg",{"categorySlug":34,"appSlug":157},"clickhouse",{"id":159,"slug":160,"slugs":161,"title":165,"excerpt":166,"readTime":148,"views":18,"isPinned":19,"noindex":20,"publishedAt":167,"updatedAt":168,"category":169,"categories":170,"featuredImage":30,"bgImage":31,"posterImage":172,"relatedSolution":173},565,"استضافة-greptimedb-على-vps-قاعدة-بيانات-المراقبة",{"fr":162,"en":163,"ar":160,"es":164},"self-host-greptimedb-vps","self-host-greptimedb-vps-observability-sql","autoalojar-greptimedb-vps-observabilidad-sql","GreptimeDB على VPS: المقاييس والسجلات والتتبعات بلغة SQL","ثبّت GreptimeDB على خادم VPS: قاعدة بيانات للمراقبة تجمع المقاييس والسجلات والتتبعات، قابلة للاستعلام بلغة SQL وPromQL ومن Grafana.","2026-11-04T00:00:00+00:00","2026-11-04T16:30:20+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},[171],{"id":17,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-greptimedb-vps-poster.svg",{"categorySlug":34,"appSlug":174},"greptimedb",{"id":176,"slug":177,"slugs":178,"title":182,"excerpt":183,"readTime":144,"views":184,"isPinned":19,"noindex":19,"publishedAt":185,"updatedAt":186,"category":187,"categories":188,"featuredImage":30,"bgImage":31,"posterImage":190,"relatedSolution":191},56,"postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها",{"fr":179,"en":180,"ar":177,"es":181},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","alojar-postgresql-en-un-vps","‎PostgreSQL على خادم VPS: قاعدة بيانات موثوقة ومتحكَّم بها","‎استضف PostgreSQL على VPS: إعداد الإنتاج، نسخ pgBackRest، HA بالبث، مقارنة RDS\u002FSupabase\u002FNeon واستكشاف أخطاء OOM.",1,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},[189],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":192},"postgresql-stack",1794100741970]