Go في الإنتاج: VPS، Docker أو Cloud — اختيار أفضل نشر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا Go هو المرشح المثالي للإنتاج، لكن النشر لا يزال هو الحاسم

\n\n

لقد كتبت الواجهة الخلفية بلغة Go. إنها سريعة: التجميع في ملف ثنائي واحد، استهلاك ضئيل للذاكرة، goroutines التي لا تخشى الأحمال. ولكن هناك فارق بسيط: حتى أسرع كود يكون عديم الفائدة إذا كان راكدًا على جهازك المحلي. عاجلاً أم آجلاً، يطرح السؤال: كيف ننشر هذه التحفة الهندسية في الإنتاج؟

\n\n

نشر تطبيقات Go ليس علم الصواريخ، ولكن من السهل الوقوع في الأخطاء هنا. في هذه المقالة، سنناقش ثلاثة طرق رئيسية: VPS الكلاسيكي، الحاويات مع Docker، والمنصات السحابية. ستتعرف على النهج الذي يجب اختياره لمهمتك، وستحصل على نصوص جاهزة للبدء.

\n\n

نشر Go على VPS: الكلاسيكي الذي لا يشيخ

\n\n

الخادم الخاص الافتراضي (VPS) هو الجذر الشخصي الخاص بك. تحكم كامل، لا قيود من المنصة، ولكن المسؤولية عن كل شيء تقع على عاتقك. بالنسبة لتطبيق Go، غالبًا ما يكون هذا هو الخيار الأمثل: الملف الثنائي يزن 10-20 ميجابايت، ويبدأ التشغيل بالميلي ثانية ولا يتطلب تنسيقًا معقدًا.

\n\n

ما هو مطلوب لنشر Go على VPS

\n\n
    \n
  • خادم مع Linux (Ubuntu 22.04 / Debian 11 — الكلاسيكي)
  • \n
  • وصول SSH
  • \n
  • Go (اختياري، إذا كنت تقوم بالتجميع على الخادم)
  • \n
  • Systemd لإدارة العملية
  • \n
  • Nginx أو Caddy كوكيل عكسي
  • \n
\n\n

مثال: نشر خادم Go عبر Systemd

\n\n

لنفترض أن لديك تطبيقًا بسيطًا main.go يستمع على المنفذ 8080. نقوم بتجميعه على جهازك للهندسة المستهدفة:

\n\n
GOOS=linux GOARCH=amd64 go build -o app main.go
\n\n

ننسخ الملف الثنائي إلى الخادم:

\n\n
scp app user@your-server:/opt/app/
\n\n

ننشئ وحدة systemd في /etc/systemd/system/app.service:

\n\n
[Unit]\nDescription=Go App\nAfter=network.target\n\n[Service]\nExecStart=/opt/app/app\nWorkingDirectory=/opt/app\nRestart=always\nUser=www-data\nGroup=www-data\nEnvironment=PORT=8080\n\n[Install]\nWantedBy=multi-user.target
\n\n

نقوم بتشغيله وتفعيل التشغيل التلقائي:

\n\n
sudo systemctl daemon-reload\nsudo systemctl enable --now app
\n\n

الآن تطبيق Go الخاص بك يعمل كخدمة خلفية. نضيف Nginx للوكالة من المنفذ 80:

\n\n
server {\n    listen 80;\n    server_name yourdomain.com;\n\n    location / {\n        proxy_pass http://127.0.0.1:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}
\n\n

مزايا VPS: تحكم كامل، تكلفة منخفضة (من $5/شهر)، شفافية. عيوب: تحديث يدوي، لا يوجد توسع تلقائي، تحتاج إلى إعداد الأمان بنفسك.

\n\n

Docker لـ Go: الحاويات التي تبسط الحياة

\n\n

إذا كنت تعمل ضمن فريق أو تخطط لخدمات مصغرة، فإن Docker هو خيارك. Go و Docker هما زوج مثالي: البناء متعدد المراحل يعطي صورًا بحجم 5-15 ميجابايت، والتجميع الثابت يسمح بالاستغناء عن الصورة الأساسية.

\n\n

Dockerfile لتطبيق Go

\n\n

إليك Dockerfile الأدنى ولكن الجاهز للإنتاج:

\n\n
# المرحلة 1: البناء\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o app .\n\n# المرحلة 2: صورة دنيا\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/app .\nEXPOSE 8080\nCMD ["./app"]
\n\n

نقوم بالبناء والتشغيل:

\n\n
docker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app
\n\n

Docker Compose لبيئة متكاملة

\n\n

عندما يحتاج التطبيق إلى قاعدة بيانات أو Redis، استخدم docker-compose.yml:

\n\n
version: '3.8'\nservices:\n  app:\n    build: .\n    ports:\n      - "8080:8080"\n    environment:\n      - DB_HOST=db\n      - DB_PORT=5432\n    depends_on:\n      - db\n  db:\n    image: postgres                

المدونات

توصيات الكتب