برنامه نویسی

🌍🚀🎯 از Localhost تا Cloud ☁️: Next.js، Django، SSL 🔒، GitHub Actions 🚀، DNS| آموزش نصب نهایی وب سایت🌟🔥✨

featured-image.jpg

معرفی

این را تصویر کنید: 📸 شما یک وب سایت خیره کننده ایجاد کرده اید، و اکنون زمان آن رسیده که آن را در دسترس جهانیان قرار دهید. اما روند استقرار دلهره آور به نظر می رسد، درست است؟ 😰

نترسید، زیرا Kubernetes اینجاست تا روز را نجات دهد. 🦸‍♂️ Kubernetes با ویژگی‌های قدرتمند و مدیریت کانتینر هوشمند، پیچیدگی استقرار وب‌سایت را از بین می‌برد.

در این آموزش، Kubernetes را ابهام زدایی می کنیم و شما را از طریق فرآیند استقرار وب سایت خود بدون زحمت راهنمایی می کنیم. آماده شوید تا قفل جادوی Kubernetes را باز کنید و شاهد پیشرفت وب سایت خود در قلمروهای ابر باشید. ✨🌐

ما چه خواهیم کرد

ما شما را از طریق فرآیند استقرار وب سایت خود از اجرای محلی روی لوکال هاست خود به Cloud راهنمایی می کنیم.

این وب‌سایت یک وب‌سایت تمام پشته با فرانت‌اند و بک‌اند با پایگاه داده SQLite خواهد بود که از طریق SSL ارائه می‌شود.

ما همچنین یک خط لوله CI برای استقرار کد در commit to master Branch خواهیم ساخت.

برای انجام این کار مراحل زیر را انجام می دهیم:

  • جلوی Next.js و باطن جنگو را Dockerize کنید.
  • مانیفست های Kubernetes را برای سرورهای فرانت اند و باطن بنویسید، از جمله یک حجم پایدار برای پایگاه داده Django SQLite و دریافت گواهی SSL با استفاده از Cert Manager.
  • یک خوشه Kubernetes در GCP ایجاد کنید.
  • DNS دامنه را پیکربندی کنید.
  • GitHub Actions YAML را برای ساخت و استقرار برنامه‌ها در GCP بنویسید.
  • کد را برای استقرار به GitHub فشار دهید.

این آموزش شامل چندین فناوری است و اگر با مفاهیم ناآشنا مواجه شدید، نگران نباشید. با پیشرفت در آموزش، درک بهتری از هر فناوری و نقش آن در فرآیند استقرار به دست خواهید آورد.

پیش نیازها

برای تکمیل موفقیت آمیز این آموزش، شما نیاز دارید:

  • یک حساب GCP
  • یک نام دامنه

اگر هنوز نام دامنه خریداری نکرده اید، توصیه می کنم از Namecheap استفاده کنید زیرا من شخصاً از آنها استفاده کرده ام و تجربه خوبی داشته ام.

من به شدت توصیه می کنم قبل از اینکه خودتان به استقرار ادامه دهید، 2-3 بار آموزش را بخوانید.

Dockerization

برای این آموزش، یک مخزن متشکل از دو پوشه ایجاد شده است: frontend و backend.

را frontend پوشه حاوی کد برنامه مبتنی بر Next.js است، در حالی که backend پوشه حاوی کد برنامه مبتنی بر جنگو است.

برای شروع، باید کد شروع را کلون کنید:

git clone https://github.com/omkarcloud/kubernetes-website-deployment-tutorial-starter
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پروژه را در Visual Studio Code با اجرای:

code kubernetes-website-deployment-tutorial-starter/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dockerizing Frontend

برای Dockerize کردن کد frontend ساخته شده با Next.js، یک Dockerfile در پوشه frontend با محتویات زیر ایجاد کنید:

frontend/Dockerfile

FROM node:16-alpine

COPY package.json .
RUN rm -rf node_modules/ .next/* && npm install --legacy-peer-deps
COPY . .

RUN npm run build

CMD ["npm", "run", "start"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر این، با اجرای دستور زیر، یک فایل .dockerignore در پوشه frontend با محتوایی مشابه gitignore. ایجاد کنید:

cp frontend/.gitignore frontend/.dockerignore
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dockerizing Backend

حالا بیایید با ایجاد یک کد پشتیبان مبتنی بر جنگو را Dockerize کنیم Dockerfile در backend پوشه با محتویات زیر:

backend/Dockerfile

FROM python:3.9
ENV PYTHONBUFFERED 1

COPY requirements.txt .
RUN python -m pip install -r requirements.txt

RUN mkdir app
WORKDIR /app
COPY . /app

CMD gunicorn --workers 3 -b 0.0.0.0:8000 config.wsgi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس، با اجرای دستور زیر، یک فایل .dockerignore در پوشه باطن با محتوای مشابه gitignore. ایجاد کنید:

cp backend/.gitignore backend/.dockerignore
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد PVC برای Backend

برای اطمینان از پایداری فایل پایگاه داده SQLite ما که در برنامه جنگو استفاده می شود، بیایید با ایجاد یک ادعای حجم پایدار (PVC) ایجاد کنیم. pvc.yaml فایل در k8s/volumes/ با محتویات زیر، که 4 گیگابایت فضای ذخیره سازی در GCP فراهم می کند:

k8s/volumes/pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  storageClassName: standard-rwo
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد سرویس برای Backend و Frontend

برای اینکه غلاف‌های باطنی و فرانت‌اند درون خوشه قابل دسترسی باشند، فایل‌های مانیفست زیر را ایجاد کنید:

  1. استقرار Backend (k8s/app/backend-depl.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      volumes:
        - name: app-data
          persistentVolumeClaim:
            claimName: csi-pvc
      containers:
        - name: backend
          image: placeholder/backend:1.0.5
          volumeMounts:
            - mountPath: /app-data
              name: app-data
---
apiVersion: v1
kind: Service
metadata:
  name: backend-srv
spec:
  selector:
    app: backend
  ports:
    - name: backend
      protocol: TCP
      port: 8000
      targetPort: 8000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. استقرار Frontend (k8s/app/frontend-depl.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: frontend
          resources:
            requests:
              ephemeral-storage: "800Mi"
            limits:
              ephemeral-storage: "800Mi"
          image: placeholder/frontend:1.0.4
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-srv
spec:
  selector:
    app: frontend
  ports:
    - name: frontend
      protocol: TCP
      port: 3000
      targetPort: 3000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد تعادل بار

برای افشای غلاف های خود از طریق سرویس ها، باید یک منبع Ingress ایجاد کنیم. یک فایل به نام ایجاد کنید ingress.yaml که در k8s/app/ با محتوای زیر، نام دامنه خود را جایگزین “www.your-domain.com” کنید:

k8s/app/ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/proxy-body-size: 80m
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
spec:
  rules:
    - host: "www.your-domain.com"
      http:
        paths:
          - path: /backend
            pathType: Prefix
            backend:
              service:
                name: backend-srv
                port:
                  number: 8000
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-srv
                port:
                  number: 3000

  tls:
    - hosts:
        - "www.your-domain.com"
      secretName: ssl-certificate

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت گواهی SSL

برای دریافت گواهی SSL برای دامنه خود، می توانید یک فایل YAML با نام ایجاد کنید certificates.yaml در k8s/certificates فهرست راهنما.

جایگزین کردن www.your-domain.com با نام دامنه واقعی خود و به صورت اختیاری جایگزین کنید youremail@gmail.com با آدرس ایمیل خود برای دریافت ایمیل های مربوط به SSL از Let’s Encrypt (ارائه دهنده SSL ما).

k8s/certificates/certificates.yaml

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: youremail@gmail.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: nginx
        selector:
          dnsNames:
            - "www.your-domain.com"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اقدامات Github را ایجاد کنید

برای خودکار کردن فرآیند استقرار برنامه خود در هر commit به شاخه اصلی، می توانید از GitHub Actions استفاده کنید.

گردش کار زیر مراحل لازم برای احراز هویت با Google Cloud Platform (GCP)، ساخت تصاویر Docker، فشار دادن آنها به Google Container Registry و استقرار برنامه در Google Kubernetes Engine (GKE) خوشه را تعریف می کند.

لطفاً توجه داشته باشید که استقرار شامل حذف استقرار باطن قبلی است که هر زمان که کد را با فشار دادن به Github استقرار می‌دهید منجر به توقف موقت 4 تا 5 دقیقه می‌شود.

ما همچنین از متغیرهای محیطی مختلف Google Cloud Platform (GCP) برای استقرار استفاده می‌کنیم که بعداً آن‌ها را به صورت ایمن در مخزن GitHub خود ذخیره خواهیم کرد.

برای استفاده از این گردش کار یک فایل به نام ایجاد کنید deploy.yaml در .github/workflows فهرست راهنما. در اینجا محتوایی برای deploy.yaml فایل:

.github/workflows/deploy.yaml

name: Build and Deploy to GKE

on:
  push:
    branches:
      - master

env:
  PROJECT_ID: ${{ secrets.GKE_PROJECT }}
  GKE_CLUSTER: my-application-cluster
  GKE_PROJECT: ${{ secrets.GKE_PROJECT }}
  GKE_CLUSTER_NAME: my-application-cluster
  GKE_ZONE: asia-south1-a
  GKE_EMAIL: ${{ secrets.GKE_EMAIL }}
  GKE_KEY: ${{ secrets.GKE_KEY }}
  GITHUB_SHA: ${{ github.sha }}
  ACTIONS_ALLOW_UNSECURE_COMMANDS: "true"
  USE_GKE_GCLOUD_AUTH_PLUGIN: "True"

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest
    environment: production
    permissions:
      contents: 'read'
      id-token: 'write'

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set Images as enviroment variables
        run: |
          echo "FRONTEND=$(echo "gcr.io/""$GKE_PROJECT""/frontend:""$GITHUB_SHA")" >> $GITHUB_ENV
          echo "BACKEND=$(echo "gcr.io/""$GKE_PROJECT""/backend:""$GITHUB_SHA")" >> $GITHUB_ENV

      - name: update images
        run: |
          FRONTEND_ESCAPE=$(printf '%s\n' "$FRONTEND" | sed -e 's/[\/&]/\\&/g')
          sed -i -e 's/placeholder\/frontend:1.0.4/'"$FRONTEND_ESCAPE"'/g' frontend-depl.yaml
          cat frontend-depl.yaml
          BACKEND_ESCAPE=$(printf '%s\n' "$BACKEND" | sed -e 's/[\/&]/\\&/g')
          sed -i -e 's/placeholder\/backend:1.0.5/'"$BACKEND_ESCAPE"'/g' backend-depl.yaml
          cat backend-depl.yaml
        working-directory: k8s/app

      - id: 'auth'
        uses: 'google-github-actions/auth@v1'
        with:
          credentials_json: '${{ secrets.GCP_CREDENTIALS }}'

      - name: Set up Cloud SDK
        uses: google-github-actions/setup-gcloud@v1

      - name: Install Gke
        run: |
          gcloud components install gke-gcloud-auth-plugin

      - name: Cluster Login
        run: |
          gcloud container clusters get-credentials $GKE_CLUSTER_NAME --zone $GKE_ZONE --project $GKE_PROJECT

      - name: Configure Docker
        run: gcloud --quiet auth configure-docker

      - run: docker build --tag "$FRONTEND" .
        working-directory: frontend

      - run: docker build --tag "$BACKEND" .
        working-directory: backend

      - name: Push Images
        run: |
          docker push "$FRONTEND"
          docker push "$BACKEND"

      - name: Deploy
        run: |
          kubectl delete deployment backend-depl || true
          kubectl apply --recursive -f k8s/
          deploy=$(kubectl get deploy -o name) &&  for i in $deploy; do kubectl rollout status $i -w --timeout=30s; done || true
          kubectl get pods
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

راه اندازی GCP

اکنون، ما کلاستر GCP را راه اندازی می کنیم.
من به شما می گویم زمانی که شما نیاز به تغییر برخی از متغیرها دارید. لطفاً فقط متغیرهایی را که به شما می گویم تغییر دهید و سایر متغیرها را دست نخورده نگه دارید، مانند نام خوشه و منطقه و غیره.

از آنجایی که آنها هاردکد هستند و چندین بار در دستورات این آموزش استفاده خواهند شد. هنگامی که با آموزش آشنا شدید، با خیال راحت نام آنها را مطابق با اولویت خود تغییر دهید.

  1. API های زیر را برای پروژه خود فعال کنید تا یک خوشه GKE ایجاد کنید:
Artifact Registry: https://console.cloud.google.com/marketplace/product/google/artifactregistry.googleapis.com
Kubernetes Engine: https://console.cloud.google.com/marketplace/product/google/container.googleapis.com
Compute Engine: https://console.cloud.google.com/marketplace/product/google-cloud-platform/compute-engine
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

api-gcp.png

  1. در نوار کناری، روی دکمه “Kubernetes Engine” کلیک کنید.

gke.png

  1. برای ایجاد یک خوشه جدید بر روی دکمه “ایجاد” کلیک کنید. خوشه “Standard Mode” را پیکربندی کنید، زیرا مقرون به صرفه تر است.

select.png

  1. جزئیات زیر را برای خوشه ارائه دهید:
Cluster Name: my-application-cluster
Location Type: zonal
Zone: asia-south1-a
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

configure.png

  1. در نوار کناری، “default-pool” را انتخاب کنید و برای صرفه جویی در هزینه، تعداد گره ها را به جای 3 به 1 تغییر دهید.

pool.png

  1. در نوار کناری، “Nodes” را انتخاب کنید و از تنظیمات زیر برای صرفه جویی در هزینه استفاده کنید:
Machine Type: e2-small 
Boot Disk Size: 20 GB 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

nodes.png

هزینه تخمینی باید حدود 90 دلار باشد. اگر این اولین خوشه شما در GCP است، پس از تخفیف ۱ ماهه و تخفیف ۷۳ دلاری برای اولین خوشه، هزینه آن حدود \$27 کسر می‌شود.

  1. روی دکمه “ایجاد” کلیک کنید و خوشه تقریباً در عرض 5-6 دقیقه ایجاد می شود.

  2. با کلیک بر روی نماد پوسته در گوشه سمت راست بالا، GCP Shell را باز کنید.

shell.png

  1. با اجرای دستور زیر در خوشه خود احراز هویت کنید. نام پروژه GCP خود را جایگزین «clear-world-31478» کنید.
gcloud container clusters get-credentials my-application-cluster --zone asia-south1-a --project clear-world-31478
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. با اجرای دستور زیر یک آدرس IP ایجاد کنید:
gcloud compute addresses create my-application-cluster-ip --region asia-south1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. با اجرای دستور به آدرس IP ایجاد شده توجه کنید:
gcloud compute addresses describe my-application-cluster-ip --region asia-south1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. در ارائه دهنده خدمات نام دامنه (DNS) خود، مانند Namecheap، سوابق زیر را اضافه کنید. آدرس IP بدست آمده در مرحله قبل را جایگزین «31.91.11.253» کنید.
A @ 31.91.11.253
A www 31.91.11.253
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اطمینان حاصل کنید که TTL (Time to Live) روی کمترین مقدار ممکن، مانند 1 دقیقه تنظیم شده است تا امکان انتشار سریع DNS فراهم شود.

اگر از Namecheap استفاده می کنید، گزینه TTL 1 دقیقه ای را انتخاب کنید، که 1 دقیقه طول می کشد تا تغییرات DNS منتشر شود.

  1. برای نصب دستورات زیر را اجرا کنید ingress-nginx و cert-manager که نیاز به تعادل بار دارید گواهی SSL را دریافت کنید. در دستورات زیر 31.91.11.253 را با آدرس IP که قبلا ایجاد کردید جایگزین کنید.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm upgrade --install ingress-nginx-chart ingress-nginx/ingress-nginx --set controller.service.loadBalancerIP=31.91.11.253 --set controller.service.externalTrafficPolicy=Local

helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.crds.yaml
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.8.0
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

راه اندازی Github

این آخرین مرحله است که در آن GitHub Secrets را برای گردش کار استقرار خود پیکربندی می کنیم و کد را فشار می دهیم.

  1. یک مخزن Github ایجاد کنید

  2. با مراجعه به https://console.cloud.google.com/iam-admin/serviceaccounts یک فایل JSON حساب سرویس ایجاد کنید. حساب سرویس به تمام منابع (مالک) در Google Cloud (GCP) دسترسی کامل خواهد داشت. فایل JSON را ایمن نگه دارید، زیرا برای استقرار در Google Kubernetes Engine (GKE) لازم است. فایل را به عنوان account.json ذخیره کنید.

in.png

  1. اسرار Github را که در Workflow استفاده می شود، با رفتن به مخزن GitHub Settings > Secrets > Actions و ایجاد سه راز با نام ها و مقادیر زیر ایجاد کنید:
GKE_PROJECT="clear-world-31478"
GKE_EMAIL="owner-709@project.iam.gserviceaccount.com"
GKE_KEY="JodHRWCzov...L3D3dy5n"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اینجا،

  • GKE_PROJECT نام پروژه شماست
  • GKE_EMAIL ایمیلی است که در account.json فایل.
  • GKE_KEY حساب سرویس شما به عنوان base64 کدگذاری شده است. شما می توانید آن را با اجرا به دست آورید cat account.json | base64.
  1. حالا کد را به مخزن فشار دهید. پس از فشار دادن، سایت 4-5 دقیقه پس از تکمیل اکشن GitHub آماده خواهد شد. 4-5 دقیقه طول می کشد زیرا گواهی های SSL و غیره را دریافت می کند.

با مراجعه به Action Tabs مخزن Github خود می توانید وضعیت اقدامات خود را مشاهده کنید.

پس از اتمام Action، می توانید به وب سایت در دامنه خود دسترسی داشته باشید.

منابع را حذف کنید

به خاطر داشته باشید که برای جلوگیری از تحمیل هزینه، منابع GCP را حذف کنید. برای حذف منابع GCP مراحل زیر را دنبال کنید:

  1. با اجرای دستور زیر آدرس IP ایجاد شده را حذف کنید. در این دستور، «clear-world-31478» را با نام پروژه GCP خود جایگزین کنید.
gcloud compute addresses delete my-application-cluster-ip --region asia-south1 --project clear-world-31478
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. از داشبورد GKE برای حذف خوشه با استفاده از رابط کاربری گرافیکی استفاده کنید.

سوالات متداول

س: چگونه می توانم PostgreSQL را به جنگو در Kubernetes متصل کنم؟

پاسخ: اگر تازه شروع به کار کرده اید، من به شدت توصیه می کنم از SQLite برای صرفه جویی در هزینه و زمان توسعه استفاده کنید. با این حال، اگر ترجیح می دهید از PostgreSQL استفاده کنید، می توانید آموزش را در https://cloud.google.com/python/django/kubernetes-engine دنبال کنید.

س: کد نهایی کجاست؟

پاسخ: می‌توانید کد نهایی را در https://github.com/omkarcloud/kubernetes-website-deployment-tutorial-finished پیدا کنید.

کلمات پایانی

بابت راه اندازی موفقیت آمیز وب سایت خود تبریک می گویم! شما استقرار وب سایت را با SSL، DNS، GitHub Actions و غیره انجام داده اید.

اگر سوالی دارید، در نظرات بپرسید.


همچنین، این مقاله تحت مجوز MIT است، بنابراین شما مختار هستید تا هر طور که می خواهید از آن استفاده کنید.

اگر یوتیوبر هستید، به شما توصیه می کنم که ویدیویی از این مقاله در کانال خود ایجاد کنید. با انجام این کار، به طور بالقوه می‌توانید به هزاران توسعه‌دهنده کمک کنید تا مشکلات استقرار خود را حل کنند و مقدار زیادی پویا به دست آورند. علاوه بر این، می‌توانید URL ویدیوی خود را برای من ارسال کنید و من ویدیوی شما را در بالای مقاله قرار می‌دهم و بازدید آن را افزایش می‌دهم.

زمان دوست پول است. بنابراین اگر می‌خواهید یک توسعه‌دهنده Ninja Kubernetes برای اجرای پروژه خود استخدام کنید، با من در https://www.omkar.cloud/l/whatsapp تماس بگیرید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا