PostgreSQL na hostingu i VPS — instalacja, konfiguracja i bezpieczeństwo
Opublikowano: 8 kwietnia 2026 · Kategoria: Bazy danych
PostgreSQL to zaawansowana baza danych open-source — wybierana przez aplikacje Django, Ruby on Rails i nowoczesne SaaS, które potrzebują JSONB, pełnotekstowego wyszukiwania i złożonych typów danych. Na hostingach współdzielonych w Polsce PostgreSQL jest rzadkością — zwykle wymaga VPS. Ten artykuł opisuje jak go zainstalować, zabezpieczyć i używać na VPS z Ubuntu.
Instalacja PostgreSQL na Ubuntu/Debian
# Instalacja z oficjalnego repozytorium PostgreSQL (nowsza wersja) sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get install postgresql-16 -y # Lub szybciej z Ubuntu repo (starszą wersją): sudo apt install postgresql postgresql-contrib -y # Sprawdź wersję i status psql --version sudo systemctl status postgresql
Pierwsze kroki — tworzenie bazy i użytkownika
# Przełącz się na konto postgres sudo -u postgres psql -- W konsoli psql: -- Utwórz użytkownika aplikacji (NIE używaj superuser dla aplikacji) CREATE USER myapp_user WITH PASSWORD 'silne_haslo_tu'; -- Utwórz bazę danych CREATE DATABASE myapp_db OWNER myapp_user; -- Nadaj uprawnienia GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user; -- Wyjdź \q # Test połączenia psql -h localhost -U myapp_user -d myapp_db
Konfiguracja bezpieczeństwa
Dwa kluczowe pliki konfiguracyjne: postgresql.conf i pg_hba.conf:
# Znajdź lokalizację plików konfiguracyjnych sudo -u postgres psql -c "SHOW config_file;" sudo -u postgres psql -c "SHOW hba_file;" # postgresql.conf — ogranicz nasłuchiwanie do localhost sudo nano /etc/postgresql/16/main/postgresql.conf # Zmień: # listen_addresses = 'localhost' # tylko localhost, NIE '*' # port = 5432 # pg_hba.conf — metody uwierzytelniania sudo nano /etc/postgresql/16/main/pg_hba.conf # Linie powinny wyglądać tak (scram-sha-256 zamiast trust): # local all postgres peer # local all all scram-sha-256 # host all all 127.0.0.1/32 scram-sha-256 # host all all ::1/128 scram-sha-256 # Restart po zmianach sudo systemctl restart postgresql
Połączenie przez SSH tunnel (bezpieczny zdalny dostęp)
# Uruchom tunel SSH (na lokalnym komputerze) # Mapuje lokalny port 5433 → zdalny localhost:5432 ssh -L 5433:localhost:5432 user@twoj_serwer_ip -N # W osobnym terminalu — połącz się lokalnie: psql -h localhost -p 5433 -U myapp_user -d myapp_db # W pgAdmin (GUI): # Host: localhost, Port: 5433 (przy aktywnym tunelu) # Stały tunel w tle (z ~./ssh/config) # Host mydb-tunnel # HostName twoj_serwer_ip # User twoj_user # LocalForward 5433 localhost:5432 # IdentityFile ~/.ssh/id_ed25519
Podstawowe polecenia psql
-- Lista baz danych \l -- Lista tabel w bieżącej bazie \dt -- Lista użytkowników \du -- Połącz z inną bazą \c myapp_db -- Opis tabeli \d nazwa_tabeli -- Wykonaj zapytanie z pliku \i /path/to/query.sql -- Historia poleceń \s -- Wyjście \q
Backup i restore
# Backup jednej bazy pg_dump -U myapp_user -h localhost myapp_db > backup-$(date +%Y%m%d).sql # Backup z kompresją pg_dump -U myapp_user myapp_db | gzip > backup-$(date +%Y%m%d).sql.gz # Backup wszystkich baz (jako root postgres) sudo -u postgres pg_dumpall > all-databases-$(date +%Y%m%d).sql # Restore psql -U myapp_user -d myapp_db < backup-20260409.sql # lub z gz: gunzip -c backup-20260409.sql.gz | psql -U myapp_user -d myapp_db # Cron — codziennie o 3:00 # 0 3 * * * pg_dump -U myapp_user myapp_db | gzip > /backup/pg-$(date +\%Y\%m\%d).sql.gz
| Cecha | PostgreSQL | MySQL/MariaDB |
|---|---|---|
| Dostępność na hostingu współdzielonym | Rzadko (głównie VPS) | Powszechna (prawie wszędzie) |
| JSONB (natywne JSON) | Tak (indeksowalne) | JSON (mniej wydajny) |
| WordPress | Nieoficjalnie (plugin) | Natywna obsługa |
| Django, FastAPI | Preferowany | Obsługiwany |
| Złożone zapytania SQL | Lepszy optymalizator | Dobry dla prostszych zapytań |
| Pełnotekstowe wyszukiwanie | Wbudowane, zaawansowane | FULLTEXT (ograniczone) |