مقدمة: من التطوير إلى خادم الإنتاج بلغة 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\n1. إعداد VPS وتهيئة البيئة
\nلنفترض أن لديك VPS (DigitalOcean، Hetzner، Timeweb) مع Ubuntu 22.04. أولاً، نقوم بتحديث النظام وتثبيت مجموعة الأدوات الأساسية:
\nssh root@your_server_ip\napt update && apt upgrade -y\napt install -y git curl htop net-tools ufw\nنقوم بإنشاء مستخدم deploy بصلاحيات sudo (بدون كلمة مرور، فقط عبر مفتاح SSH):
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:
\nufw allow OpenSSH\nufw allow 80/tcp\nufw allow 443/tcp\nufw enable\nهام: نقوم بتعطيل تسجيل الدخول للمستخدم root في /etc/ssh/sshd_config (PermitRootLogin no) وإعادة تشغيل SSH (systemctl restart sshd).
1.1 تثبيت Docker و Docker Compose
\nلتطبيق Go، الحاويات هي المعيار الفعلي. نقوم بتثبيت Docker حسب التعليمات الرسمية:
\ncurl -fsSL https://get.docker.com -o get-docker.sh\nsh get-docker.sh\nusermod -aG docker deploy\nنتحقق من الإصدار: docker --version. بعد ذلك، نقوم بتثبيت Docker Compose v2 (إضافة):
apt install -y docker-compose-plugin\n\n2. خط أنابيب CI/CD مع GitHub Actions و Docker
\nالنشر المتقدم يعني الأتمتة. سنستخدم GitHub Actions لبناء الصورة وإرسالها إلى الخادم عبر SSH ثم تشغيل الحاوية الجديدة.
\nهيكل مشروع Go:
\nmyapp/\n├── main.go\n├── go.mod\n├── Dockerfile\n├── docker-compose.yml\n└── .github/workflows/deploy.yml\nDockerfile (بناء متعدد المراحل):
\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 -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"]\ndocker-compose.yml (للإنتاج):
\nversion: '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):
\nname: 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