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.