گام 7: راهاندازی یک پایگاهداده
راهاندازی یک پایگاهداده¶
وبسایت کنفرانس Guestbook، در حال گرفتن بازخوردها در طول کنفرانس است. ما نیاز داریم کامنتهایی که توسط شرکتکنندگان کنفرانس اظهار شده است را در یک انبار دائمی ذخیرهسازی کنیم.
یک کامنت به بهترین وجه توسط یک دادهساختار ثابت بیان میشود: یک نویسنده، رایانامهی نویسنده، متن بازخورد و یک تصویر اختیاری. نوعی از داده که میتواند به بهترین وجه در یک موتور پایگاهدادهی رابطهای سنتی ذخیره شود.
PostgreSQL موتور پایگاهدادهای است که ما از آن استفاده خواهیم کرد.
افزودن PostgreSQL به Docker Compose¶
ما تصمیم گرفتیم که در رایانهی محلیمان، از Docker برای مدیریت سرویسها استفاده کنیم. یک فایل docker-compose.yaml
ایجاد کنید و PostgreSQL را به عنوان سرویس به آن بیافزایید:
1 2 3 4 5 6 7 8 9 10 | version: '3'
services:
database:
image: postgres:13-alpine
environment:
POSTGRES_USER: main
POSTGRES_PASSWORD: main
POSTGRES_DB: main
ports: [5432]
|
این یک سرور PostgreSQL با نسخهی ۱۱ را نصب خواهد کرد و همچنین تعدادی متغیر محیط را برای کنترل نام پایگاهداده و اعتبارنامهها (credentials)، پیکربندی میکند. مقادیر آن واقعاً اهمیتی ندارند.
همچنین درگاه (port) مربوط به کانتینر PostgreSQL (یعنی درگاه 5432
) را در اختیار میزبان محلی میگذاریم. این کمک میکند تا از طریق رایانهی محلی به پایگاهداده دسترسی داشته باشیم.
توجه
هنگامی که PHP در گام قبلی تنظیم شد، افزونهی pdo_pgsql
میبایست نصب میگردید.
اجرای Docker Compose¶
Docker Compose را در پس زمینه (-d
) اجرا کنید:
1 | $ docker-compose up -d
|
مقداری صبر کنید و اجازه دهید تا پایگاهداده راهاندازی شود. سپس بررسی کنید که همه چیز به صورت صحیح در حال اجرا است:
1 2 3 4 5 | $ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------
guestbook_database_1 docker-entrypoint.sh postgres Up 0.0.0.0:32780->5432/tcp
|
اگر هیچ کانتینری در حال اجرا نیست یا ستون State
دارای مقدار Up
نیست، لاگهای Docker را بررسی کنید:
1 | $ docker-compose logs
|
دسترسی به پایگاهدادهی محلی¶
گاهی اوقات استفاده از ابزار خط فرمان psql
، میتواند مفید واقع شود. اما شما باید اعتبارنامهها و نام پایگاهداده را به خاطر بیاورید. همچنین باید درگاه محلی پایگاهدادهی در حال اجرا بر روی میزبان را بدانید. Docker یک درگاه تصادفی را انتخاب میکند تا بتوانید به صورت همزمان بر روی بیش از یک پروژه که از PostgreSQL استفاده میکند، کار کنید (درگاه محلی بخشی از خروجی فرمان docker-compose ps
است).
اگر فرمان psql
را از طریق رابط خط فرمان سیمفونی اجرا کنید، نیاز نیست که هیچ چیزی را به خاطر آورید.
رابط خط فرمان سیمفونی، به صورت خودکار تمام سرویسهایی که پروژه را اجرا میکنند، شناسایی کرده و متغیرهای محیط لازم برای فرمان psql
جهت اتصال به پایگاهداده را در اختیار فرمان قرار میدهد.
به کمک این قراردادها، دسترسی به پایگاهداده از طریق symfony run
بسیار راحتتر است:
1 | $ symfony run psql
|
توجه
If you don't have the psql
binary on your local host, you can also run
it via docker-compose
:
1 | $ docker-compose exec database psql main
|
افزودن PostgreSQL به SymfonyCloud¶
برای زیرساخت عملآوری بر روی SymfonyCloud، افزودن یک سرویس همچون PostgreSQL، باید از طریق فایل .symfony/services.yaml
که در حال حاضر خالی است، انجام شود:
1 2 3 4 | db:
type: postgresql:13
disk: 1024
size: S
|
سرویس db
یک پایگاهدادهی PostgreSQL با نسخهی ۱۱ (همچون Docker) است که میخواهیم بر روی کانتینری کوچک با 1GB دیسک مهیا شود.
همچنین نیاز داریم تا پایگاهداده را به کانتینر اپلیکیشن «متصل (link)» کنیم، که این موضوع در فایل .symfony.cloud.yaml
توصیف شده است:
1 2 | relationships:
database: "db:postgresql"
|
سرویس db
از نوع postgresql
در کانتینر اپلیکیشن به عنوان database
ارجاع داده شده است.
آخرین گام، اضافه کردن افزونهی pdo_pgsql
به PHP است:
1 2 3 4 | runtime:
extensions:
- pdo_pgsql
# other extensions here
|
این diff کاملِ مربوط به تغییرات فایل .symfony.cloud.yaml
است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | --- a/.symfony.cloud.yaml
+++ b/.symfony.cloud.yaml
@@ -4,6 +4,7 @@ type: php:7.4
runtime:
extensions:
+ - pdo_pgsql
- apcu
- mbstring
- sodium
@@ -21,6 +22,9 @@ build:
disk: 512
+relationships:
+ database: "db:postgresql"
+
web:
locations:
"/":
|
این تغییرات را commit کنید و مجدداً اپلیکیشن را در SymfonyCloud مستقر کنید:
1 2 3 | $ git add .
$ git commit -m'Configuring the database'
$ symfony deploy
|
دسترسی به پایگاهدادهی SymfonyCloud¶
حالا PostgreSQL هم بر روی رایانهی محلیتان از طریق Docker و هم در محیط عملآوری بر روی SymfonyCloud در حال اجرا است.
همانطور که مشاهده کردیم، به لطف متغیرهای محیط ارائهشده توسط symfony run
، اجرای symfony run psql
به صورت خودکار به پایگاهدادهی میزبانیشده توسط Docker متصل میشود.
اگر میخواهید به PostgreSQL میزبانیشده در کانتینرهای عملآوری متصل شوید، میتوانید یک تونل SSH میان رایانهی محلی و زیرساخت SymfonyCloud برقرار کنید:
1 | $ symfony tunnel:open --expose-env-vars
|
به صورت پیشفرض، سرویسهای SymfonyCloud به صورت متغیرهای محیط در اختیار رایانهی محلیتان نیستند. اگر خلاف این را میخواهید، باید صریحاً از پرچم --expose-env-vars
استفاده کنید. چرا؟ اتصال به پایگاهدادهی عملآوری، عملیاتی خطرناک است. شما ممکن است با دادههای واقعی خرابکاری کنید. الزام استفاده از پرچم روشی است که شما از طریق آن، تأیید میکنید که این همان چیزی است که میخواهید.
حالا از طریق فرمان symfony run psql
، همچون گذشته به پایگاهدادهی PostgreSQL ریموت متصل شوید:
1 | $ symfony run psql
|
فراموش نکنید که پس از پایان کار، تونل را ببندید:
1 | $ symfony tunnel:close
|
نکته
برای اجرای تعدادی پرسوجوی SQL بر روی پایگاهدادهی عملآوری، به جای استفاده از شِل (shell)، میتوانید از فرمان symfony sql
نیز استفاده کنید.
ارائهی متغیرهای محیط¶
به لطف متغیرهای محیط، Docker Compose و SymfonyCloud به صورت یکپارچه با یکدیگر کار میکنند.
با اجرای فرمان symfony var:export
تمام متغیرهای محیط ارائهشده توسط symfony
را بررسی کنید:
1 2 3 4 5 6 7 8 | $ symfony var:export
PGHOST=127.0.0.1
PGPORT=32781
PGDATABASE=main
PGUSER=main
PGPASSWORD=main
# ...
|
متغیرهای محیط PG*
توسط ابزار psql
خوانده میشوند. سایر موارد چطور؟
زمانی که یک تونل به SymfonyCloud همراه با پرچم --expose-env-vars
باز است، فرمان var:export
متغیرهای محیط ریموت را بازمیگرداند:
1 2 3 | $ symfony tunnel:open --expose-env-vars
$ symfony var:export
$ symfony tunnel:close
|
- « Previous گام 6: ساخت یک کنترلر
- Next » گام 8: توصیف ساختار داده
This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.