Налаштування бази даних

Налаштування бази даних

Веб-сайт гостьової книги конференції потрібен для збору відгуків під час конференцій. Нам потрібно зберігати коментарі учасників конференції в постійному сховищі.

Коментар найкраще описується фіксованою структурою даних: автор, його адреса електронної пошти, текст відгуку й необов'язкове поле: фото. Тип даних, які краще за все зберігати у традиційній системі керування базою даних.

Ми будемо використовувати систему керування базою даних PostgreSQL.

Додавання PostgreSQL до Docker Compose

Для управління сервісами на нашому локальному комп'ютері ми вирішили використовувати Docker. Згенерований файл docker-compose.yml вже містить PostgreSQL як сервіс:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
###> doctrine/doctrine-bundle ###
database:
    image: postgres:${POSTGRES_VERSION:-13}-alpine
    environment:
    POSTGRES_DB: ${POSTGRES_DB:-app}
    # You should definitely change the password in production
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ChangeMe}
    POSTGRES_USER: ${POSTGRES_USER:-symfony}
volumes:
    - db-data:/var/lib/postgresql/data:rw
    # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
    # - ./docker/db/data:/var/lib/postgresql/data:rw
###< doctrine/doctrine-bundle ###

Це дозволить встановити сервер PostgreSQL і налаштувати деякі змінні середовища, що контролюють ім'я й облікові записи бази даних. Значення, насправді, не є важливими.

Ми також відкриваємо порт PostgreSQL (5432) контейнера локальному хосту. Це допоможе отримати доступ до бази даних з нашого комп'ютера:

docker-compose.override.yml
1
2
3
4
5
###> doctrine/doctrine-bundle ###
database:
    ports:
    - "5432"
###< doctrine/doctrine-bundle ###

Note

Розширення pdo_pgsql мало бути встановлено разом із PHP, на попередньому кроці.

Запуск 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 Compose:

1
$ docker-compose logs

Доступ до локальної бази даних

Використання утиліти командного рядка psql може бути корисним, час від часу. Але вам необхідно запам'ятати облікові дані та ім’я бази даних. Менш очевидно, що вам також потрібно знати локальний порт, на якому працює база даних. Docker обирає випадковий порт, щоб ви могли одночасно працювати над декількома проектами, що використовують PostgreSQL (локальний порт є частиною виводу docker-compose ps).

Якщо ви запускаєте psql за допомогою Symfony CLI, вам не потрібно нічого запам'ятовувати.

Symfony CLI автоматично виявляє сервіси Docker, запущені для проекту, і виставляє змінні середовища, необхідні psql для підключення до бази даних.

Завдяки цим домовленостям, доступ до бази даних за допомогою команди symfony run — набагато легший:

1
$ symfony run psql

Note

Якщо у вас немає доступу до бінарного файлу psql на локальному хості, ви можете запустити його за допомогою docker-compose:

1
$ docker-compose exec database psql main main

Резервне копіювання і відновлення бази даних

Використовуйте pg_dump, щоб створити резервну копію бази даних:

1
$ symfony run pg_dump --data-only > dump.sql

І відновіть дані:

1
$ symfony run psql < dump.sql

Додавання PostgreSQL до Platform.sh

Для продакшн-інфраструктури у Platform.sh додавання такого сервісу, як PostgreSQL, виконується у файлі .platform/services.yaml, що вже було зроблено за допомогою рецепту пакету webapp:

.platform/services.yaml
1
2
3
database:
    type: postgresql:13
    disk: 1024

Сервіс database є базою даних PostgreSQL (та ж версія, що і для Docker), який ми хочемо розмістити на диску об'ємом 1 ГБ.

Нам також потрібно "зв'язати" БД з контейнером застосунку, який описаний у .platform.app.yaml:

.platform.app.yaml
1
2
relationships:
    database: "database:postgresql"

Сервіс database типу postgresql позначається як database у контейнері застосунку.

Переконайтеся, що розширення pdo_pgsql вже встановлено для середовища виконання PHP:

.platform.app.yaml
1
2
3
4
5
runtime:
    extensions:
        # other extensions
        - pdo_pgsql
        # other extensions

Доступ до бази даних у Platform.sh

PostgreSQL тепер працює як локально, за допомогою Docker, так і в продакшн, у Platform.sh.

Як ми щойно побачили, під час виконання команди symfony run psql відбувається автоматичне підключення до бази даних, розміщеної у контейнері Docker. Це відбувається завдяки змінним середовища, що встановлені командою symfony run.

Якщо ви хочете під'єднатися до PostgreSQL, розміщеному у продакшн контейнері, ви можете відкрити тунель SSH між локальним комп'ютером і інфраструктурою Platform.sh:

1
2
$ symfony cloud:tunnel:open
$ symfony var:expose-from-tunnel

За замовчуванням сервіси Platform.sh не відображаються як змінні середовища на локальному комп'ютері. Ви маєте налаштувати це явно, виконавши команду var:expose-from-tunnel. Чому? Підключення до до бази даних у продакшн є небезпечною операцією. Ви можете навести безлад у реальних даних.

Тепер, підключіться до віддаленої бази даних PostgreSQL, за допомогою команди symfony run psql, як і раніше:

1
$ symfony run psql

Коли завершите роботу, не забудьте закрити тунель:

1
$ symfony cloud:tunnel:close

Tip

Для виконання деяких SQL-запитів до бази даних у продакшн, замість використання інтерактивної оболонки, можна також використовувати команду symfony sql.

Перегляд змінних середовища

Docker Compose й Platform.sh легко працюють із Symfony завдяки змінним середовища.

Перевірте всі змінні середовища, що надані symfony, виконавши symfony var:export:

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. А як щодо інших?

Коли тунель до Platform.sh відкрито за допомогою команди var:expose-from-tunnel, команда var:export повертає змінні віддаленого середовища:

1
2
3
4
$ symfony cloud:tunnel:open
$ symfony var:expose-from-tunnel
$ symfony var:export
$ symfony cloud:tunnel:close

Опис вашої інфраструктури

You might not have realized it yet, but having the infrastructure stored in files alongside of the code helps a lot. Docker and Platform.sh use configuration files to describe the project infrastructure. When a new feature needs an additional service, the code changes and the infrastructure changes are part of the same patch.

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.