Подготовка базы данных
Сайт гостевой книги конференции предназначен для сбора отзывов во время конференций. Нам необходимо хранить комментарии, оставленные участниками конференции.
Лучше всего комментарий описывается следующей структурой данных: автор, его электронная почта, текст сообщения и фотография (необязательно). Такого рода информацию лучше всего хранить в традиционной реляционной базе данных.
Мы будем использовать сервер базы данных PostgreSQL.
Добавление PostgreSQL в Docker Compose
Для управления сервисами на локальном компьютере будем использовать Docker. Сгенерированный файл docker-compose.yml
уже содержит определение сервиса для PostgreSQL:
В результате будет установлен сервер PostgreSQL и настроены переменные окружения для имени базы данных и учётных данных. Конкретные значения сейчас не важны.
Также перенаправим порт PostgreSQL (5432
) в контейнера на локальный хост, чтобы можно было получить доступ к базе данных с нашего компьютера:
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
Добавление такого сервиса, как PostgreSQL, в инфраструктуру продакшена на Platform.sh, делается через изменения в файле .platform/services.yaml
, что уже было сделано с помощью рецепта пакета webapp
:
Сервис database
— это PostgreSQL (такой же версии, что и для Docker), который мы разместим в небольшом контейнере с диском объёмом 1 Гб.
Также необходимо "привязать" БД к контейнеру приложения, который описан в .platform.app.yaml
:
Сервис database
типа postgresql
указан как database
в контейнере приложения.
Последним шагом будет добавление PHP-модуля pdo_pgsql
:
Доступ к базе данных на 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 не отображаются в переменных окружения на локальной машине. Нужно указать это явно, используя флаг --expose-env-vars
. Почему? Подключение к базе данных на продакшен-сервере довольно опасно, поскольку есть риск повредить реальные данные.
Теперь подключитесь к удалённой базе данных 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 открыт с помощью fb425738566f2f2b0f8cd4688db5ed3fa06ed002var:export`` возвращает переменные из удалённого окружения:
1 2 3 4
$ symfony cloud:tunnel:open
$ symfony var:expose-from-tunnel
$ symfony var:export
$ symfony cloud:tunnel:close
Описание вашей инфраструктуры
Возможно, вы ещё этого не осознали, но хранение инфраструктуры в файлах вместе с кодом очень помогает в работе. Настройка инфраструктуры проекта для Docker и Platform.sh производится в конфигурационных файлах. Когда новой функциональности потребуется дополнительный сервис, изменения в коде и инфраструктуре будут зафиксированы в одном патче.