Etap 7: Konfigurowanie bazy danych

5.0 version
Maintained

Konfigurowanie bazy danych

Strona internetowa księgi gości konferencji dotyczy zbierania opinii podczas konferencji. Komentarze uczestników konferencji muszą być utrwalone w bazie danych.

Komentarz najlepiej opisuje ustalona struktura danych: autor, jego e-mail, tekst opinii i opcjonalne zdjęcie. Jest to rodzaj danych, które mogą być wygodnie przechowywane w tradycyjnym silniku relacyjnej bazy danych.

PostgreSQL to silnik bazodanowy, którego będziemy używać.

Dodawanie PostgreSQL do Docker Compose

Na naszej lokalnej maszynie zdecydowaliśmy się użyć Dockera do zarządzania usługami. Utwórz plik docker-compose.yaml i dodaj PostgreSQL jako usługę:

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]

Ta operacja zainstaluje serwer PostgreSQL w wersji 11 i skonfiguruje niektóre zmienne środowiskowe, które kontrolują nazwę bazy danych i dane uwierzytelniające. Wartości nie mają większego znaczenia.

Udostępniamy również port PostgreSQL (5432) kontenera do lokalnego hosta. To pomoże nam uzyskać dostęp do bazy danych z naszej maszyny.

Informacja

Rozszerzenie pdo_pgsql powinno być zainstalowane po tym, jak konfigurowaliśmy PHP w poprzednim kroku.

Uruchamianie Docker Compose

Uruchom Docker Compose w tle ( -d ):

1
$ docker-compose up -d

Poczekaj chwilę, aż baza danych się uruchomi i sprawdź, czy wszystko działa prawidłowo:

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

Jeśli nie ma uruchomionych kontenerów lub jeśli kolumna State nie ma wartości Up, sprawdź logi Docker Compose:

1
$ docker-compose logs

Dostęp do lokalnej bazy danych

Korzystanie z narzędzia psql w linii poleceń może okazać się przydatne od czasu do czasu, ale musisz wtedy znać dane uwierzytelniające i nazwę bazy danych a także, co jest mniej oczywiste, lokalny port, na którym działa baza danych. Docker wybiera losowy port, dzięki czemu możesz pracować nad więcej niż jednym projektem korzystającym z serwera PostgreSQL w tym samym czasie (port lokalny jest częścią danych wyjściowych docker-compose ps).

Jeśli uruchomisz psql za pomocą Symfony CLI nie musisz o niczym pamiętać.

Symfony CLI automatycznie wykrywa usługi Docker uruchomione dla projektu i udostępnia zmienne środowiskowe, których psql potrzebuje do połączenia z bazą danych.

Dzięki tym zasadom dostęp do bazy danych poprzez symfony run jest znacznie łatwiejszy:

1
$ symfony run psql

Informacja

Jeśli nie masz binarnej wersji psql na swoim komputerze, możesz uruchomić go za pośrednictwem polecenia docker:

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

Dodawanie PostgreSQL do SymfonyCloud

W przypadku infrastruktury produkcyjnej na SymfonyCloud, dodanie usługi takiej jak PostgreSQL powinno być wykonane w aktualnie pustym pliku .symfony/services.yaml:

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

Usługa db jest bazą danych PostgreSQL w wersji 11 (tak jak w Dockerze), którą chcemy udostępnić w małym kontenerze z dyskiem o powierzchni 1GB.

Musimy również „połączyć” bazę danych z kontenerem aplikacji, który jest opisany w .symfony.cloud.yaml:

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

Usługa db typu postgresql jest określona jako database w kontenerze aplikacyjnym.

Ostatnim krokiem jest dodanie rozszerzenia pdo_pgsql do środowiska uruchomieniowego PHP:

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

Poniżej znajduje się pełna lista zmian (ang. diff) dla .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:
         "/":

Zatwierdź (ang. commit) te zmiany, a następnie wdróż (ang. deploy) je do SymfonyCloud:

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

Dostęp do bazy danych w SymfonyCloud

PostgreSQL działa teraz zarówno lokalnie poprzez Dockera, jak i na produkcji w SymfonyCloud.

Jak właśnie widzieliśmy, uruchamianie symfony run psql automatycznie łączy się z bazą danych hostowaną przez Dockera dzięki zmiennym środowiskowym udostępnionym przez symfony run.

Jeśli chcesz się połączyć z PostgreSQL hostowanym w kontenerach produkcyjnych, możesz otworzyć tunel SSH pomiędzy lokalnym komputerem a infrastrukturą SymfonyCloud:

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

Domyślnie usługi SymfonyCloud nie są udostępniane jako zmienne środowiskowe na lokalnym komputerze. Musisz to zrobić samodzielnie, korzystając z flagi --expose-env-vars. Dlaczego? Podłączenie do produkcyjnej bazy danych jest niebezpieczną operacją. Możesz w ten sposób namieszać z prawdziwymi danymi. Wymaganie flagi to sposób potwierdzenia, że to jest na pewno to, co chcesz zrobić.

Połącz się teraz ze zdalną bazą danych PostgreSQL korzystając z symfony run psql, jak poprzednio:

1
$ symfony run psql

Kiedy skończysz, nie zapomnij zamknąć tunelu:

1
$ symfony tunnel:close

Wskazówka

Aby uruchomić niektóre zapytania SQL w produkcyjnej bazie danych zamiast korzystać z powłoki, możesz wykorzystać polecenie symfony sql.

Udostępnianie zmiennych środowiskowych

Docker Compose i SymfonyCloud dobrze współpracują z Symfony dzięki zmiennym środowiskowym.

Sprawdź wszystkie zmienne środowiskowe udostępnione przez symfony poprzez wykonanie polecenia 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
# ...

Zmienne środowiskowe PG* są odczytywane przez narzędzie psql. A co z innymi?

Kiedy tunel jest zestawiony z SymfonyCloud z ustawioną flagą --expose-env-vars, polecenie var:export zwraca również zdalne zmienne środowiskowe:

1
2
3
$ symfony tunnel:open --expose-env-vars
$ symfony var:export
$ symfony tunnel:close

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