دواپسکوبرنتیز

آموزش دیپلوی لاراول (Laravel) و MySQL روی کوبرنتیز با استفاده از Helm

مقدمه

لاراول (Laravel) یکی از محبوب‌ترین فریم‌ورک‌های متن‌باز PHP است که معمولاً به همراه پایگاه داده MySQL برای توسعه وب‌سایت‌ها و اپلیکیشن‌های مدرن استفاده می‌شود.

کوبرنتیز (Kubernetes) یک پلتفرم مدیریت و ارکستراسیون کانتینرهاست که مدیریت، مقیاس‌پذیری و اجرای برنامه‌ها را در محیط پروداکشن بسیار آسان می‌کند. Helm نیز به عنوان پکیج‌منیجر کوبرنتیز عمل کرده و نصب، پیکربندی و مدیریت سرویس‌ها روی کلسترهای (Cluster) کوبرنتیز را ساده می‌سازد.

در این راهنما، ابتدا یک پروژه لاراول می‌سازیم، آن را تبدیل به ایمیج داکر (Docker Image) کرده و سپس با استفاده از Helm و زیرساخت پارمین کلود، آن را روی کلستر کوبرنتیز دیپلوی می‌کنیم. در نهایت با راه‌اندازی Ingress Controller، گواهی امنیتی رایگان SSL و دامنه اختصاصی را روی برنامه تنظیم خواهیم کرد.

پیش‌نیازها

  • نصب داکر (Docker): روی سیستمی که از طریق آن به کلستر متصل می‌شوید.

  • حساب کاربری در Docker Hub یا استفاده از رجیستری اختصاصی.

  • کلستر کوبرنتیز (Kubernetes Cluster): راه‌اندازی‌شده روی پارمین کلود به همراه ابزار kubectl.

  • پکیج منیجر Helm (نسخه ۳): نصب‌شده روی سیستم محلی.

  • یک دامنه ثبت‌شده: جهت اتصال به Ingress و دریافت گواهی SSL.

گام اول — ساخت پروژه جدید لاراول

برای شروع، با استفاده از کانتینر داکر Composer، یک پروژه جدید لاراول می‌سازیم. ابتدا به مسیر دلخواه بروید و دستور زیر را اجرا کنید (در این دستور از میرور Composer پارمین کلود استفاده شده است):

Bash

cd ~
docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes

پس از اتمام ساخت پروژه، وارد پوشه ساخت‌شده شوید:

Bash

cd ~/laravel-kubernetes

برای تست اتصال پایگاه داده در محیط وب، فایل resources/views/welcome.blade.php را باز کنید:

Bash

nano ./resources/views/welcome.blade.php

بخش <div class="links">...</div> را پیدا کرده و کد زیر را جایگزین کنید:

HTML

<div class="links">
   <strong>وضعیت اتصال به دیتابیس: </strong>
    @php
        try {
            \DB::connection()->getPDO();
            echo \DB::connection()->getDatabaseName();
        } catch (\Exception $e) {
            echo 'ارتباط برقرار نشد';
        }
    @endphp
</div>

فایل را ذخیره کرده و ببندید. این قطعه کد کوتاه، اتصال دیتابیس را بررسی کرده و نام دیتابیس متصل‌شده را در صفحه اصلی نمایش می‌دهد.

گام دوم — کانتینری‌سازی (Containerize) برنامه لاراول

برای اجرای برنامه روی کوبرنتیز، باید ابتدا آن را به یک ایمیج داکر تبدیل کنیم. یک فایل به نام Dockerfile در ریشه پروژه ایجاد کنید:

Bash

nano ./Dockerfile

محتوای زیر را درون فایل قرار دهید (این فایل بر اساس PHP 8.2 و Apache روی اوبونتو ۲۴.۰۴ تنظیم شده است):

Dockerfile

FROM php:8.2-apache

# نصب پکیج‌های مورد نیاز سیستم‌عامل
RUN apt-get update && apt-get install -y \
    git \
    zip \
    curl \
    sudo \
    unzip \
    libicu-dev \
    libbz2-dev \
    libpng-dev \
    libjpeg-dev \
    libmcrypt-dev \
    libreadline-dev \
    libfreetype6-dev \
    g++

# تنظیمات وب‌سرور Apache
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN a2enmod rewrite headers

# نصب افزونه‌های مورد نیاز PHP برای لاراول
RUN docker-php-ext-install \
    bz2 \
    intl \
    iconv \
    bcmath \
    opcache \
    calendar \
    pdo_mysql

ENV LOG_CHANNEL=stderr

# کپی Composer و نصب وابستگی‌ها با میرور پارمین کلود
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . /var/www/tmp
RUNcd /var/www/tmp && composer config repo.packagist composer https://composer.parmincloud.ir && composer install --no-dev

RUN chmod +x /var/www/tmp/docker-entrypoint.sh
ENTRYPOINT ["/var/www/tmp/docker-entrypoint.sh"]

CMD ["apache2-foreground"]

فایل را ذخیره کرده و ببندید.

حالا فایل docker-entrypoint.sh را برای انتقال کدهای برنامه به مسیر اجرای آپاچی بسازید:

Bash

nano ./docker-entrypoint.sh

کدهای زیر را درون آن قرار دهید:

Bash

#!/bin/bash
cp -R /var/www/tmp/. /var/www/html/
chown -R www-data:www-data /var/www/html
exec "$@"

دسترسی اجرای فایل را تنظیم کنید:

Bash

chmod +x ./docker-entrypoint.sh

یک فایل .dockerignore بسازید تا فایل‌های اضافی وارد ایمیج نشوند:

Bash

nano ./.dockerignore
Plaintext

.env
/vendor

برای تست محلی برنامه با Docker Compose، کلید اختصاصی لاراول (APP_KEY) را از فایل .env کپی کنید:

Bash

cat .env | grep ^APP_KEY

سپس فایل docker-compose.yml را بسازید:

Bash

nano ./docker-compose.yml
YAML

version: '3.8'
services:
  php:
    image: hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes:latest
    build: .
    restart: always
    ports:
      - 8000:80
    environment:
      - APP_KEY="مقدار_کپی_شده_کلید_لاراول"
      - APP_ENV=local
      - APP_DEBUG=true
      - DB_PORT=3306
      - DB_HOST=mysql
      - DB_DATABASE=local_db
      - DB_USERNAME=admin
      - DB_PASSWORD=password
  mysql:
    image: hub.cr.parmincloud.ir/library/mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=local_db
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=password

حالا با اجرای دستور زیر، سرویس‌ها را به صورت محلی تست کنید:

Bash

docker-compose up -d --build

پس از چند ثانیه با ورود به آدرس localhost:8000 در مرورگر، باید پیغام اتصال موفق به دیتابیس را مشاهده کنید. پس از اطمینان از صحت کارکرد، سرویس‌های محلی را متوقف کنید:

Bash

docker-compose down

گام سوم — پوش کردن ایمیج به رجیستری پارمین کلود

برای اینکه کلستر کوبرنتیز بتواند برنامه شما را دریافت و اجرا کند، باید ایمیج ساخته‌شده را به رجیستری ارسال کنید. در این مرحله از میرور Docker Hub پارمین کلود استفاده می‌کنیم.

ابتدا وارد حساب داکر خود شوید:

Bash

docker login hub.cr.parmincloud.ir

ایمیج خود را می‌سازیم و تاگ (Tag) می‌زنیم:

Bash

docker build -t hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes:latest .

پوش کردن ایمیج به رجیستری:

Bash

docker push hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes:latest

گام چهارم — تنظیم و دیپلوی برنامه با Helm

برای دیپلوی آسان‌تر روی کوبرنتیز، از چارت‌های آماده Helm استفاده می‌کنیم. ابتدا یک پوشه برای تنظیمات Helm ایجاد کنید:

Bash

mkdir ./helm

فایل helm/values.yml را ایجاد کنید:

Bash

nano ./helm/values.yml
YAML

php:
  repository: "hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes"
  tag: "latest"
  fpmEnabled: false
  envVars:
    - name: APP_ENV
      value: production
    - name: APP_DEBUG
      value: false
    - name: DB_PORT
      value: 3306
    - name: DB_HOST
      value: localhost

سپس فایل helm/secrets.yml را برای نگهداری اطلاعات حساس (مانند رمز دیتابیس) ایجاد کنید:

Bash

nano ./helm/secrets.yml
YAML

mysql:
  rootPassword: "your_database_root_password"
  user: your_database_user
  password: "your_database_password"
  database: your_database_name
php:
  envVars:
    - name: APP_KEY
      value: "your_laravel_app_key"
    - name: DB_DATABASE
      value: your_database_name
    - name: DB_USERNAME
      value: your_database_user
    - name: DB_PASSWORD
      value: "your_database_password"

برای جلوگیری از افشای اطلاعات حساس، فایل secrets.yml را به .gitignore و .dockerignore اضافه کنید:

Bash

echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore

حالا با اجرای دستور زیر چارت را روی کلستر کوبرنتیز پارمین کلود نصب و دیپلوی کنید:

Bash

helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml bitnami/lamp

جهت بررسی وضعیت Podها و Serviceها دستور زیر را وارد کنید:

Bash

kubectl get pods
kubectl get services -w

گام پنجم — پیکربندی Ingress Controller و SSL

برای اتصال دامنه واقعی و فعال‌سازی SSL رایگان (Let’s Encrypt)، فایل helm/values.yml را ویرایش کرده و Ingress را فعال کنید:

Bash

nano ./helm/values.yml
YAML

service:
  type: ClusterIP
  HTTPPort: 80
ingress:
  enabled: true
  domain: your_domain.com

سپس چارت را آپگرید کنید:

Bash

helm upgrade laravel-kubernetes -f helm/values.yml -f helm/secrets.yml bitnami/lamp

نصب Nginx Ingress Controller:

Bash

helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

ایجاد فایل ingress.yml برای تعریف مسیرها:

Bash

nano ./ingress.yml
YAML

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: laravel-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - your_domain.com
      secretName: laravel-kubernetes-tls
  rules:
    - host: your_domain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: laravel-kubernetes-lamp
                port:
                  number: 80

برای دریافت گواهی SSL، ابزار Cert-Manager را روی کلستر نصب کنید:

Bash

kubectl apply --validate=false -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.crds.yaml
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager --namespace cert-manager jetstack/cert-manager

یک فایل پیکربندی به نام production_issuer.yml ایجاد کنید:

Bash

nano ./production_issuer.yml
YAML

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: your_email_address@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-private-key
    solvers:
      - http01:
          ingress:
            class: nginx

منابع جدید را اپلای کنید:

Bash

kubectl apply -f ingress.yml
kubectl apply -f production_issuer.yml

در نهایت آی‌پی عمومی (External IP) مربوط به Ingress Controller را دریافت کنید:

Bash

kubectl get service nginx-ingress-ingress-nginx-controller

آدرس IP دریافتی را در پنل مدیریت DNS دامنه خود، روی یک A Record به سمت دامنه your_domain.com تنظیم کنید.

گام ششم — اجرای دستورات Artisan روی Pod لاراول

پس از بالا آمدن کامل پروژه، برای اجرای مایگریشن‌های دیتابیس (Database Migrations) ابتدا نام Pod برنامه را پیدا کنید:

Bash

kubectl get pods

پس از کپی کردن نام Pod لاراول، دستور زیر را برای اجرای مایگریشن داخل Pod اجرا نمایید:

Bash

kubectl exec -it <laravel-pod-name> -- php artisan migrate --force

جمع‌بندی

در این مقاله آموختید که چگونه یک پروژه لاراول را کانتینری کرده، با استفاده از میرورهای سرعت‌بالای پارمین کلود ایمیج‌های آن را مدیریت کنید و به کمک Helm و کوبرنتیز، یک زیرساخت مقیاس‌پذیر همراه با SSL رایگان برای وب‌سایت خود راه‌اندازی کنید.

از همراهی شما با پارمین کلود سپاسگزاریم.

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

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

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

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