[{"data":1,"prerenderedAt":158},["ShallowReactive",2],{"seo-verification":3,"blog-نشر-تطبيق-go-gin-على-خادم-vps-ma-ar":6,"promo-bar-likely":157},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-نشر-تطبيق-go-gin-على-خادم-vps-ma-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":100,"ctaBody":101,"ctaButton":102,"ctaUrl":103,"relatedPosts":104},51,"نشر-تطبيق-go-gin-على-خادم-vps",{"fr":12,"en":13,"ar":10,"es":14},"deployer-golang-vps","deploying-a-go-gin-application-on-a-vps","desplegar-aplicacion-go-gin-en-un-vps","نشر تطبيق Go (Gin) على خادم VPS","انشر واجهة Go (Gin) على خادم VPS Cloud: ملفّ ثنائي ساكن، وDocker scratch، ووكيل عكسي، وSSL. درس تعليمي لمطوّري Go.",8,1,false,"2026-04-30T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"التطوير","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-golang-vps-poster.svg",{"categorySlug":24,"appSlug":34},"golang","تُصرّف لغة Go إلى ملفّ ثنائي ساكن واحد دون تبعيات: إنّها اللغة المثالية للاستضافة الذاتية. تتّسع واجهة Gin في 15 إلى 30 ميجابايت من الذاكرة وتبدأ في مللي ثوانٍ. يأخذك هذا الدليل من الصفر إلى بيئة إنتاج متكاملة: ‎Dockerfile متعدّد المراحل بصورة ‎`scratch`، وDocker Compose مع Nginx وCertbot، وإعادة التحميل الفوري في التطوير عبر ‎`air`، وإدارة الأسرار، وتصحيح أكثر الأخطاء شيوعًا.",[37,41,51,54,57,82,85,88,91,94,97],{"type":38,"title":39,"body":40},"h2","لماذا الاستضافة الذاتية لواجهة Go على خادم VPS","على خلاف Java أو Node، يُصرَّف تطبيق Go (مع إطار العمل Gin) إلى ملفّ ثنائي ساكن واحد لا يحتاج إلى مفسّر ولا إلى بيئة تشغيل ولا إلى مكتبة مشتركة. يمكنك حرفيًا وضع الملفّ الثنائي على خادم VPS وتشغيله. تغيّر هذه الخفّة كلّ شيء بالنسبة للاستضافة الذاتية: تعمل واجهة Gin في 15 إلى 30 ميجابايت من الذاكرة وتبدأ في بضع مللي ثوانٍ. على خادم VPS، تستغلّ هذه الكفاءة إلى أقصى حدّ. كما تتجنّب تعقيد صور Docker الضخمة: تكفي صورة ‎`scratch` بحجم 10 ميجابايت، وعمليات البناء والسحب شبه فورية.",{"type":42,"title":43,"items":44},"ul","الفوائد الملموسة",[45,46,47,48,49,50],"ملفّ ثنائي ساكن واحد: لا بيئة تشغيل لتثبيتها، والنشر بمجرّد نسخ ملفّ","بصمة ذاكرية ضئيلة (15-30 ميجابايت) تتيح إغراق خادم VPS صغير بالطلبات","صورة Docker باسم ‎`scratch` أو ‎`distroless` بحجم 10-15 ميجابايت: عمليات بناء وسحب شبه فورية","بدء التشغيل في مللي ثوانٍ: عمليات إعادة نشر وإعادة تشغيل دون انقطاع ملحوظ","تزامن أصلي عبر goroutines: معالج افتراضي واحد يدير آلاف الاتصالات المتزامنة","سطح هجوم مُقلّص: لا مفسّر ولا حزم نظام لترقيعها",{"type":38,"title":52,"body":53},"المتطلّبات العتادية والبرمجية","هنا تتألّق Go: تتّسع واجهة Gin دون قاعدة بيانات على خادم VPS بمعالج افتراضي واحد (1 vCPU) و1 جيجابايت من الذاكرة. ومع PostgreSQL في الموقع نفسه، استهدف 2 جيجابايت للراحة. لست بحاجة حتى إلى Go على الخادم إذا صرّفت في CI أو بالتصريف المتقاطع محليًا (‎`GOOS=linux GOARCH=amd64 go build`). ثبّت Docker وDocker Compose على الخادم. وجّه نطاق ‎`api.mondomaine.com` نحو عنوان IP الخاص بخادم VPS عبر سجلّ A. تكفي 5 جيجابايت من القرص بسهولة. على جهازك، يُنصح باستخدام ‎Go 1.27 أو أحدث — من go.dev\u002Fdl.",{"type":38,"title":55,"body":56},"‏Dockerfile متعدّد المراحل بصورة scratch","‏Dockerfile متعدّد المراحل هو مفتاح الصورة النهائية المصغّرة. المرحلة الأولى تصرّف الملفّ الثنائي داخل حاوية Go كاملة؛ والثانية تنسخه إلى صورة ‎`scratch` فارغة — لا shell، ولا نظام تشغيل، فقط ملفّك الثنائي وشهادات CA لاتصالات HTTPS الصادرة. مثال كامل لمشروع Gin:\n\n```\nFROM golang:1.27-alpine AS build\nWORKDIR \u002Fapp\nCOPY go.mod go.sum .\u002F\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=\"-s -w\" -o server .\n\nFROM scratch\nCOPY --from=build \u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt \u002Fetc\u002Fssl\u002Fcerts\u002F\nCOPY --from=build \u002Fapp\u002Fserver \u002Fserver\nEXPOSE 8080\nENTRYPOINT [\"\u002Fserver\"]\n```\n\nالراية ‎`CGO_ENABLED=0` تفرض ملفًّا ثنائيًا ساكنًا بنسبة 100%، ضروري لعمل ‎`FROM scratch`. وتقلّص راية ‎`-ldflags=\"-s -w\"` حجم الملفّ الثنائي بنحو 30% بحذف جداول التنقيح. أمّا نسخ شهادات CA فضروريّ متى كانت واجهتك تتصل بخدمات HTTPS خارجية (Stripe، SendGrid...). إذا احتجت shell للتنقيح، استبدل ‎`FROM scratch` بـ ‎`FROM gcr.io\u002Fdistroless\u002Fstatic-debian12`.",{"type":58,"title":59,"steps":60},"steps","Docker Compose للإنتاج مع Nginx وCertbot",[61,64,67,70,73,76,79],{"title":62,"body":63},"إنشاء هيكل الملفّات على الخادم","اتصل عبر SSH وأنشئ مجلّد المشروع: ‎`mkdir -p \u002Fopt\u002Fmyapp\u002F{nginx\u002Fconf.d,certbot\u002Fwww,certbot\u002Fconf} && cd \u002Fopt\u002Fmyapp`. هذا الهيكل سيستضيف إعداد Nginx وأحجام Certbot.",{"title":65,"body":66},"كتابة ملفّ docker-compose.yml","أنشئ ‎`\u002Fopt\u002Fmyapp\u002Fdocker-compose.yml` بثلاثة خدمات: ‎`app` (صورة Go الخاصة بك)، و‎`nginx` (الوكيل العكسي)، و‎`certbot` (تجديد SSL). مثال مصغّر:\n```\nservices:\n  app:\n    image: monapp:latest\n    restart: unless-stopped\n    env_file: .env\n    expose:\n      - \"8080\"\n  nginx:\n    image: nginx:1.27-alpine\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\u002Fnginx\u002Fconf.d:\u002Fetc\u002Fnginx\u002Fconf.d:ro\n      - .\u002Fcertbot\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot:ro\n      - .\u002Fcertbot\u002Fconf:\u002Fetc\u002Fletsencrypt:ro\n    depends_on:\n      - app\n  certbot:\n    image: certbot\u002Fcertbot\n    volumes:\n      - .\u002Fcertbot\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot\n      - .\u002Fcertbot\u002Fconf:\u002Fetc\u002Fletsencrypt\n```",{"title":68,"body":69},"إعداد Nginx كوكيل عكسي","أنشئ ‎`nginx\u002Fconf.d\u002Fapp.conf`. ابدأ ببلوك HTTP فقط للتحقّق من تحدّي ACME، ثمّ أضف بلوك HTTPS بعد الحصول على الشهادة:\n```\nserver {\n    listen 80;\n    server_name api.mondomaine.com;\n    location \u002F.well-known\u002Facme-challenge\u002F {\n        root \u002Fvar\u002Fwww\u002Fcertbot;\n    }\n    location \u002F {\n        return 301 https:\u002F\u002F$host$request_uri;\n    }\n}\nserver {\n    listen 443 ssl;\n    server_name api.mondomaine.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fapi.mondomaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fapi.mondomaine.com\u002Fprivkey.pem;\n    location \u002F {\n        proxy_pass http:\u002F\u002Fapp:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n```",{"title":71,"body":72},"الحصول على شهادة Let's Encrypt","شغّل Nginx وحده أوّلًا، ثمّ أطلق Certbot في وضع webroot: ‎`docker compose up -d nginx && docker compose run --rm certbot certonly --webroot -w \u002Fvar\u002Fwww\u002Fcertbot -d api.mondomaine.com --email vous@domaine.com --agree-tos`. بعد إصدار الشهادة، أعد تشغيل Nginx: ‎`docker compose restart nginx`.",{"title":74,"body":75},"بناء التطبيق وتشغيله","ابنِ صورة Go على الخادم (أو انقلها عبر ‎`docker save\u002Fload` أو registry خاص): ‎`docker build -t monapp:latest .`. ثمّ أطلق المنظومة الكاملة: ‎`docker compose up -d`. تتبّع السجلّات بـ ‎`docker compose logs -f app`.",{"title":77,"body":78},"أتمتة تجديد SSL","أضف crontab على الخادم لتجديد الشهادة تلقائيًا كلّ أسبوع: ‎`(crontab -l 2>\u002Fdev\u002Fnull; echo \"0 3 * * 0 cd \u002Fopt\u002Fmyapp && docker compose run --rm certbot renew && docker compose restart nginx\") | crontab -`. لا يُجدّد Certbot فعليًا إلّا إذا كان انتهاء الصلاحية في أقل من 30 يومًا.",{"title":80,"body":81},"إعداد Gin لبيئة الإنتاج","حوّل Gin إلى وضع الإصدار (release) باستخدام ‎`gin.SetMode(gin.ReleaseMode)` أو المتغيّر ‎`GIN_MODE=release` لتعطيل سجلّات التنقيح المطوّلة. اقرأ المنفذ والأسرار من البيئة (‎`os.Getenv`)، ولا تُضمّنها أبدًا في الشيفرة مباشرةً.",{"type":38,"title":83,"body":84},"إعادة التحميل الفوري في التطوير مع air","في مرحلة التطوير، إعادة التصريف والتشغيل يدويًا عند كلّ تعديل أمر مُرهق. يراقب ‎`air` (github.com\u002Fair-verse\u002Fair، الإصدار الحالي v1.67.4) شجرة الملفّات ويعيد تشغيل الملفّ الثنائي عند كلّ تغيير في ملفّات ‎`.go`. التثبيت: ‎`go install github.com\u002Fair-verse\u002Fair@latest`. شغّل ببساطة ‎`air` في جذر مشروعك — يُولَّد ملفّ إعداد ‎`.air.toml` افتراضي تلقائيًا عند أوّل تشغيل. لتخصيص المجلّدات المُراقَبة أو استثناء ‎`vendor\u002F`:\n```\n[build]\n  cmd = \"go build -o .\u002Ftmp\u002Fserver .\"\n  bin = \".\u002Ftmp\u002Fserver\"\n  include_ext = [\"go\", \"html\", \"tmpl\"]\n  exclude_dir = [\"vendor\", \"testdata\"]\n```\n‏air مخصّص للتطوير المحلّي فقط: لا تثبّته أبدًا في صورة Docker الإنتاجية.",{"type":38,"title":86,"body":87},"متغيّرات البيئة والأسرار","لا تُضمّن الأسرار (مفاتيح API، كلمات مرور قواعد البيانات، رموز JWT) مباشرةً في الشيفرة. الممارسة المعيارية في Go هي قراءتها من البيئة بـ ‎`os.Getenv(\"DB_PASSWORD\")`. في التطوير المحلّي، ملفّ ‎`.env` محمّل بـ ‎`godotenv` يبسّط سير العمل: ‎`go get github.com\u002Fjoho\u002Fgodotenv`، ثمّ عند البدء:\n```\nimport \"github.com\u002Fjoho\u002Fgodotenv\"\nfunc main() {\n    _ = godotenv.Load() \u002F\u002F يحمّل .env إذا وُجد، صامت في الإنتاج\n    db := os.Getenv(\"DB_DSN\")\n    port := os.Getenv(\"PORT\")\n    if port == \"\" { port = \"8080\" }\n    \u002F\u002F ...\n}\n```\nفي الإنتاج، مرّر المتغيّرات عبر ‎`env_file: .env` في Docker Compose (هذا الملفّ يجب ألّا يُحفظ في git أبدًا — أضف ‎`.env` إلى ‎`.gitignore`). للأسرار البالغة الحساسية، فضّل أسرار Docker أو خزنة خارجية. القاعدة الذهبية: سرّ في ‎`git log` هو سرّ مكشوف.",{"type":89,"body":90},"tip","فعّل تنميط (profiling) ‎`pprof` الخاص بـ Go خلف نقطة نهاية محمية: ‎`import _ \"net\u002Fhttp\u002Fpprof\"` مكشوفة على منفذ داخلي لا يمكن الوصول إليه إلّا عبر نفق SSH (‎`ssh -L 6060:localhost:6060 user@vps`). تحصل على مخطّطات لهب (flame graphs) للمعالج والذاكرة في بيئة الإنتاج الحقيقية دون حمل زائد يُذكر. فكّر أيضًا في التصريف باستخدام ‎`-ldflags=\"-s -w\"` لتقليص حجم الملفّ الثنائي بنحو 30% عبر إزالة جداول التنقيح.",{"type":38,"title":92,"body":93},"تصحيح الأخطاء: المشاكل الشائعة","إليك الأخطاء الخمسة الأكثر شيوعًا عند أوّل نشر Go على خادم VPS، مع رسائل الخطأ الدقيقة وطريقة الإصلاح.\n\n**1. ‎`standard_init_linux.go:228: exec user process caused: no such file or directory`** — صُرِّف الملفّ الثنائي مع تفعيل CGO وصورة ‎`scratch` لا تحتوي libc. الإصلاح: أعد التصريف بـ ‎`CGO_ENABLED=0 go build -o server .`.\n\n**2. ‎`exec format error`** — صُرِّف الملفّ الثنائي لمعمارية مختلفة (مثلًا macOS ARM ‎→ Linux AMD64). الإصلاح: تحقّق من ‎`GOOS=linux GOARCH=amd64` قبل البناء، أو ابنِ مباشرةً على الخادم.\n\n**3. ‎`bind: address already in use` (المنفذ 8080)** — عملية أخرى تستمع على هذا المنفذ. تحقّق بـ ‎`ss -tlnp | grep 8080` وأوقف العملية المتعارضة، أو غيّر المنفذ في ‎`.env`.\n\n**4. ‎`x509: certificate signed by unknown authority` أو ‎`certificate has expired`** — حاوية ‎`scratch` تفتقر إلى شهادات CA، أو انتهت صلاحية شهادة Let's Encrypt. الإصلاح: تحقّق من وجود ‎`COPY --from=build \u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt` في ‎Dockerfile، وأعد تشغيل Certbot للتجديد.\n\n**5. ‎`permission denied` عند بدء الملفّ الثنائي** — الملفّ الثنائي ليس قابلًا للتنفيذ. الإصلاح: تحقّق من الصلاحيات بـ ‎`ls -la server` وطبّق ‎`chmod +x server` إذا لزم. في ‎Dockerfile، ‎`COPY --from=build` يحفظ الصلاحيات عادةً، لكنّ ‎`RUN chmod +x \u002Fserver` الصريح يضمن النتيجة.",{"type":38,"title":95,"body":96},"نشر Go (Gin) بنقرة واحدة من Marketplace ServOrbit","تقدّم Marketplace ServOrbit قالب Go (Gin) Stack جاهزًا: Go من الملفّ الثنائي الرسمي go.dev، وNginx، وPostgreSQL 16 تُثبَّت تلقائيًا على VPS عند الطلب. لا جلسة SSH للإعداد الأساسي — تصل مباشرة إلى خطوة تصريف مشروعك ورفع الملفّ الثنائي. صفحة marketplace تحتوي المواصفات والحالات ودليل الاستخدام الأول.",{"type":38,"title":98,"body":99},"للمزيد","أصبح بإمكانك الآن نشر واجهة Go على خادم VPS باحترافية. للمضيّ أبعد: اضبط **Traefik v3** وكيلًا عكسيًا بدلًا من Nginx — يدير التوجيه وشهادات Let's Encrypt وموازنة التحميل في حاوية واحدة بإعداد تصريحي عبر labels Docker (راجع دليلنا [Traefik v3 على VPS](\u002Fblog\u002Ftraefik-v3-vps-reverse-proxy)). للتحديثات في الإنتاج دون انقطاع، اطّلع على مقالنا حول [أفضل ممارسات تحديث Docker Compose](\u002Fblog\u002Fdocker-compose-mise-a-jour-best-practices-vps): النشر المتدرّج، وفحوصات الصحّة، واستراتيجيات الرجوع للإصدار السابق. وإذا فضّلت إسناد البنية التحتية، فإنّ [قالب Go (Gin) في Marketplace](\u002Fapplications\u002Fdeveloppement\u002Fgolang) يُعدّ المنظومة كاملةً في دقائق.","انشر Go (Gin) Stack في دقائق","يُثبِّت قالب Go (Gin) Stack ServOrbit Go 1.22+ وNginx وPostgreSQL 16 على VPS الخاص بك. صرِّف مشروعك ثمّ انشر الملفّ الثنائي فورًا.","نشر Go (Gin) Stack","\u002Fapplications\u002Fالتطوير\u002Fgolang",[105,122,140],{"id":106,"slug":107,"slugs":108,"title":112,"excerpt":113,"readTime":114,"views":23,"isPinned":19,"noindex":19,"publishedAt":115,"updatedAt":21,"category":116,"categories":117,"featuredImage":30,"bgImage":31,"posterImage":119,"relatedSolution":120},45,"نشر-تطبيق-fastapi-على-vps",{"fr":109,"en":110,"ar":107,"es":111},"deployer-fastapi-vps","deploy-a-fastapi-application-on-a-vps","desplegar-una-aplicacion-fastapi-en-un-vps","نشر FastAPI على VPS: الدليل الكامل للإنتاج","انشر FastAPI على VPS مع Docker متعدد المراحل وGunicorn وPostgreSQL وCI\u002FCD وMониторинг. دليل Python شامل للإنتاج 2025.",10,"2026-05-06T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[118],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-fastapi-vps-poster.svg",{"categorySlug":24,"appSlug":121},"fastapi",{"id":123,"slug":124,"slugs":125,"title":129,"excerpt":130,"readTime":131,"views":132,"isPinned":19,"noindex":19,"publishedAt":133,"updatedAt":21,"category":134,"categories":135,"featuredImage":30,"bgImage":31,"posterImage":137,"relatedSolution":138},44,"نشر-تطبيق-django-على-vps",{"fr":126,"en":127,"ar":124,"es":128},"deployer-django-vps","deploy-a-django-application-on-a-vps","desplegar-una-aplicacion-django-en-un-vps","نشر تطبيق Django على VPS","انشر Django على VPS: Gunicorn وNginx وPostgreSQL وDocker وSSL. دليل كامل لمطوّري Python الراغبين في الاستضافة الذاتية.",3,7,"2026-05-07T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[136],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":24,"appSlug":139},"django",{"id":141,"slug":142,"slugs":143,"title":147,"excerpt":148,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":149,"updatedAt":150,"category":151,"categories":152,"featuredImage":30,"bgImage":31,"posterImage":154,"relatedSolution":155},43,"نشر-تطبيق-nodejs-على-vps",{"fr":144,"en":145,"ar":142,"es":146},"deployer-nodejs-vps","deploy-a-nodejs-application-on-a-vps","desplegar-una-aplicacion-nodejs-en-un-vps","نشر تطبيق Node.js على VPS","انشر تطبيق Node.js في بيئة الإنتاج على VPS: PM2 وبروكسي عكسي Nginx وشهادة SSL من Let's Encrypt وبدء تشغيل تلقائي عند الإقلاع.","2026-05-08T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[153],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":24,"appSlug":156},"nodejs-stack",true,1794270311676]