لماذا تستضيف Apache Airflow ذاتيًا على خادم VPS
Airflow هو الأداة التي تختارها فرق البيانات عندما تريد وصف أنابيبها بلغة Python صرفة: كل DAG هو ملف .py يعرّف المهام وتبعياتها وجدولتها. منظومة الـ providers هائلة (قواعد بيانات SQL، وS3، وBigQuery، وdbt، وSpark…)، والمجتمع ضخم. تفرض الخدمات المُدارة (Cloud Composer، MWAA) رسومًا مرتفعة على البيئة بالساعة؛ وباستضافة Airflow ذاتيًا على خادم VPS، تحصل على المحرّك نفسه بتكلفة خادم واحد، وتُنفَّذ DAG لديك أقرب ما يكون إلى مصادر بياناتك الداخلية. إنها أيضًا مسألة تحكّم: إصدارات الـ providers، وتبعيات Python المخصّصة، والمتغيرات والاتصالات، يبقى كل ذلك بين يديك. يعيد نشر Docker Compose الرسمي (CeleryExecutor) إنتاج بنية إنتاجية بأمانة: webserver، وscheduler، وworkers، وRedis، وPostgreSQL.
الفوائد الملموسة للاستضافة الذاتية
- DAG بلغة Python صرفة، مُدارة بالإصدارات في Git، مع تبعيات وproviders تحت السيطرة.
- منظومة ضخمة من المُشغِّلات: SQL، وسحابة، وdbt، وSpark، وHTTP، وأكثر.
- scheduler متين: cron، وتبعيات بين المهام، وbackfill وcatchup.
- workers من Celery قابلة للتوسّع لاستيعاب مئات المهام بالتوازي.
- تنفيذ قريب من قواعد بياناتك الداخلية، دون مرور عبر سحابة طرف ثالث.
- تكلفة خادم VPS بدلًا من بيئة مُدارة تُفوتَر بالساعة.
المتطلبات التقنية
Airflow هو الأداة الأكثر استهلاكًا للموارد في هذه السلسلة عند إعداد CeleryExecutor، لأنه يشغّل في آنٍ واحد webserver وscheduler وworker(s) وtriggerer وRedis وPostgreSQL. يوصي التوثيق الرسمي بما لا يقل عن 4 غيغابايت RAM، لكن لإنتاج مريح استهدف 4 vCPU و8 غيغابايت RAM؛ و16 غيغابايت إن كانت DAG لديك تُحمّل pandas أو أحجامًا كبيرة. جهّز 40 غيغابايت من القرص، وDocker وDocker Compose، ونطاقًا (airflow.yourdomain.com). يخفّف وضع LocalExecutor الحزمة (دون Celery أو Redis) ويمكن أن يعمل على 4 غيغابايت إن بقيت احتياجاتك متواضعة.
نشر Apache Airflow باستخدام Docker Compose
الحصول على ملف compose الرسمي
أنشئ /opt/airflow، ثم نزّل الملف المرجعي: curl -LfO https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml. أنشئ المجلدات الفرعية المطلوبة: mkdir -p ./dags ./logs ./plugins ./config.
ضبط الأذونات وUID
يتطلّب Airflow قيمة UID متّسقة لوحدات التخزين المُثبَّتة. ولّد ملف البيئة: echo -e "AIRFLOW_UID=$(id -u)" > .env. من دون ذلك، لن يتمكّن الـ scheduler من كتابة سجلاته وسيتعطّل عند بدء التشغيل.
تهيئة قاعدة البيانات
أطلق الترحيل وإنشاء حساب المسؤول: docker compose up airflow-init. يجهّز هذا الأمر PostgreSQL، ويطبّق عمليات الترحيل، وينشئ المستخدم الافتراضي airflow / airflow، الذي يجب تغييره لاحقًا.
تشغيل الحزمة الكاملة
أطلق جميع الخدمات: docker compose up -d. تحقّق من أن webserver وscheduler وworker وtriggerer في حالة healthy باستخدام docker compose ps. يستمع الـ webserver على المنفذ 8080.
الوكيل العكسي وHTTPS
ضع Caddy أمام الـ webserver: airflow.yourdomain.com { reverse_proxy localhost:8080 }. يحمي HTTPS الوصول إلى واجهة Airflow، التي تكشف اتصالات ومتغيرات وسجلات قد تكون حسّاسة.
إيداع DAG وتنفيذه
ضع ملف hello.py بسيطًا في ./dags (وهو DAG مع BashOperator أو PythonOperator). يكتشفه الـ scheduler خلال بضع ثوانٍ. فعّله في الواجهة، وأطلق تنفيذًا يدويًا، وافحص سجلات المهمة.
لا تضع أبدًا منطقًا ثقيلًا مباشرةً في ملف DAG: يحلّل الـ scheduler جميع ملفات .py على فترات منتظمة (min_file_process_interval)، ويؤدّي استيراد مكلف على مستوى الوحدة (module) إلى إبطاء المجدول بأكمله. أبقِ شيفرة التحليل خفيفة وأزِح العمل إلى المهام. ولإدارة تبعيات Python المخصّصة، ابنِ صورتك الخاصة المشتقّة من apache/airflow مع ملف requirements.txt بدلًا من تثبيت الحزم أثناء التشغيل: تبدأ workers لديك أسرع وتبقى قابلة لإعادة الإنتاج. أخيرًا، راقب نمو مجلد ./logs ونظّفه دوريًا.
CVE-2026-58076: ثغرة أمنية حرجة والتحديث إلى Airflow 2.10.4
CVE-2026-58076 (CVSS 9.1) ثغرة تنفيذ كود عن بُعد في مكوّن DAG serialization في Apache Airflow، تؤثر على الإصدارات السابقة لـ 2.10.4. يمكن لمهاجم مُصادق تشغيل كائن عشوائي أثناء عملية deserialization عبر حقن payload في بيانات DAG. الإصلاح متاح في Airflow 2.10.4. لتحديث نسختك من Docker Compose: عدّل التاغ في ملف docker-compose.yml إلى apache/airflow:2.10.4، ثم نفّذ docker compose pull && docker compose up -d. تحقّق من الإصدار بـ docker compose exec airflow-webserver airflow version. تتحدّث جداول migration تلقائيًا عند أول تشغيل. إن احتجت تعطيل الوصول إلى DAG serialization في انتظار التحديث، عيّن AIRFLOW__CORE__DAG_SERIALIZATION=True (مُفعَّل افتراضيًا منذ 2.1.0) واحجب الوصول إلى worker من خارج شبكة Docker.
استكشاف الأخطاء: ثلاثة أخطاء شائعة
المنفذ 8080 قيد الاستخدام: إن فشل docker compose up -d بخطأ port is already allocated، غيّر المنفذ في docker-compose.yml أو أوقف الخدمة التي تشغله (lsof -i :8080). Scheduler في حالة running دون تنفيذ DAG: تحقق من أن مجلد ./dags مُثبَّت بشكل صحيح (docker compose config | grep dags) وأن ملفات .py الخاصة بـ DAG صحيحة نحويًا (python3 -c "import dag_file"). DAG غير مرئي في الواجهة بعد إضافته: فترة فحص مجلد DAG هي 30 ثانية افتراضيًا؛ أجبر إعادة التحميل بـ docker compose restart airflow-scheduler. للملفات المعدّلة بعد التشغيل، يلتقطها الـ Scheduler تلقائيًا في دورته التالية.