SymfonyWorld Online 2020
100% online
30+ talks + workshops
Live + Replay watch talks later

Pas 7: Configurarea unei baze de date

5.0 version
Maintained

Configurarea unei baze de date

„Cartea de oaspeți“ a conferinței vizează colectarea recenziilor în timpul conferințelor. Trebuie să stocăm comentariile participanților la conferință într-un mediu de stocare permanent.

Un comentariu este cel mai bine descris de o structură de date fixă: un autor, cu o adresă de email, textul recenziei și, opțional, o fotografie. Aceste date pot fi stocate foarte bine într-o bază de date relațională.

PostgreSQL este baza de date pe care o vom utiliza.

Adăugarea PostgreSQL la Docker Compose

Pe mașina noastră locală, am decis să folosim Docker pentru a gestiona serviciile. Creează un fișier docker-compose.yaml și adaugă PostgreSQL ca serviciu:

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]

Aceasta va instala un server PostgreSQL la versiunea 11 și va configura unele variabile de mediu care controlează numele bazei de date și datele de autentificare. Valorile nu prea contează.

De asemenea, expunem portul PostgreSQL (5432) al containerului la gazda locală. Asta ne va ajuta să accesăm baza de date de pe serverul nostru.

Notă

Extensia pdo_pgsql ar fi trebuit să fie instalată atunci când PHP a fost configurat într-o etapă anterioară.

Pornirea Docker Compose

Pornește Docker Compose în fundal (-d):

1
$ docker-compose up -d

Așteaptă puțin pentru a permite pornirea bazei de date și verifică dacă totul funcționează bine:

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

Dacă nu există containere care rulează sau dacă în coloana State nu scrie Up, atunci verifică în jurnalele Docker Compose pentru mai multe detalii:

1
$ docker-compose logs

Accesarea bazei de date locale

Utilizarea comenzii psql se poate dovedi utilă din când în când. Dar trebuie să îți amintești datele de autentificare și numele bazei de date. Mai puțin evident, trebuie să cunoști și portul local pe care rulează baza de date. Docker alege un port aleatoriu, astfel încât să poți lucra la mai multe proiecte folosind PotgreSQL în același timp (portul local face parte din rezultatul lui docker-compose ps).

Dacă rulezi psql prin Symfony CLI, nu trebuie să memorezi nimic.

Symfony CLI detectează automat serviciile Docker care rulează pentru proiect și expune variabilele de mediu de care psql are nevoie pentru a se conecta la baza de date.

Datorită acestor convenții, accesarea bazei de date prin symfony run este mult mai ușoară:

1
$ symfony run psql

Notă

Dacă nu ai binarul psql pe gazda locală, îl poți rula și prin docker:

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

Adăugarea PostgreSQL la SymfonyCloud

Pentru infrastructura de producție de pe SymfonyCloud, adăugarea unui serviciu precum PostgreSQL trebuie făcută în fișierul actualmente gol, .symfony/services.yaml:

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

Serviciul db este o bază de date PostgreSQL la versiunea 11 (pentru Docker) pe care dorim să o furnizăm pe un container mic cu 1 GB de spațiu disc.

De asemenea, trebuie să „conectăm” baza de date la containerul aplicației, care este descris în .symfony.cloud.yaml:

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

Serviciul db de tipul postgresql este declarat database în containerul aplicației.

Ultimul pas este să activezi extensia pdo_pgsql în PHP:

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

Iată diferența completă pentru modificările .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:
         "/":

Salvează aceste modificări și apoi relansează proiectul în SymfonyCloud:

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

Accesarea bazei de date din SymfonyCloud

PostgreSQL rulează acum atât local prin Docker, cât și în producție, pe SymfonyCloud.

Așa cum tocmai am văzut, rulând symfony run psql, comanda conectează proiectul automat la baza de date găzduită pe Docker datorită variabilelor de mediu expuse de symfony run.

Dacă dorești să te conectezi la PostgreSQL găzduit pe containerele de producție, poți deschide un tunel SSH între mașina locală și infrastructura SymfonyCloud:

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

În mod implicit, serviciile SymfonyCloud nu sunt expuse ca variabile de mediu pe mașina locală. Trebuie să faci acest lucru în mod explicit folosind opțiunea --expose-env-vars. De ce? Conectarea la baza de date de producție este o operațiune periculoasă. Poți modifica date reale. Folosind opțiunea confirmi că asta e ceea ce vrei să faci cu adevărat.

Acum, conectează-te la baza de date PostgreSQL de la distanță prin symfony run psql ca mai înainte:

1
$ symfony run psql

Când ai terminat treaba, nu uita să închizi tunelul:

1
$ symfony tunnel:close

Sfat

Pentru a rula câteva interogări SQL pe baza de date de producție, în loc să utilizezi un terminal direct, poți utiliza, de asemenea, comanda symfony sql.

Expunerea variabilelor de mediu

Docker Compose și SymfonyCloud funcționează perfect cu Symfony datorită variabilelor de mediu.

Verifică toate variabilele de mediu expuse de symfony executând 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
# ...

Variabilele de mediu PG* sunt citite de utilitarul psql. Ce se întâmpla cu celelalte?

Când un tunel este deschis către SymfonyCloud cu opțiunea --expose-env-vars, comanda var:export returnează variabilele de mediu din mediul de lucru de la distanță - de pe producție:

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.