
مقدمه
لاراول (Laravel) یکی از محبوبترین فریمورکهای متنباز PHP است که معمولاً به همراه پایگاه داده MySQL برای توسعه وبسایتها و اپلیکیشنهای مدرن استفاده میشود.
کوبرنتیز (Kubernetes) یک پلتفرم مدیریت و ارکستراسیون کانتینرهاست که مدیریت، مقیاسپذیری و اجرای برنامهها را در محیط پروداکشن بسیار آسان میکند. Helm نیز به عنوان پکیجمنیجر کوبرنتیز عمل کرده و نصب، پیکربندی و مدیریت سرویسها روی کلسترهای (Cluster) کوبرنتیز را ساده میسازد.
در این راهنما، ابتدا یک پروژه لاراول میسازیم، آن را تبدیل به ایمیج داکر (Docker Image) کرده و سپس با استفاده از Helm و زیرساخت پارمین کلود، آن را روی کلستر کوبرنتیز دیپلوی میکنیم. در نهایت با راهاندازی Ingress Controller، گواهی امنیتی رایگان SSL و دامنه اختصاصی را روی برنامه تنظیم خواهیم کرد.
پیشنیازها
-
نصب داکر (Docker): روی سیستمی که از طریق آن به کلستر متصل میشوید.
-
حساب کاربری در Docker Hub یا استفاده از رجیستری اختصاصی.
-
کلستر کوبرنتیز (Kubernetes Cluster): راهاندازیشده روی پارمین کلود به همراه ابزار
kubectl. -
پکیج منیجر Helm (نسخه ۳): نصبشده روی سیستم محلی.
-
یک دامنه ثبتشده: جهت اتصال به Ingress و دریافت گواهی SSL.
گام اول — ساخت پروژه جدید لاراول
برای شروع، با استفاده از کانتینر داکر Composer، یک پروژه جدید لاراول میسازیم. ابتدا به مسیر دلخواه بروید و دستور زیر را اجرا کنید (در این دستور از میرور Composer پارمین کلود استفاده شده است):
cd ~
docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes
پس از اتمام ساخت پروژه، وارد پوشه ساختشده شوید:
cd ~/laravel-kubernetes
برای تست اتصال پایگاه داده در محیط وب، فایل resources/views/welcome.blade.php را باز کنید:
nano ./resources/views/welcome.blade.php
بخش <div class="links">...</div> را پیدا کرده و کد زیر را جایگزین کنید:
<div class="links">
<strong>وضعیت اتصال به دیتابیس: </strong>
@php
try {
\DB::connection()->getPDO();
echo \DB::connection()->getDatabaseName();
} catch (\Exception $e) {
echo 'ارتباط برقرار نشد';
}
@endphp
</div>
فایل را ذخیره کرده و ببندید. این قطعه کد کوتاه، اتصال دیتابیس را بررسی کرده و نام دیتابیس متصلشده را در صفحه اصلی نمایش میدهد.
گام دوم — کانتینریسازی (Containerize) برنامه لاراول
برای اجرای برنامه روی کوبرنتیز، باید ابتدا آن را به یک ایمیج داکر تبدیل کنیم. یک فایل به نام Dockerfile در ریشه پروژه ایجاد کنید:
nano ./Dockerfile
محتوای زیر را درون فایل قرار دهید (این فایل بر اساس PHP 8.2 و Apache روی اوبونتو ۲۴.۰۴ تنظیم شده است):
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 را برای انتقال کدهای برنامه به مسیر اجرای آپاچی بسازید:
nano ./docker-entrypoint.sh
کدهای زیر را درون آن قرار دهید:
#!/bin/bash
cp -R /var/www/tmp/. /var/www/html/
chown -R www-data:www-data /var/www/html
exec "$@"
دسترسی اجرای فایل را تنظیم کنید:
chmod +x ./docker-entrypoint.sh
یک فایل .dockerignore بسازید تا فایلهای اضافی وارد ایمیج نشوند:
nano ./.dockerignore
.env
/vendor
برای تست محلی برنامه با Docker Compose، کلید اختصاصی لاراول (APP_KEY) را از فایل .env کپی کنید:
cat .env | grep ^APP_KEY
سپس فایل docker-compose.yml را بسازید:
nano ./docker-compose.yml
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
حالا با اجرای دستور زیر، سرویسها را به صورت محلی تست کنید:
docker-compose up -d --build
پس از چند ثانیه با ورود به آدرس localhost:8000 در مرورگر، باید پیغام اتصال موفق به دیتابیس را مشاهده کنید. پس از اطمینان از صحت کارکرد، سرویسهای محلی را متوقف کنید:
docker-compose down
گام سوم — پوش کردن ایمیج به رجیستری پارمین کلود
برای اینکه کلستر کوبرنتیز بتواند برنامه شما را دریافت و اجرا کند، باید ایمیج ساختهشده را به رجیستری ارسال کنید. در این مرحله از میرور Docker Hub پارمین کلود استفاده میکنیم.
ابتدا وارد حساب داکر خود شوید:
docker login hub.cr.parmincloud.ir
ایمیج خود را میسازیم و تاگ (Tag) میزنیم:
docker build -t hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes:latest .
پوش کردن ایمیج به رجیستری:
docker push hub.cr.parmincloud.ir/your_docker_hub_username/laravel-kubernetes:latest
گام چهارم — تنظیم و دیپلوی برنامه با Helm
برای دیپلوی آسانتر روی کوبرنتیز، از چارتهای آماده Helm استفاده میکنیم. ابتدا یک پوشه برای تنظیمات Helm ایجاد کنید:
mkdir ./helm
فایل helm/values.yml را ایجاد کنید:
nano ./helm/values.yml
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 را برای نگهداری اطلاعات حساس (مانند رمز دیتابیس) ایجاد کنید:
nano ./helm/secrets.yml
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 اضافه کنید:
echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore
حالا با اجرای دستور زیر چارت را روی کلستر کوبرنتیز پارمین کلود نصب و دیپلوی کنید:
helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml bitnami/lamp
جهت بررسی وضعیت Podها و Serviceها دستور زیر را وارد کنید:
kubectl get pods
kubectl get services -w
گام پنجم — پیکربندی Ingress Controller و SSL
برای اتصال دامنه واقعی و فعالسازی SSL رایگان (Let’s Encrypt)، فایل helm/values.yml را ویرایش کرده و Ingress را فعال کنید:
nano ./helm/values.yml
service:
type: ClusterIP
HTTPPort: 80
ingress:
enabled: true
domain: your_domain.com
سپس چارت را آپگرید کنید:
helm upgrade laravel-kubernetes -f helm/values.yml -f helm/secrets.yml bitnami/lamp
نصب Nginx Ingress Controller:
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true
ایجاد فایل ingress.yml برای تعریف مسیرها:
nano ./ingress.yml
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 را روی کلستر نصب کنید:
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 ایجاد کنید:
nano ./production_issuer.yml
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
منابع جدید را اپلای کنید:
kubectl apply -f ingress.yml
kubectl apply -f production_issuer.yml
در نهایت آیپی عمومی (External IP) مربوط به Ingress Controller را دریافت کنید:
kubectl get service nginx-ingress-ingress-nginx-controller
آدرس IP دریافتی را در پنل مدیریت DNS دامنه خود، روی یک A Record به سمت دامنه your_domain.com تنظیم کنید.
گام ششم — اجرای دستورات Artisan روی Pod لاراول
پس از بالا آمدن کامل پروژه، برای اجرای مایگریشنهای دیتابیس (Database Migrations) ابتدا نام Pod برنامه را پیدا کنید:
kubectl get pods
پس از کپی کردن نام Pod لاراول، دستور زیر را برای اجرای مایگریشن داخل Pod اجرا نمایید:
kubectl exec -it <laravel-pod-name> -- php artisan migrate --force
جمعبندی
در این مقاله آموختید که چگونه یک پروژه لاراول را کانتینری کرده، با استفاده از میرورهای سرعتبالای پارمین کلود ایمیجهای آن را مدیریت کنید و به کمک Helm و کوبرنتیز، یک زیرساخت مقیاسپذیر همراه با SSL رایگان برای وبسایت خود راهاندازی کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.




