Шаг 7: Подготовка базы данных

5.0 version
Maintained

Подготовка базы данных

Сайт гостевой книги конференции предназначен для сбора отзывов во время конференций. Нам необходимо хранить комментарии, оставленные участниками конференции.

Лучше всего комментарий описывается следующей структурой данных: автор, его электронная почта, текст сообщения и фотография (необязательно). Такого рода информацию лучше всего хранить в традиционной реляционной базе данных.

Мы будем использовать сервер базы данных 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 версии 11 и настроены переменные окружения для имени базы данных и учётных данных. Конкретные значения сейчас не важны.

Также откроем порт PostgreSQL (5432) у контейнера для доступа к нему с локального хоста, чтобы получить доступ к базе данных с нашего компьютера.

Примечание

Модуль 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

Примечание

Если на вашем локальном хосте не установлена команда psql, вы можете запустить её через docker:

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

Добавление PostgreSQL в SymfonyCloud

Добавление такого сервиса, как PostgreSQL, в инфраструктуру продакшена на SymfonyCloud, делается через изменения в файле .symfony/services.yaml, который пока ещё пуст:

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

Сервис db — это PostgreSQL 11 (как и в Docker), который мы разместим в небольшом контейнере с диском объёмом 1 Гб.

Также необходимо «привязать» БД к контейнеру приложения, который описан в .symfony.cloud.yaml:

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

Сервис db типа postgresql указан как database в контейнере приложения.

Последним шагом будет добавление PHP-модуля pdo_pgsql:

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

Вот полный результат изменений в файле .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:
         "/":

Зафиксируйте изменения в репозитории, а затем повторно разверните в SymfonyCloud:

1
2
3
$ git add .
$ git commit -m'Configuring the database'
$ symfony deploy

Доступ к базе данных на SymfonyCloud

PostgreSQL теперь работает как локально через Docker, так и на продакешене в SymfonyCloud.

Как мы только что увидели, при запуске symfony run psql происходит автоматическое подключение к базе данных, размещённой в контейнере Docker. Это происходит благодаря переменным окружения, установленным командой symfony run.

Если вы хотите подключиться к PostgreSQL, расположенном в контейнерах на продакшене, вы можете открыть SSH-туннель между вашей локальной машиной и инфраструктурой SymfonyCloud:

1
$ symfony tunnel:open --expose-env-vars

По умолчанию сервисы SymfonyCloud не отображаются в переменных окружения на локальной машине. Вы должны сделать это явно, используя флаг --expose-env-vars. Почему? Подключение к базе данных на продакшене является опасной операцией. Вы можете испортить реальные данные. Указывая этот флаг, вы подтверждаете, что действительно хотите это сделать.

Теперь подключитесь к удалённой базе данных PostgreSQL с помощью команды symfony run psql, как раньше:

1
$ symfony run psql

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

1
$ symfony tunnel:close

Совет

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

Просмотр переменных окружения

Docker Compose и SymfonyCloud отлично работают с 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. А остальные?

Когда туннель к 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.