Skip to content

Een database opzetten

De website van het conferentiegastenboek verzamelt feedback tijdens conferenties. We moeten de reacties van deelnemers aan de conferentie ergens permanent opslaan.

Een reactie kunnen we beschrijven met een vaste datastructuur: een auteur, zijn e-mail, de tekst van de feedback en een optionele foto. Dit soort gegevens kunnen het beste opgeslagen worden in een traditioneel relationeel databasesysteem.

PostgreSQL is het database systeem dat we zullen gebruiken.

PostgreSQL aan Docker Compose toevoegen

Op onze lokale machine gebruiken we Docker om onze services te beheren. Het gegenereerde docker-compose.yml bestand bevat reeds PostgreSQL als service:

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

Dit zal een PostgreSQL server installeren en een aantal omgevingsvariabelen configureren om de databasenaam en inloggegevens in te stellen. De waarden hiervan doen er niet direct toe.

We zetten ook de PostgreSQL-poort (5432) van de container open voor de lokale host. Dat zal ons toegang geven tot de database vanaf onze machine:

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

Note

De pdo_pgsql extensie zou moeten zijn geïnstalleerd toen PHP opgezet werd in een vorige stap.

Docker Compose starten

Start Docker Compose in de achtergrond ( -d ):

1
$ docker-compose up -d

Wacht even tot de database volledig opgestart is en controleer dan of alles goed draait:

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

Als er geen containers draaien of als de State kolom niet Up bevat, bekijk dan de Docker Compose logs:

1
$ docker-compose logs

De lokale database benaderen

Het psql command-line hulpprogramma kan soms van pas komen. Je moet dan wel de inloggegevens en de naam van de database onthouden. Maar iets minder handig is dat je ook moet weten op welke lokale poort de database op de host draait. Docker kiest hiervoor namelijk een willekeurige poort, zodat je aan meer dan één project tegelijk met PostgreSQL kunt werken (de lokale poort kan je vinden via het docker-compose ps commando).

Als je psql via de Symfony CLI draait, hoef je niets te onthouden.

De Symfony CLI detecteert automatisch de Docker-services die voor het project draaien en stelt de omgevingsvariabelen in die psql nodig heeft om een verbinding te maken met de database.

Dankzij deze conventies is het benaderen van de database via symfony run veel eenvoudiger:

1
$ symfony run psql

Note

Als de psql binary niet aanwezig is op jouw lokale host kun je deze ook uitvoeren via docker-compose:

1
$ docker-compose exec database psql main main

Database data dumpen en terugzetten

Gebruik pg_dump om de database data te dumpen:

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

En zet de data terug:

1
$ symfony run psql < dump.sql

PostgreSQL toevoegen aan Platform.sh

Voor de productie infrastructuur op Platform.sh, zou je een service zoals PostgreSQL moeten toevoegen in het .platform/services.yaml bestand, wat reeds gedaan werd door het recept van de webapp package:

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

De database service is een PostgreSQL database (dezelfde versie als we in Docker gebruiken) die we willen opzetten met met 1GB schijfruimte.

We moeten de DB ook "koppelen" aan de applicatie-container die beschreven staat in .platform.app.yaml:

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

In de applicatie-container wordt er aan de database service van het type postgresql gerefereerd met de naam database.

Controleer of de pdo_pgsql extensie reeds geïnstalleerd is voor de PHP-runtime:

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

Toegang tot de Platform.sh database

PostgreSQL draait nu zowel lokaal via Docker als in productie op Platform.sh.

Zoals we zojuist hebben gezien kun je met het symfony run psql commando, automatisch een verbinding maken naar de database die door Docker wordt gehost, dit alles dankzij de omgevingsvariabelen die door symfony run werden ingesteld.

Als je verbinding wil maken met PostgreSQL in de containers van de productieomgeving, kun je een SSH tunnel leggen tussen de lokale machine en de Platform.sh infrastructuur:

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

Platform.sh services worden standaard niet via omgevingsvariabelen op de lokale machine ingesteld. Je moet dit expliciet doen door het var:expose-from-tunnel commando te draaien. Waarom? Verbinding maken met een productiedatabase is gevaarlijk. Je kan echte data om zeep helpen.

Verbind nu met de externe PostgreSQL database via symfony run psql:

1
$ symfony run psql

Vergeet niet de tunnel te sluiten wanneer je klaar bent:

1
$ symfony cloud:tunnel:close

Tip

Om wat SQL queries uit te voeren op de productiedatabase, kan je ook het symfony sql commando gebruiken, in plaats van een shell te starten.

Werken met omgevingsvariabelen

Docker Compose en Platform.sh werken naadloos samen met Symfony dankzij het gebruik van omgevingsvariabelen.

Controleer alle omgevingsvariabelen die door symfony gebruikt worden via 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
# ...

De PG* omgevingsvariabelen worden gebruikt door het psql hulpprogramma. En de rest?

Wanneer er een tunnel ligt naar Platform.sh via var:expose-from-tunnel, geeft het var:export commando de externe omgevingsvariabelen weer:

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

Je Infrastructuur omschrijven

Je hebt het misschien nog niet gerealiseerd, maar het helpt veel om de infrastructuur naast de code in bestanden op te slaan. Docker en Platform.sh gebruiken configuratiebestanden om de project-infrastructuur te omschrijven. Wanneer een nieuwe functie een aanvullende service nodig heeft, veranderen de code en maken de wijzigingen in de infrastructuur deel uit van dezelfde patch.

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