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:
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:
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:
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
:
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:
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.