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

معرفی
این را تصویر کنید: 📸 شما یک وب سایت خیره کننده ایجاد کرده اید، و اکنون زمان آن رسیده که آن را در دسترس جهانیان قرار دهید. اما روند استقرار دلهره آور به نظر می رسد، درست است؟ 😰
نترسید، زیرا 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
برای اینکه غلافهای باطنی و فرانتاند درون خوشه قابل دسترسی باشند، فایلهای مانیفست زیر را ایجاد کنید:
- استقرار 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
- استقرار 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 را راه اندازی می کنیم.
من به شما می گویم زمانی که شما نیاز به تغییر برخی از متغیرها دارید. لطفاً فقط متغیرهایی را که به شما می گویم تغییر دهید و سایر متغیرها را دست نخورده نگه دارید، مانند نام خوشه و منطقه و غیره.
از آنجایی که آنها هاردکد هستند و چندین بار در دستورات این آموزش استفاده خواهند شد. هنگامی که با آموزش آشنا شدید، با خیال راحت نام آنها را مطابق با اولویت خود تغییر دهید.
- 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
- در نوار کناری، روی دکمه “Kubernetes Engine” کلیک کنید.
- برای ایجاد یک خوشه جدید بر روی دکمه “ایجاد” کلیک کنید. خوشه “Standard Mode” را پیکربندی کنید، زیرا مقرون به صرفه تر است.
- جزئیات زیر را برای خوشه ارائه دهید:
Cluster Name: my-application-cluster
Location Type: zonal
Zone: asia-south1-a
- در نوار کناری، “default-pool” را انتخاب کنید و برای صرفه جویی در هزینه، تعداد گره ها را به جای 3 به 1 تغییر دهید.
- در نوار کناری، “Nodes” را انتخاب کنید و از تنظیمات زیر برای صرفه جویی در هزینه استفاده کنید:
Machine Type: e2-small
Boot Disk Size: 20 GB
هزینه تخمینی باید حدود 90 دلار باشد. اگر این اولین خوشه شما در GCP است، پس از تخفیف ۱ ماهه و تخفیف ۷۳ دلاری برای اولین خوشه، هزینه آن حدود \$27 کسر میشود.
-
روی دکمه “ایجاد” کلیک کنید و خوشه تقریباً در عرض 5-6 دقیقه ایجاد می شود.
-
با کلیک بر روی نماد پوسته در گوشه سمت راست بالا، GCP Shell را باز کنید.
- با اجرای دستور زیر در خوشه خود احراز هویت کنید. نام پروژه GCP خود را جایگزین «clear-world-31478» کنید.
gcloud container clusters get-credentials my-application-cluster --zone asia-south1-a --project clear-world-31478
- با اجرای دستور زیر یک آدرس IP ایجاد کنید:
gcloud compute addresses create my-application-cluster-ip --region asia-south1
- با اجرای دستور به آدرس IP ایجاد شده توجه کنید:
gcloud compute addresses describe my-application-cluster-ip --region asia-south1
- در ارائه دهنده خدمات نام دامنه (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 منتشر شود.
- برای نصب دستورات زیر را اجرا کنید
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 را برای گردش کار استقرار خود پیکربندی می کنیم و کد را فشار می دهیم.
-
یک مخزن Github ایجاد کنید
-
با مراجعه به https://console.cloud.google.com/iam-admin/serviceaccounts یک فایل JSON حساب سرویس ایجاد کنید. حساب سرویس به تمام منابع (مالک) در Google Cloud (GCP) دسترسی کامل خواهد داشت. فایل JSON را ایمن نگه دارید، زیرا برای استقرار در Google Kubernetes Engine (GKE) لازم است. فایل را به عنوان account.json ذخیره کنید.
- اسرار 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
.
- حالا کد را به مخزن فشار دهید. پس از فشار دادن، سایت 4-5 دقیقه پس از تکمیل اکشن GitHub آماده خواهد شد. 4-5 دقیقه طول می کشد زیرا گواهی های SSL و غیره را دریافت می کند.
با مراجعه به Action Tabs مخزن Github خود می توانید وضعیت اقدامات خود را مشاهده کنید.
پس از اتمام Action، می توانید به وب سایت در دامنه خود دسترسی داشته باشید.
منابع را حذف کنید
به خاطر داشته باشید که برای جلوگیری از تحمیل هزینه، منابع GCP را حذف کنید. برای حذف منابع GCP مراحل زیر را دنبال کنید:
- با اجرای دستور زیر آدرس IP ایجاد شده را حذف کنید. در این دستور، «clear-world-31478» را با نام پروژه GCP خود جایگزین کنید.
gcloud compute addresses delete my-application-cluster-ip --region asia-south1 --project clear-world-31478
- از داشبورد 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 تماس بگیرید.