Skip to content
  • About
    • What is Symfony?
    • Community
    • News
    • Contributing
    • Support
  • Documentation
    • Symfony Docs
    • Symfony Book
    • Screencasts
    • Symfony Bundles
    • Symfony Cloud
    • Training
  • Services
    • Platform.sh for Symfony Best platform to deploy Symfony apps
    • SymfonyInsight Automatic quality checks for your apps
    • Symfony Certification Prove your knowledge and boost your career
    • SensioLabs Professional services to help you with Symfony
    • Blackfire Profile and monitor performance of your apps
  • Other
  • Blog
  • Download
sponsored by
  1. Home
  2. Documentation
  3. Symfony: The Fast Track
  4. Russian
  5. Подготовка базы данных

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

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

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

Мы будем использовать сервер базы данных 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

Добавление такого сервиса, как PostgreSQL, в инфраструктуру продакшена на Platform.sh, делается через изменения в файле .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 в контейнере приложения.

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

.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 не отображаются в переменных окружения на локальной машине. Нужно указать это явно, используя флаг --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 открыт с помощью ceae1d2b44dd1749153ec700bf167f18f6cb5e05var:export`` возвращает переменные из удалённого окружения:

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

Описание вашей инфраструктуры

Возможно, вы ещё этого не осознали, но хранение инфраструктуры в файлах вместе с кодом очень помогает в работе. Настройка инфраструктуры проекта для Docker и Platform.sh производится в конфигурационных файлах. Когда новой функциональности потребуется дополнительный сервис, изменения в коде и инфраструктуре будут зафиксированы в одном патче.

Двигаемся дальше

  • Сервисы Platform.sh;
  • Туннель Platform.sh;
  • Документация PostgreSQL;
  • Команды docker-compose..
Previous page Создание контроллера
Next page Описание структуры данных
This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.
TOC
    Version

    Symfony 5.4 is backed by

    Code consumes server resources. Blackfire tells you how

    Code consumes server resources. Blackfire tells you how

    Show your Symfony expertise

    Show your Symfony expertise

    Version:
    Locale:
    ebook

    This book is backed by:

    see all backers

    Symfony footer

    Avatar of Temuri Takalandze, a Symfony contributor

    Thanks Temuri Takalandze (@abgeo) for being a Symfony contributor

    1 commit • 2 lines changed

    View all contributors that help us make Symfony

    Become a Symfony contributor

    Be an active part of the community and contribute ideas, code and bug fixes. Both experts and newcomers are welcome.

    Learn how to contribute

    Symfony™ is a trademark of Symfony SAS. All rights reserved.

    • What is Symfony?

      • What is Symfony?
      • Symfony at a Glance
      • Symfony Components
      • Symfony Releases
      • Security Policy
      • Logo & Screenshots
      • Trademark & Licenses
      • symfony1 Legacy
    • Learn Symfony

      • Symfony Docs
      • Symfony Book
      • Reference
      • Bundles
      • Best Practices
      • Training
      • eLearning Platform
      • Certification
    • Screencasts

      • Learn Symfony
      • Learn PHP
      • Learn JavaScript
      • Learn Drupal
      • Learn RESTful APIs
    • Community

      • Symfony Community
      • SymfonyConnect
      • Events & Meetups
      • Projects using Symfony
      • Contributors
      • Symfony Jobs
      • Backers
      • Code of Conduct
      • Downloads Stats
      • Support
    • Blog

      • All Blog Posts
      • A Week of Symfony
      • Case Studies
      • Cloud
      • Community
      • Conferences
      • Diversity
      • Living on the edge
      • Releases
      • Security Advisories
      • Symfony Insight
      • Twig
      • SensioLabs Blog
    • Services

      • SensioLabs services
      • Train developers
      • Manage your project quality
      • Improve your project performance
      • Host Symfony projects

      Powered by

    Follow Symfony