نشر تطبيق Go على VPS: دليل متقدم

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

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

ابدأ الدورة

مقدمة: من التطوير إلى خادم الإنتاج بلغة Go

\n

لقد قمت بكتابة تطبيق ويب عالي الأداء بلغة Go (Golang). التجميع في ملف ثنائي واحد، الكتابة الثابتة، العمل المدمج مع الشبكة - كل هذا يمنحك أفضلية على Node.js أو Python. لكن "إنه يعمل على جهازي" ليس حجة للإنتاج. النشر المتقدم لتطبيق Go على VPS ليس مجرد نسخ الملفات عبر SSH. إنه إعداد خط أنابيب CI/CD، الحاويات، الوكيل العكسي، التحديث التلقائي للشهادات، المراقبة والإغلاق السلس.

\n

في هذه المقالة، سنشرح سيناريو كامل جاهز للإنتاج لتطبيق Golang على Ubuntu 22.04 LTS. ستتعلم كيفية إعداد بناء Docker، تنظيم نشر بدون توقف عبر GitHub Actions، ربط Nginx مع SSL وإعداد مراقبة مقاييس Prometheus.

\n\n

1. إعداد VPS وتهيئة البيئة

\n

لنفترض أن لديك VPS (DigitalOcean، Hetzner، Timeweb) مع Ubuntu 22.04. أولاً، نقوم بتحديث النظام وتثبيت مجموعة الأدوات الأساسية:

\n
ssh root@your_server_ip\napt update && apt upgrade -y\napt install -y git curl htop net-tools ufw
\n

نقوم بإنشاء مستخدم deploy بصلاحيات sudo (بدون كلمة مرور، فقط عبر مفتاح SSH):

\n
adduser deploy\nusermod -aG sudo deploy\nmkdir /home/deploy/.ssh\ncp ~/.ssh/authorized_keys /home/deploy/.ssh/\nchown -R deploy:deploy /home/deploy/.ssh\nchmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys
\n

نقوم بإعداد جدار الحماية UFW:

\n
ufw allow OpenSSH\nufw allow 80/tcp\nufw allow 443/tcp\nufw enable
\n

هام: نقوم بتعطيل تسجيل الدخول للمستخدم root في /etc/ssh/sshd_config (PermitRootLogin no) وإعادة تشغيل SSH (systemctl restart sshd).

\n\n

1.1 تثبيت Docker و Docker Compose

\n

لتطبيق Go، الحاويات هي المعيار الفعلي. نقوم بتثبيت Docker حسب التعليمات الرسمية:

\n
curl -fsSL https://get.docker.com -o get-docker.sh\nsh get-docker.sh\nusermod -aG docker deploy
\n

نتحقق من الإصدار: docker --version. بعد ذلك، نقوم بتثبيت Docker Compose v2 (إضافة):

\n
apt install -y docker-compose-plugin
\n\n

2. خط أنابيب CI/CD مع GitHub Actions و Docker

\n

النشر المتقدم يعني الأتمتة. سنستخدم GitHub Actions لبناء الصورة وإرسالها إلى الخادم عبر SSH ثم تشغيل الحاوية الجديدة.

\n

هيكل مشروع Go:

\n
myapp/\n├── main.go\n├── go.mod\n├── Dockerfile\n├── docker-compose.yml\n└── .github/workflows/deploy.yml
\n

Dockerfile (بناء متعدد المراحل):

\n
FROM 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 -ldflags="-s -w" -o /app/myapp .\n\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates tzdata\nWORKDIR /root/\nCOPY --from=builder /app/myapp .\nEXPOSE 8080\nCMD ["./myapp"]
\n

docker-compose.yml (للإنتاج):

\n
version: '3.8'\nservices:\n  app:\n    image: ghcr.io/your_username/myapp:latest\n    restart: always\n    ports:\n      - "127.0.0.1:8080:8080"\n    environment:\n      - DB_URL=postgres://user:pass@db:5432/mydb\n    depends_on:\n      - db\n  db:\n    image: postgres:16-alpine\n    restart: always\n    environment:\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: pass\n    volumes:\n      - pg_data:/var/lib/postgresql/data\nvolumes:\n  pg_data:
\n

سير عمل GitHub Actions (.github/workflows/deploy.yml):

\n
name: Deploy Go App\non:\n  push:\n    branches: [ main ]\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Login to GitHub Container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: ghcr.io\n                

المدونات

توصيات الكتب