لماذا 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
مثال: نشر خادم Go عبر Systemd
\n\nلنفترض أن لديك تطبيقًا بسيطًا main.go يستمع على المنفذ 8080. نقوم بتجميعه على جهازك للهندسة المستهدفة:
GOOS=linux GOARCH=amd64 go build -o app main.go\n\nننسخ الملف الثنائي إلى الخادم:
\n\nscp app user@your-server:/opt/app/\n\nننشئ وحدة systemd في /etc/systemd/system/app.service:
[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\nsudo systemctl daemon-reload\nsudo systemctl enable --now app\n\nالآن تطبيق Go الخاص بك يعمل كخدمة خلفية. نضيف Nginx للوكالة من المنفذ 80:
\n\nserver {\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\nDocker لـ Go: الحاويات التي تبسط الحياة
\n\nإذا كنت تعمل ضمن فريق أو تخطط لخدمات مصغرة، فإن Docker هو خيارك. Go و Docker هما زوج مثالي: البناء متعدد المراحل يعطي صورًا بحجم 5-15 ميجابايت، والتجميع الثابت يسمح بالاستغناء عن الصورة الأساسية.
\n\nDockerfile لتطبيق 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\ndocker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app\n\nDocker Compose لبيئة متكاملة
\n\nعندما يحتاج التطبيق إلى قاعدة بيانات أو Redis، استخدم docker-compose.yml:
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