PostgreSQL to jedno z najpotężniejszych i najczęściej wykorzystywanych otwartoźródłowych systemów zarządzania relacyjnymi bazami danych, oferujące zaawansowane funkcje integralności danych, optymalizacji wydajności i skalowalności.
Ten kompleksowy przewodnik prowadzi krok po kroku przez instalację, konfigurację, zabezpieczanie i podstawową administrację PostgreSQL na serwerach Ubuntu – od przygotowania systemu po logowanie, kopie zapasowe i replikację.
Wymagania systemowe i wstępne kroki instalacji PostgreSQL
Aby zapewnić stabilną pracę PostgreSQL, zweryfikuj minimalne wymagania i przygotuj środowisko:
- ubuntu 22.04 lub nowsze,
- co najmniej 1 GB pamięci RAM (więcej zalecane w produkcji),
- wystarczająca przestrzeń dyskowa na binaria i katalog danych,
- działające połączenie sieciowe,
- dostęp roota lub konto z uprawnieniami sudo.
Przed rozpoczęciem instalacji zaktualizuj pakiety i doinstaluj niezbędne narzędzia:
sudo apt update && sudo apt -y upgrade
sudo apt -y install curl wget ca-certificates gnupg lsb-release
W bardziej złożonych środowiskach możesz też przygotować strukturę katalogów i użytkownika systemowego, a w razie braku DNS – dodać wpisy hostów do pliku /etc/hosts.
Metody instalacji PostgreSQL w Ubuntu
Wybierz metodę instalacji zależnie od potrzeb dotyczących wersji i integracji systemowej:
| Metoda | Wersje | Prostota | Aktualizacje | Kiedy wybrać |
|---|---|---|---|---|
| Repozytorium Ubuntu | stabilne, nie zawsze najnowsze | wysoka | zintegrowane z systemem | gdy liczy się zgodność i bezproblemowe utrzymanie |
| Oficjalne repozytorium PostgreSQL (PGDG) | wiele gałęzi, często najnowsze | średnia | częste wydania i łatwa kontrola wersji | gdy potrzebujesz konkretnej lub najnowszej wersji |
Instalacja z domyślnego repozytorium Ubuntu
Wykonaj poniższe polecenia, aby zainstalować serwer i uruchomić usługę:
sudo apt update
sudo apt -y install postgresql postgresql-contrib
sudo systemctl status postgresql
Po instalacji usługa PostgreSQL startuje automatycznie i jest włączona przy rozruchu systemu. Tworzony jest też użytkownik systemowy postgres.
Instalacja z oficjalnego repozytorium PostgreSQL (PGDG)
Dodaj repozytorium PGDG i zainstaluj wybraną wersję (przykład dla Ubuntu 22.04):
sudo install -d /usr/share/postgresql-common/pgdg
sudo wget -q -O /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] http://apt.postgresql.org/pub/repos/apt $(. /etc/os-release && echo $VERSION_CODENAME)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt -y install postgresql-16
Oficjalne repozytorium zapewnia większą swobodę w zarządzaniu wersjami i ułatwia etapowe aktualizacje między gałęziami.
Weryfikacja instalacji
Sprawdź działanie serwera i nawiąż połączenie do domyślnej bazy:
psql --version
sudo -u postgres psql -c "SELECT version();"
sudo -u postgres psql
\l
\q
Uzyskanie zachęty psql potwierdza, że serwer działa i przyjmuje połączenia.
Zarządzanie usługą PostgreSQL i wstępna konfiguracja
Najważniejsze polecenia systemd do obsługi usługi postgresql wyglądają następująco:
sudo systemctl status postgresql
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl restart postgresql
sudo systemctl reload postgresql
sudo journalctl -u postgresql -f
Katalog danych klastra (PGDATA) oraz pliki konfiguracyjne zależą od pakietów Ubuntu. Przy standardowej instalacji znajdują się w typowych lokalizacjach:
- katalog danych: /var/lib/postgresql/WERSJA/main,
- konfiguracja: /etc/postgresql/WERSJA/main/ (postgresql.conf, pg_hba.conf),
- logi: systemowy journald lub /var/log/postgresql/ po włączeniu logging_collector.
Zarządzanie użytkownikami i rolami w PostgreSQL
PostgreSQL stosuje elastyczny model ról, w którym role mogą działać jako użytkownicy (z logowaniem) lub grupy (bez logowania). Nie używaj superużytkownika postgres do pracy aplikacji – stosuj zasadę minimalnych uprawnień.
Tworzenie nowych użytkowników bazy
Utwórz użytkownika interaktywnie lub za pomocą SQL:
sudo -u postgres createuser --pwprompt --login --no-superuser --no-createdb --no-createrole app_user
sudo -u postgres createdb --owner=app_user app_db
sudo -u postgres psql
CREATE USER app_user WITH LOGIN PASSWORD 'silne_hasło';
CREATE DATABASE app_db OWNER app_user;
GRANT CONNECT ON DATABASE app_db TO app_user;
\q
Zmiana hasła i polityki haseł:
ALTER USER app_user WITH PASSWORD 'jeszcze_silniejsze_hasło';
Preferuj SCRAM-SHA-256 jako metodę hashowania haseł zamiast przestarzałego MD5.
Zrozumienie ról i uprawnień PostgreSQL
Poniżej podsumowanie kluczowych ról i przywilejów:
- LOGIN – prawo logowania do serwera;
- SUPERUSER – pełny dostęp administracyjny (unikaj dla kont aplikacyjnych);
- CREATEDB – możliwość tworzenia baz danych;
- CREATEROLE – możliwość tworzenia i zarządzania rolami;
- REPLICATION – uprawnienie do połączeń replikacyjnych;
- GRANT/REVOKE – nadawanie i odbieranie uprawnień do obiektów (schematy, tabele, funkcje).
Tworzenie baz danych i wstępna konfiguracja
Tworzenie bazy i inicjalne uprawnienia wykonasz szybko poleceniami:
sudo -u postgres createdb --owner=app_user app_db
sudo -u postgres psql -d app_db -c "CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION app_user;"
Skrypty SQL ułatwiają spójną inicjalizację schematów i obiektów aplikacyjnych w wielu środowiskach.
Plik pg_hba.conf i uwierzytelnianie klientów
pg_hba.conf decyduje, którzy użytkownicy mogą łączyć się z jakich hostów, do jakich baz i jaką metodą. Reguły są oceniane sekwencyjnie – pierwsze dopasowanie wygrywa.
Przykładowe, bezpieczne wpisy dla połączeń lokalnych i z konkretnej podsieci:
# Lokalne połączenia przez gniazda Unix
local all all peer
# Połączenia z localhost
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
# Połączenia z zaufanej podsieci
host app_db app_user 10.0.0.0/24 scram-sha-256
Po zmianie reguł przeładuj konfigurację bez restartu usługi:
sudo -u postgres psql -c "SELECT pg_reload_conf();"
Konfiguracja sieci i połączenia zdalne
Włącz nasłuch na interfejsach sieciowych, dostosowując parametr listen_addresses w postgresql.conf, a następnie zrestartuj usługę:
# postgresql.conf
listen_addresses = '*'
port = 5432
sudo systemctl restart postgresql
Konfiguracja zapory dla dostępu zdalnego
Otwórz wyłącznie niezbędny port TCP dla zaufanych adresów i włącz UFW:
sudo ufw allow proto tcp from 10.0.0.0/24 to any port 5432
sudo ufw enable
sudo ufw status numbered
Dostęp zdalny musi być jednocześnie ograniczony przez pg_hba.conf i zaporę.
Konfiguracja parametrów i strojenie PostgreSQL
Poprawna konfiguracja ma kluczowe znaczenie dla wydajności i niezawodności. Najpierw sprawdź bieżące wartości w widoku pg_settings, a zmiany wprowadzaj w postgresql.conf lub przez ALTER SYSTEM.
Podstawowe parametry warte dostrojenia na start:
- listen_addresses – interfejsy nasłuchu serwera,
- max_connections – limit równoczesnych połączeń (planuj z buforem),
- shared_buffers – pamięć buforów współdzielonych (~15–25% RAM w wielu przypadkach),
- work_mem – pamięć na sortowania i hashowania per operacja/zapytanie,
- maintenance_work_mem – pamięć dla VACUUM/CREATE INDEX,
- effective_cache_size – szacowana przestrzeń buforowania systemu plików.
Oddzielenie zmian w postgresql.auto.conf (ALTER SYSTEM) ułatwia audyt konfiguracji i diagnostykę konfliktów.
Konfiguracja logowania w PostgreSQL
Włącz kolektor logów i ustaw przydatne parametry diagnostyczne:
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = '1d'
log_min_duration_statement = 100ms
log_connections = on
log_disconnections = on
log_line_prefix = '%m [%p] %u@%d %h '
logging_collector wymaga restartu usługi, natomiast większość pozostałych zmian można wprowadzić przez przeładowanie konfiguracji:
sudo -u postgres psql -c "SELECT pg_reload_conf();"
Kopie zapasowe i odtwarzanie
Wybierz metodę kopii w zależności od RTO/RPO i wielkości danych:
| Metoda | Poziom | Zalety | Ograniczenia | Typowe zastosowania |
|---|---|---|---|---|
| pg_dump | pojedyncza baza | elastyczny format, selektywne przywracanie obiektów | wolniejsze przywracanie dużych baz | mniejsze bazy, migracje między wersjami |
| pg_dumpall | cały klaster (logicznie) | zawiera role/globalne obiekty | jak wyżej + dłuższy czas | spójny eksport konfiguracji i małych środowisk |
| pg_basebackup + WAL/PITR | binarny (plikowy) | szybkie odtwarzanie, możliwość PITR | wymaga archiwizacji WAL i większej dyscypliny operacyjnej | duże/krytyczne bazy, niskie RTO |
Przykładowe polecenia kopii i konfiguracji:
# Kopia logiczna bazy
pg_dump -h 127.0.0.1 -U app_user -d app_db -Fc -f app_db_$(date +%F).dump
# Kopia binarna klastra
pg_basebackup -h 127.0.0.1 -U replicator -D /backups/base_$(date +%F) -X stream -C -S slot_standby -R
# postgresql.conf – archiwizacja WAL do PITR
archive_mode = on
archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'
Strategia backupu powinna wynikać bezpośrednio z założeń RTO/RPO – łącz metody logiczne i binarne tam, gdzie to uzasadnione.
Konserwacja bazy i działanie autovacuum
Regularna konserwacja (VACUUM/ANALYZE) poprawia wydajność i stabilność, usuwając martwe wiersze i aktualizując statystyki optymalizatora.
Praktyczne wskazówki strojenia autovacuum:
- autovacuum – pozostaw włączone w produkcji i monitoruj opóźnienia,
- autovacuum_vacuum_scale_factor i autovacuum_analyze_scale_factor – obniż dla tabel intensywnie modyfikowanych,
- autovacuum_work_mem – zwiększ dla dużych tabel,
- autovacuum_freeze_max_age – kontroluj, by zapobiec zawinięciu XID,
- rozważ prógi per tabela (ALTER TABLE … SET).
Replikacja i wysoka dostępność
Fizyczna replikacja strumieniowa zapewnia niemal rzeczywistą kopię danych na serwerach standby, które można awansować do roli primary w razie awarii.
- utwórz użytkownika z przywilejem REPLICATION i dodaj reguły w pg_hba.conf dla hostów standby;
- ustaw wal_level = replica, opcjonalnie hot_standby = on, a następnie zrestartuj serwer primary;
- wykonaj wstępną kopię danych na standby, np.
pg_basebackupz opcją tworzeniastandby.signal(-R); - uruchom serwer standby i zweryfikuj stan replikacji w widokach pg_stat_wal_receiver/pg_stat_replication;
- skonfiguruj monitoring opóźnień (write/replay lag) i politykę failover.
WAL sender/receiver odpowiadają za transmisję dzienników WAL, a proces startup na standby odtwarza zmiany, utrzymując synchronizację.
Zaawansowane zagadnienia konfiguracyjne
Warto rozważyć dodatkowe możliwości platformy, które zwiększają wydajność i funkcjonalność:
- rozszerzenia – np. PostGIS (GIS), uuid-ossp (UUID), pg_trgm (podobieństwa znakowe);
- pule połączeń – PgBouncer, Pgpool-II dla efektywnej obsługi wielu sesji i ograniczenia kosztów połączeń;
- partycjonowanie – lepsze zarządzanie oraz wydajność operacji na bardzo dużych tabelach.






