Skip to content

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. Wygenerowany plik docker-compose.yml już zawiera PostgreSQL jako usługę:

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 ###

Ta operacja zainstaluje serwer PostgreSQL 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:

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

Note

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

Note

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

1
$ docker-compose exec database psql main main

Zrzucanie i przywracanie bazy danych

Skorzystaj z polecenia pg_dump w celu wykonania zrzutu bazy danych:

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

I przywróć bazę:

1
$ symfony run psql < dump.sql

Dodawanie PostgreSQL do Platform.sh

W przypadku infrastruktury produkcyjnej na Platform.sh, dodanie usługi takiej jak PostgreSQL powinno być wykonane w pliku .platform/services.yaml, który został utworzony za pomocą przepisu z pakietu webapp:

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

Usługa database jest bazą danych PostgreSQL (w takiej wersji, jaka jest w Dockerze), którą chcemy udostępnić z dyskiem o powierzchni 1GB.

Musimy również "połączyć" bazę danych z kontenerem aplikacji, który jest opisany w .platform.app.yaml:

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

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

Sprawdź czy rozszerzenie pdo_pgsql jest już zainstalowane dla środowiska uruchomieniowego PHP:

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

Dostęp do bazy danych w Platform.sh

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

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ą Platform.sh:

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

Domyślnie usługi Platform.sh 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.

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 cloud:tunnel:close

Tip

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 Platform.sh 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 Platform.sh z var:expose-from-tunnel, polecenie var:export zwraca również zdalne zmienne środowiskowe:

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

Opisywanie infrastruktury

Być może jeszcze nie zdawałeś sobie z tego sprawy, ale posiadanie infrastruktury przechowywanej w plikach wraz z kodem bardzo pomaga. Docker i Platform.sh używają plików konfiguracyjnych do opisania infrastruktury projektu. Gdy nowa funkcja wymaga dodatkowej usługi, zmiany kodu i zmiany infrastruktury są częścią tej samej poprawki.

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