[{"data":1,"prerenderedAt":180},["ShallowReactive",2],{"seo-verification":3,"blog-استبدال-github-actions-بـwoodpecker-ci-على-vps-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استبدال-github-actions-بـwoodpecker-ci-على-vps-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"category":21,"categories":26,"featuredImage":28,"bgImage":29,"posterImage":30,"relatedSolution":28,"intro":31,"sections":32,"ctaTitle":107,"ctaBody":108,"ctaButton":109,"ctaUrl":110,"relatedPosts":111},338,"استبدال-github-actions-بـwoodpecker-ci-على-vps",{"fr":12,"en":13,"ar":10,"es":14},"remplacer-github-actions-woodpecker-ci-self-hosted-vps","replace-github-actions-with-woodpecker-ci-on-a-vps","reemplazar-github-actions-con-woodpecker-ci-en-vps","استبدال ‎GitHub Actions‎ بـ‎Woodpecker CI‎ على ‎VPS","أعلن ‎GitHub‎ ثم علّق تحصيل تكاليف ‎self-hosted runners‎ على المستودعات الخاصة. انتقل إلى ‎Woodpecker CI‎ ذاتي الاستضافة: صيغة واضحة وأقل من ‎50 Mo‎ ذاكرة عشوائية.",8,1,false,"2026-09-07T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},2,"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[27],{"id":22,"name":23,"slug":24,"color":25,"icon":24},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fremplacer-github-actions-woodpecker-ci-self-hosted-vps-poster.svg","في ديسمبر 2025، أعلن ‎GitHub‎ فرض رسوم بالدقيقة على استخدام ‎self-hosted runners‎ في المستودعات الخاصة (نقاش المجتمع ‎#182089‎، 72 تصويتاً). في مواجهة ردود فعل مجتمعية واسعة، جرى تعليق هذه التسعيرة خلال 48 ساعة — وحتى 1 سبتمبر 2026، تبقى ‎self-hosted runners‎ مجانية ولم تُطبَّق الرسوم قط. غير أن التهديد حقيقي: لا شيء يمنع ‎GitHub‎ من إعادة تفعيلها. الانتقال إلى ‎Woodpecker CI‎ هو الحماية من الإعلان التالي — مع استعادة السيادة الكاملة على ‎CI\u002FCD‎. ‎Woodpecker CI‎ هو بديل مفتوح المصدر يعمل في أقل من ‎50 Mo‎ من الذاكرة العشوائية، ويتصل بـ‎Gitea‎ أو ‎Forgejo‎ عبر ‎OAuth2‎، ولا يُكلّفك سوى ‎VPS‎.",[33,37,69,72,94,97,101,104],{"type":34,"title":35,"body":36},"h2","‎GitHub‎ والتسعير: ما الذي حدث بين 2025 و2026","حتى عام 2025، كانت المستودعات الخاصة تستفيد من حصة شهرية من الدقائق المدرجة. في 16 ديسمبر 2025، أعلن ‎GitHub‎ تسعيراً بالدقيقة لاستخدام المشغّلات — بما فيها **‎self-hosted runners‎** التي تعمل على خوادمك الخاصة. نقاش ‎GitHub‎ رقم ‎#182089‎ (ديسمبر 2025، 72 تصويتاً) يلخّص القلق: كانت الفرق ستدفع لـ‎GitHub‎ لتنسيق مهمة تعمل على بنيتها التحتية الخاصة، بـ0.002 $ في الدقيقة.\n\nفي مواجهة ردود فعل مجتمعية واسعة، علّق ‎GitHub‎ هذه التسعيرة خلال 48 ساعة. حتى 1 سبتمبر 2026، تبقى ‎self-hosted runners‎ على المستودعات الخاصة مجانية — لم تُطبَّق هذه الإجراءات قط. لكن الإعلان كشف عن تبعية هيكلية: ‎GitHub‎ قادر على تغيير شروطه في أي وقت. نقل سلسلة ‎CI\u002FCD‎ بالكامل إلى مستودع ذاتي الاستضافة هو الطريقة للتحرر من هذا الغموض. ‎Woodpecker CI‎ مُصمَّم تحديداً لهذا الغرض: محرك ‎pipeline‎ خفيف، مفتوح المصدر (‎Apache 2.0‎)، يُثبَّت إلى جانب ‎Gitea‎ أو ‎Forgejo‎ ولا يعرف عدّاد دقائق.",{"type":38,"title":39,"headers":40,"rows":44},"comparison","‎GitHub Actions runners‎ مقابل ‎Woodpecker CI‎ ذاتي الاستضافة",[41,42,43],"المعيار","‎GitHub Actions‎ (مشغّلات سحابية)","‎Woodpecker CI‎ على ‎VPS‎",[45,49,53,57,61,65],[46,47,48],"التكلفة","‎0.008 $‎ \u002F دقيقة (‎Linux‎) + ‎0.002 $‎ \u002F دقيقة تنسيق على المستودعات الخاصة","مشمولة في التكلفة الثابتة لـ‎VPS‎ (ابتداءً من ‎`{{vps.start.price}}`‎)",[50,51,52],"ذاكرة محرك ‎CI‎","مشغّلات ‎GitHub‎: موارد مشتركة غير خاضعة للتحكم","خادم ‎Woodpecker‎ + وكيل: أقل من ‎50 Mo‎ مجتمعَين",[54,55,56],"السيادة","الكود والأسرار تمر عبر بنية ‎GitHub\u002FMicrosoft‎","كل شيء يبقى على ‎VPS‎ الخاص بك — لا عبور خارجي",[58,59,60],"صيغة سير العمل","‎`.github\u002Fworkflows\u002F*.yml`‎ — معيار واسع الانتشار","‎`.woodpecker.yml`‎ — صيغة خاصة، أقصر، غير متوافقة مع ‎GitHub Actions‎",[62,63,64],"متطلب المستودع","لا شيء (‎GitHub‎ يستضيف المستودع)","‎Gitea‎ أو ‎Forgejo‎ ذاتي الاستضافة",[66,67,68],"الرخصة","ملكية خاصة","‎Apache 2.0‎",{"type":34,"title":70,"body":71},"المتطلبات الأساسية قبل التثبيت","للنشر المريح لـ‎Woodpecker CI‎، تحقّق من النقاط التالية.\n\n**‎VPS‎**: نواة واحدة و1 ‎Go‎ من الذاكرة تكفي لخادم ‎Woodpecker‎ ووكيل واحد ومستودع ‎Gitea‎ أو ‎Forgejo‎ خفيف. خطّط لـ2 ‎Go‎ إذا كنت تُشغّل عدة عمليات بناء متوازية أو تُجمّع صور ‎Docker‎.\n\n**البرمجيات**: يجب تثبيت ‎Docker‎ و‎Docker Compose‎. إذا كنت تبدأ من ‎VPS‎ نظيف، يغطي دليل \u003Ca href=\"\u002Fblog\u002Fdemarrer-avec-docker-vps\">البداية مع ‎Docker‎ على ‎VPS‎\u003C\u002Fa> هذه الخطوة.\n\n**مستودع ‎git‎**: يعتمد ‎Woodpecker CI‎ على ‎OAuth2‎ للمصادقة. تحتاج إلى نسخة ‎Gitea‎ أو ‎Forgejo‎ تعمل بالفعل ومتاحة عبر ‎HTTPS‎. يتوفر دليل \u003Ca href=\"\u002Fblog\u002Fheberger-gitea\">استضافة ‎Gitea‎\u003C\u002Fa> ودليل \u003Ca href=\"\u002Fblog\u002Fheberger-forgejo\">استضافة ‎Forgejo‎\u003C\u002Fa>.\n\n**النطاق**: أعدّ نطاقاً فرعياً مخصصاً لـ‎Woodpecker‎ — مثل `ci.your-domain.com` — يشير إلى ‎IP‎ خادمك مع فتح المنفذ ‎443‎. هذا النطاق يُستخدم كـ‎WOODPECKER_HOST‎ وعنوان إعادة توجيه ‎OAuth2‎.",{"type":73,"title":74,"steps":75},"steps","تثبيت ‎Woodpecker CI‎ باستخدام ‎Docker Compose‎",[76,79,82,85,88,91],{"title":77,"body":78},"إنشاء تطبيق ‎OAuth2‎ في ‎Gitea‎","في ‎Gitea‎، انتقل إلى **الإعدادات ← التطبيقات ← إدارة تطبيقات ‎OAuth2‎**. أعطِ التطبيق اسماً (مثلاً `woodpecker`) وأدخل عنوان إعادة التوجيه: `https:\u002F\u002Fci.your-domain.com\u002Fauthorize`. دوّن **‎Client ID‎** و**‎Client Secret‎** المُولَّدَين — ستحتاجهما في الخطوة التالية.\n\nإذا كنت تستخدم ‎Forgejo‎، الإجراء مطابق: **الإعدادات ← التطبيقات ← ‎OAuth2‎**.",{"title":80,"body":81},"إنشاء ملف ‎docker-compose.yml‎","أنشئ المجلد `\u002Fopt\u002Fwoodpecker` وضع فيه ملف `docker-compose.yml` بالخدمتين — الخادم والوكيل:\n\n```yaml\nservices:\n  woodpecker-server:\n    image: woodpeckerci\u002Fwoodpecker-server:v3\n    restart: always\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - woodpecker-server-data:\u002Fvar\u002Flib\u002Fwoodpecker\u002F\n    environment:\n      - WOODPECKER_OPEN=false\n      - WOODPECKER_HOST=https:\u002F\u002Fci.your-domain.com\n      - WOODPECKER_GITEA=true\n      - WOODPECKER_GITEA_URL=https:\u002F\u002Fgit.your-domain.com\n      - WOODPECKER_GITEA_CLIENT=${WOODPECKER_GITEA_CLIENT}\n      - WOODPECKER_GITEA_SECRET=${WOODPECKER_GITEA_SECRET}\n      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}\n\n  woodpecker-agent:\n    image: woodpeckerci\u002Fwoodpecker-agent:v3\n    restart: always\n    command: agent\n    depends_on:\n      - woodpecker-server\n    volumes:\n      - woodpecker-agent-config:\u002Fetc\u002Fwoodpecker\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\n    environment:\n      - WOODPECKER_SERVER=woodpecker-server:9000\n      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}\n\nvolumes:\n  woodpecker-server-data:\n  woodpecker-agent-config:\n```\n\nالخادم يستمع داخلياً على المنفذ **‎8000‎** (واجهة الويب) و**‎9000‎** (‎gRPC‎، تواصل الوكيل). لا تكشف هذه المنافذ مباشرة: وكيل عكسي يتولى ‎TLS‎.",{"title":83,"body":84},"إنشاء ملف ‎.env‎","في `\u002Fopt\u002Fwoodpecker`، أنشئ ملف `.env` يحتوي على المتغيرات الثلاثة الحساسة:\n\n```\nWOODPECKER_GITEA_CLIENT=\u003Coauth2-client-id>\nWOODPECKER_GITEA_SECRET=\u003Coauth2-client-secret>\nWOODPECKER_AGENT_SECRET=\u003Cسلسلة-عشوائية-طويلة>\n```\n\nأنشئ `WOODPECKER_AGENT_SECRET` بـ `openssl rand -hex 32`. هذه السلسلة تُصادق الوكيل لدى الخادم — لا تشاركها.",{"title":86,"body":87},"إعداد الوكيل العكسي ‎nginx‎","ضع ‎Woodpecker‎ خلف ‎nginx‎ مع شهادة ‎Let's Encrypt‎. مثال على كتلة `server` لـ `ci.your-domain.com`:\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name ci.your-domain.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.your-domain.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.your-domain.com\u002Fprivkey.pem;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Proto https;\n    }\n}\n```\n\naحصل على الشهادة بـ `certbot certonly --nginx -d ci.your-domain.com` ثم أعد تحميل ‎nginx‎ بـ `systemctl reload nginx`.",{"title":89,"body":90},"تشغيل الحزمة","من `\u002Fopt\u002Fwoodpecker`، شغّل:\n\n```bash\ndocker compose up -d\n```\n\nتابع سجلات الخادم حتى تظهر رسالة الجاهزية:\n\n```bash\ndocker compose logs -f woodpecker-server\n```\n\nافتح `https:\u002F\u002Fci.your-domain.com` في متصفحك. تظهر صفحة تسجيل الدخول بزر **تسجيل الدخول عبر ‎Gitea‎**. انقر عليه: يطلب ‎Gitea‎ الإذن بـ‎OAuth2‎، ثم يعيد توجيهك إلى لوحة تحكم ‎Woodpecker‎.",{"title":92,"body":93},"تفعيل مستودع وتشغيل أول بناء","في لوحة تحكم ‎Woodpecker‎، انقر على **+ إضافة مستودع**. تظهر قائمة مستودعات ‎Gitea‎ الخاصة بك. اختر مشروعاً وفعّله. يُسجّل ‎Woodpecker‎ تلقائياً ‎webhook‎ في ‎Gitea‎ لتشغيل عمليات البناء عند كل `push`.\n\nادفع أول ‎commit‎ إلى هذا المستودع: إذا كان ملف `.woodpecker.yml` موجوداً في الجذر، يُشغَّل الـ‎pipeline‎ فوراً في الواجهة.",{"type":34,"title":95,"body":96},"ترحيل سير عمل ‎GitHub Actions‎ إلى ‎.woodpecker.yml‎","لـ‎Woodpecker CI‎ صيغة ‎YAML‎ خاصة به — غير متوافقة مع ‎GitHub Actions‎. الخبر الجيد: إنها أقصر. إليك ترحيل سير عمل ‎Node.js‎ كلاسيكي.\n\n**قبل — `.github\u002Fworkflows\u002Fci.yml`:**\n\n```yaml\nname: CI\non: [push, pull_request]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n      - run: npm ci\n      - run: npm test\n```\n\n**بعد — `.woodpecker.yml`:**\n\n```yaml\nsteps:\n  - name: test\n    image: node:20\n    commands:\n      - npm ci\n      - npm test\n```\n\nالاختلافات الرئيسية: يستخدم ‎Woodpecker‎ صورة ‎Docker‎ مباشرة كبيئة تنفيذ (لا حاجة لـ`setup-node`)، وكل خطوة هي حاوية منفصلة. إجراء `checkout` ضمني — يستنسخ ‎Woodpecker‎ المستودع تلقائياً في مساحة العمل المشتركة بين الخطوات.",{"type":98,"title":99,"body":100},"tip","أسرار الـ‎pipeline‎ ومتغير ‎WOODPECKER_SECRET‎","لا تضع رموز الوصول أو مفاتيح ‎SSH‎ أو كلمات المرور في ملف `.woodpecker.yml` المُدار بالإصدار. تُدير ‎Woodpecker‎ الأسرار على مستوى المستودع أو المؤسسة: في لوحة التحكم، افتح المستودع ← **الإعدادات ← الأسرار ← إضافة سر**. كل سر يُحقَن كمتغير بيئة وقت البناء.\n\nلاستخدام سر في الـ‎pipeline‎:\n\n```yaml\nsteps:\n  - name: deploy\n    image: alpine\n    environment:\n      SSH_DEPLOY_KEY:\n        from_secret: ssh_deploy_key\n    commands:\n      - echo \"$SSH_DEPLOY_KEY\" > \u002Ftmp\u002Fid_rsa\n      - chmod 600 \u002Ftmp\u002Fid_rsa\n      - ssh -i \u002Ftmp\u002Fid_rsa deploy@your-domain.com .\u002Fdeploy.sh\n```\n\nصيغة `from_secret` تستخرج القيمة من خزنة ‎Woodpecker‎ دون كتابتها في السجلات أو ملف ‎YAML‎.",{"type":34,"title":102,"body":103},"استكشاف الأخطاء الشائعة","**الوكيل لا يظهر في لوحة التحكم.** تحقّق من أن `WOODPECKER_AGENT_SECRET` متطابق في كلتا الخدمتين في `docker-compose.yml`. إذا عدّلت `.env` بعد الإطلاق الأول، أعد التشغيل بـ `docker compose down && docker compose up -d`.\n\n**تسجيل الدخول عبر ‎OAuth2‎ يفشل.** يجب أن يطابق عنوان إعادة التوجيه المسجّل في ‎Gitea‎ تماماً `https:\u002F\u002Fci.your-domain.com\u002Fauthorize`. شرطة مائلة إضافية أو خطأ إملائي أو ‎HTTP‎ بدلاً من ‎HTTPS‎ يكفي لإيقاف تدفق ‎OAuth2‎. تحقّق أيضاً من أن `WOODPECKER_GITEA_URL` يشير إلى عنوان ‎URL‎ **العام** لـ‎Gitea‎.\n\n**الـ‎webhook‎ لا يُشغَّل.** افتح المستودع في ‎Gitea‎ ← **الإعدادات ← ‎Webhooks‎** وتحقّق من وجود ‎webhook‎ ‎Woodpecker‎ وخلوّ عمليات التسليم الأخيرة من أخطاء ‎4xx‎.\n\n**البناء يفشل بسبب نفاد الذاكرة.** يستهلك خادم ‎Woodpecker‎ والوكيل أقل من ‎50 Mo‎ في وضع الخمول — لكن كل خطوة بناء تُطلق حاوية ‎Docker‎ إضافية. على ‎VPS‎ بـ1 ‎Go‎، قيّد عمليات البناء المتزامنة بإضافة `WOODPECKER_MAX_PROCS=2` إلى بيئة خدمة `woodpecker-agent`.",{"type":34,"title":105,"body":106},"للمزيد من التعمق","بمجرد أن يعمل الـ‎pipeline‎ الأساسي، تستحق عدة تحسينات الاستكشاف.\n\n**مشغّلات متعددة.** أضف خدمة `woodpecker-agent` ثانية إلى `docker-compose.yml` (نفس الصورة، نفس `WOODPECKER_AGENT_SECRET`) لتوازي عمليات البناء.\n\n**ذاكرة تخزين مؤقت ‎Docker‎ بين عمليات البناء.** ثبّت حجم ‎Docker‎ في الوكيل وفعّل التخزين المؤقت لطبقات ‎Docker‎ لتجنب إعادة تنزيل الصور عند كل بناء.\n\n**الإشعارات.** يدعم ‎Woodpecker‎ إشعارات قنوات المراسلة عند كل بناء — ‎Matrix‎ و‎Slack‎ و‎Telegram‎ و‎Mattermost‎.\n\n**‎pipeline‎ شرطي.** تتيح صيغة ‎Woodpecker‎ تقييد خطوة على فرع أو حدث محدد:\n\n```yaml\nsteps:\n  - name: deploy\n    image: alpine\n    when:\n      branch: main\n      event: push\n    commands:\n      - .\u002Fdeploy.sh\n```\n\nللتعمق في إعداد الـ‎pipelines‎، يُفصّل دليل \u003Ca href=\"\u002Fblog\u002Fwoodpecker-ci-pipeline-vps-forgejo\">‎Woodpecker CI‎ و‎Forgejo‎: ‎pipeline CI\u002FCD‎ على ‎VPS‎\u003C\u002Fa> الخطوات المتقدمة.","‎VPS ServOrbit‎ لخطوط ‎CI\u002FCD‎ الخاصة بك","خطة `{{vps.start.name}}` بسعر `{{vps.start.price}}` — نواة واحدة، 1 ‎Go‎ ذاكرة، ‎IP‎ ثابتة — تكفي لتشغيل ‎Woodpecker CI‎ ووكيل ومستودع ‎Gitea‎ معاً، بلا عدّاد دقائق.","عرض خطط ‎VPS Cloud‎","\u002Fvps-cloud",[112,127,145,165],{"id":113,"slug":114,"slugs":115,"title":119,"excerpt":120,"readTime":121,"views":18,"isPinned":19,"publishedAt":122,"category":123,"categories":124,"featuredImage":28,"bgImage":29,"posterImage":126,"relatedSolution":28},212,"woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps",{"fr":116,"en":117,"ar":114,"es":118},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-forgejo-pipeline-cicd-vps","Woodpecker CI وForgejo: خط أنابيب CI\u002FCD على خادم VPS","نشر Woodpecker CI v3 مع Forgejo على خادم VPS: إعداد Docker Compose، تكوين YAML، الأسرار، أجهزة التشغيل متعددة المعماريات واستكشاف أخطاء OAuth.",11,"2026-08-02T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},[125],{"id":22,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":128,"slug":129,"slugs":130,"title":134,"excerpt":135,"readTime":121,"views":136,"isPinned":19,"publishedAt":137,"category":138,"categories":139,"featuredImage":28,"bgImage":29,"posterImage":141,"relatedSolution":142},273,"gitea-وforgejo-بديل-github-actions-المدفوع-على-vps",{"fr":131,"en":132,"ar":129,"es":133},"github-actions-payant-migrer-ci-cd-gitea-forgejo-vps","migrate-cicd-to-gitea-or-forgejo-leave-github-actions","migrar-cicd-a-gitea-o-forgejo-sin-github-actions","‏Gitea وForgejo: بديل ‏GitHub Actions المدفوع على ‏VPS","‏منذ مارس 2026، بات ‏GitHub يفوتر دقائق ‏CI على المستودعات الخاصة. نقل ‏runner إلى ‏VPS مع ‏Gitea أو ‏Forgejo Actions يُلغي هذه التكلفة دون إعادة كتابة ملفات ‏YAML.",0,"2026-08-16T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},[140],{"id":22,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fgithub-actions-payant-migrer-ci-cd-gitea-forgejo-vps-poster.svg",{"categorySlug":143,"appSlug":144},"التطوير","gitea",{"id":146,"slug":147,"slugs":148,"title":152,"excerpt":153,"readTime":17,"views":136,"isPinned":19,"publishedAt":154,"category":155,"categories":161,"featuredImage":28,"bgImage":29,"posterImage":163,"relatedSolution":164},74,"استضافة-gitea-على-خادم-vps-الخاص-بك",{"fr":149,"en":150,"ar":147,"es":151},"heberger-gitea","host-gitea-on-your-own-vps","alojar-gitea-en-un-vps","استضافة Gitea على خادم VPS الخاص بك في 2026","انشُر Gitea على خادم VPS مع Docker وSSL. دليل شامل: التثبيت والهجرة إلى ‏Forgejo v16‏ ومقارنة الحوكمة.","2026-04-07T00:00:00+00:00",{"id":156,"name":157,"slug":158,"color":159,"icon":160},7,"الاستضافة الذاتية","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[162],{"id":156,"name":157,"slug":158,"color":159,"icon":160},"\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":143,"appSlug":144},{"id":166,"slug":167,"slugs":168,"title":172,"excerpt":173,"readTime":174,"views":22,"isPinned":19,"publishedAt":175,"category":176,"categories":177,"featuredImage":28,"bgImage":29,"posterImage":179,"relatedSolution":28},75,"استضافة-forgejo-على-خادم-vps-الخاص-بك",{"fr":169,"en":170,"ar":167,"es":171},"heberger-forgejo","host-forgejo-on-your-own-vps","alojar-forgejo-en-un-vps","استضافة ‎Forgejo‎ على خادم VPS: دليل شامل 2025","انشر ‎Forgejo‎ على خادم ‎VPS‎ باستخدام ‎Docker‎ و‎SSL‎ و‎Actions runners‎ مع تأمين متقدم. دليل خطوة بخطوة لإقامة مخزن ‎Git‎ مستقل.",9,"2026-04-06T00:00:00+00:00",{"id":156,"name":157,"slug":158,"color":159,"icon":160},[178],{"id":156,"name":157,"slug":158,"color":159,"icon":160},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",1789046052694]