Onnan indulunk, hogy van egy Postgres dev-környezetünk, és szeretnénk belőle prod-környezetet csinálni, ehhez pedig elérhetővé tenni a világhálón.
Így néz ki a projektmappánk:
$ tree -aF --dirsfirst
.
├── certbot/
│ └── deploy.bash
├── docker/
│ └── postgres/
│ ├── pg_hba.conf
│ └── postgresql.conf
├── compose.prod.yaml
├── compose.yaml
├── .env
└── .env.example
Nézzük a deploy.bash
szkriptet. Itt mydomain.com a választott doménnevünk.
#!/usr/bin/env bash
set -o nounset
set -o pipefail
cd "$(dirname "$(realpath "$0")")"
main() {
local fcfn=fullchain.pem
local pkfn=privkey.pem
local domain=$(basename "$RENEWED_LINEAGE")
if [[ "$domain" = mydomain.com ]]; then
local custom_cert_dir=$(pwd)
cp "$RENEWED_LINEAGE/$fcfn" "$custom_cert_dir/$fcfn.tmp"
cp "$RENEWED_LINEAGE/$pkfn" "$custom_cert_dir/$pkfn.tmp"
chmod 600 "$custom_cert_dir/$fcfn.tmp" "$custom_cert_dir/$pkfn.tmp"
chown 999:999 "$custom_cert_dir/$fcfn.tmp" "$custom_cert_dir/$pkfn.tmp"
mv -f "$custom_cert_dir/$fcfn.tmp" "$custom_cert_dir/$fcfn"
mv -f "$custom_cert_dir/$pkfn.tmp" "$custom_cert_dir/$pkfn"
fi
}
main "$@"
A szkript értelemszerűen végrehajtható engedéllyel rendelkezik, a VPS-ünkön linkeljük be a certbot megfelelő hook mappájába. Majd kérjünk Let’s Encrypt tanúsítványt a doménnévre. (Nem teszteltem, hogy ekkor lefut-e a hook, elvileg igen. Ha nem, akkor kézzel másoljuk és chown-oljuk a két PEM-fájlt.)
# ln -sf $(pwd)/certbot/deploy.bash /etc/letsencrypt/renewal-hooks/deploy/mydomain.com.bash
# certbot certonly --apache -d mydomain.com
Ezek után nézzük a compose.prod.yaml
fájlt, amelyet a VPS-en össze fogunk fésülni a változatlanul hagyott compose.yaml
konfiggal.
services:
db:
command: ["-c", "config_file=/etc/postgresql/postgresql.conf", "-c", "hba_file=/etc/postgresql/pg_hba.conf"]
restart: always
volumes:
- ./certbot:/var/lib/postgresql/certs
- ./docker/postgres/postgresql.conf:/etc/postgresql/postgresql.conf
- ./docker/postgres/pg_hba.conf:/etc/postgresql/pg_hba.conf
A postgresql.conf
és pg_hba.conf
fájlokat kimásolhatjuk a konténerünkből.
$ docker cp postgres:/var/lib/postgresql/data/postgresql.conf docker/postgres/
$ docker cp postgres:/var/lib/postgresql/data/pg_hba.conf docker/postgres/
Majd módosítjuk őket. A postgresql.conf
-ban módosítsuk az alábbi sorokat:
ssl = on
ssl_cert_file = '/var/lib/postgresql/certs/fullchain.pem'
ssl_key_file = '/var/lib/postgresql/certs/privkey.pem'
client_min_messages = warning
A pg_hba.conf
-ban cseréljük az utolsó sort erre:
hostssl all all 0.0.0.0/0 scram-sha-256
Elindíthatjuk a szolgáltatást. Ne felejtsük el megnyitni a beállított portot a tűzfalon.
$ docker compose -f compose.yaml -f compose.prod.yaml up -d
# ufw allow 5678
Csatlakozás psql klienssel
Nem maradt más hátra, mint távolról bejelentkezni az FQDN-nel elérhető szerverünkre (vegyük észre az sslmode és az sslrootcert paramétereket):
$ psql "user=myuser host=mydomain.com port=5678 dbname=mydb sslmode=verify-full sslrootcert=system"
$ # vagy így:
$ psql "postgres://myuser@mydomain.com:5678/mydb?sslmode=verify-full&sslrootcert=system
$ # aztán ilyesmit kell látnunk:
psql (15.8, server 16.4 (Debian 16.4-1.pgdg120+2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Csatlakozás Windows alól
Windowson a DBeaver klienst telepítettem a kapcsolat teszteléséhez. Mint kiderült, itt nem működik a sslrootcert=system
URL-paraméter, kézzel kell beállítani a CA Certificate fájl elérhetőségét. Honnan lesz ilyen fájlunk?
- Nyissuk meg: Windows Certificates tár: Win+R,
certmgr.msc
. - Nyissuk meg: Trusted Root Certification Authorities/Certificates.
- Jobbklikk: ISRG Root X1 tanúsítvány, majd All tasks/Export menüpont.
- Válasszuk ki: Base-64 encoded X.509 (.CER).
- Adjunk meg tetszőleges mappát és fájlnevet.
Ugyanakkor a Power BI gond nélkül csatlakozott a szerverhez.