گام 7: راه‌اندازی یک پایگاه‌داده

5.0 version
Maintained

راه‌اندازی یک پایگاه‌داده

وبسایت کنفرانس Guestbook، در حال گرفتن بازخورد‌ها در طول کنفرانس است. ما نیاز داریم کامنت‌هایی که توسط شرکت‌کنندگان کنفرانس اظهار شده است را در یک انبار دائمی ذخیره‌سازی کنیم.

یک کامنت به بهترین وجه توسط یک داده‌ساختار ثابت بیان می‌شود: یک نویسنده، رایانامه‌ی نویسنده، متن بازخورد و یک تصویر اختیاری. نوعی از داده که می‌تواند به بهترین وجه در یک موتور پایگاه‌داده‌ی رابطه‌ای سنتی ذخیره شود.

PostgreSQL موتور پایگاه‌داده‌ای است که ما از آن استفاده خواهیم کرد.

افزودن PostgreSQL به Docker Compose

ما تصمیم گرفتیم که در رایانه‌ی محلی‌مان، از Docker برای مدیریت سرویس‌ها استفاده کنیم. یک فایل docker-compose.yaml ایجاد کنید و PostgreSQL را به عنوان سرویس به آن بیافزایید:

docker-compose.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3'

services:
    database:
        image: postgres:11-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

توجه

اگر شما باینری مربوط به psql را بر روی رایانه‌ی محلی‌تان ندارید، می‌توانید از طریق docker آن را اجرا کنید:

1
$ docker exec -it guestbook_database_1 psql -U main -W main

افزودن PostgreSQL به SymfonyCloud

برای زیرساخت عمل‌آوری بر روی SymfonyCloud، افزودن یک سرویس همچون PostgreSQL، باید از طریق فایل .symfony/services.yaml که در حال حاضر خالی است، انجام شود:

.symfony/services.yaml
1
2
3
4
db:
    type: postgresql:11
    disk: 1024
    size: S

سرویس db یک پایگاه‌داده‌ی PostgreSQL با نسخه‌ی ۱۱ (همچون Docker) است که می‌خواهیم بر روی کانتینری کوچک با 1GB دیسک مهیا شود.

همچنین نیاز داریم تا پایگاه‌داده را به کانتینر اپلیکیشن «متصل (link)» کنیم، که این موضوع در فایل .symfony.cloud.yaml توصیف شده است:

.symfony.cloud.yaml
1
2
relationships:
    database: "db:postgresql"

سرویس db از نوع postgresql در کانتینر اپلیکیشن به عنوان database ارجاع داده شده است.

آخرین گام، اضافه کردن افزونه‌ی pdo_pgsql به PHP است:

.symfony.cloud.yaml
1
2
3
4
runtime:
    extensions:
        - pdo_pgsql
        # other extensions here

این diff کاملِ مربوط به تغییرات فایل .symfony.cloud.yaml است:

patch_file
 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.3

 runtime:
     extensions:
+        - pdo_pgsql
         - apcu
         - mbstring
         - sodium
@@ -12,6 +13,9 @@ runtime:
 build:
     flavor: none

+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.