PostgreSQL je odprtokodni relacijski sistem za upravljanje podatkovnih baz. Veliko spletnih aplikacij (Django, Laravel, Nextcloud, n8n, Gitea) deluje tudi s PostgreSQL, nekatere (Odoo, Mastodon) le z njim. Na lastnem KVM VPS ga v nekaj minutah namestiš iz repozitorija distribucije ali iz lastnega repozitorija projekta PostgreSQL (PGDG).
Ta članek pregleda namestitev v AlmaLinux in Ubuntu, nato skupne korake: ustvarjanje uporabnika in podatkovne baze, prijavo z geslom, dostop na daljavo, varnostno kopiranje in menjavo glavne različice. Korake smo novembra 2026 preizkusili v sistemih AlmaLinux 10.2, AlmaLinux 9.8 in Ubuntu 26.04. Ukaze zaganjaj z uporabnikom s pravicami sudo (glej: Ustvarjanje uporabnika in dodelitev pravic sudo).
Če aplikacija teče v vsebniku Docker, lahko tudi PostgreSQL teče poleg nje v vsebniku, iz ene datoteke compose.yaml: to prikazuje članek o uporabi Docker Compose. Če potrebuješ podatkovno bazo, združljivo z MySQL, smo namestitev MariaDB opisali v ločenem članku.
Katera različica pride od kod?
V času preizkusa je bila najnovejša glavna različica PostgreSQL 18 (18.6), projekt je podpiral glavne različice 14–18 (različico 14 do 12. novembra 2026). Vsaka glavna različica pet let dobiva popravke.
| Sistem | V sistemskem repozitoriju | V repozitoriju PGDG |
|---|---|---|
| AlmaLinux 10 | PostgreSQL 16 (postgresql-server), PostgreSQL 18 (postgresql18-server) |
14–18 |
| AlmaLinux 9 | PostgreSQL 13 (osnovni), 15, 16 in 18 (modul postgresql:15, :16, :18) |
14–18 |
| Ubuntu 26.04 | PostgreSQL 18 | 10–18 |
| Ubuntu 24.04 | PostgreSQL 16 | 10–18 |
| Debian 13 | PostgreSQL 17 | 10–18 |
Vrstici Ubuntu 24.04 in Debian 13 smo izpolnili na podlagi seznamov paketov; na teh sistemih nismo nameščali. V repozitoriju PGDG glavne različice, starejše od 14, ne dobivajo več popravkov.
Kaj izbrati?
- Sistemski repozitorij, če glavna različica v njem ustreza aplikaciji. V AlmaLinux 10 in 9 ter Ubuntu 26.04 od tu pride tudi glavna različica 18. Pakete popravljajo sistemske posodobitve, v AlmaLinux pa zanje veljajo tudi pravila SELinux (glej spodaj).
- Repozitorij PGDG (
yum.postgresql.org,apt.postgresql.org), če v sistemskem repozitoriju ni želene glavne različice (na primer PostgreSQL 18 na Ubuntu 24.04 ali starejša glavna različica zaradi aplikacije) ali bi poganjal več glavnih različic vzporedno. V PGDG so vse podprte glavne različice.
A) Namestitev v AlmaLinux
Iz sistemskega repozitorija
V AlmaLinux 10 je PostgreSQL 18 na voljo pod ločenim imenom paketa s številko različice (modula ni):
sudo dnf install postgresql18-server
sudo dnf install postgresql-server bi namestil glavno različico 16. Paketa se izključujeta.
V AlmaLinux 9 je treba izbrati modul, sicer se namesti 13:
sudo dnf module enable postgresql:18
sudo dnf install postgresql-server
Podatkovni imenik („gručo”) je treba v AlmaLinux ustvariti ročno, storitev pa zagnati:
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
Ime storitve je postgresql, podatkovni imenik je /var/lib/pgsql/data, v njem so tudi konfiguracijske datoteke (postgresql.conf, pg_hba.conf). Dnevnik je v mapi /var/lib/pgsql/data/log/, v datotekah po dnevih v tednu (na primer postgresql-Sun.log). V preizkusu se je v obeh sistemih namestil 18.6.
Pomembna razlika v primerjavi z Ubuntujem in PGDG: paket AlmaLinux tudi za povezave TCP znotraj računalnika (127.0.0.1, ::1) nastavi preverjanje ident, zato se z geslom privzeto ni mogoče prijaviti. To spremenimo spodaj, v delu o prijavi z geslom.
Iz repozitorija PGDG
Nastavitev repozitorija PGDG v AlmaLinux 10 na računalniku x86_64 (Intel/AMD); v AlmaLinux 9 je v poti EL-9-x86_64, na računalniku ARM pa EL-10-aarch64:
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo rpm --import /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-*
sudo dnf install postgresql18-server
Ročni uvoz ključa je bil v preizkusu potreben, ker se je dnf brez njega pri metapodatkih repozitorija ustavil z napako „Signing key not found”.
V AlmaLinux 10 je ime paketov PGDG enako kot v AppStream (postgresql18-server), vendar ima repozitorij PGDG višjo prioriteto, zato se je v preizkusu namestila različica PGDG (18.6-4PGDG.rhel10.2). Katera je nameščena, pokaže rpm -q postgresql18-server. V AlmaLinux 9 je treba po opisu PGDG najprej izklopiti sistemski modul (sudo dnf -qy module disable postgresql); tega nismo preizkusili.
Paket PGDG uporablja druge poti in ime storitve:
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable --now postgresql-18
| Repozitorij AlmaLinux | PGDG | |
|---|---|---|
| Storitev | postgresql |
postgresql-18 |
| Podatkovni imenik | /var/lib/pgsql/data |
/var/lib/pgsql/18/data |
| Programi | /usr/bin |
/usr/pgsql-18/bin (psql se zažene tudi iz /usr/bin) |
| Lokalno preverjanje TCP | ident |
scram-sha-256 |
B) Namestitev v Ubuntu
Iz repozitorija Ubuntu
sudo apt update
sudo apt install postgresql
V Ubuntu 26.04 to namesti paket postgresql-18 (v preizkusu 18.6-0ubuntu0.26.04.1), v Ubuntu 24.04 pa glavno različico 16. Za razliko od AlmaLinux tu ni ločenega koraka initdb: paket takoj ustvari in zažene gručo z imenom main. Gruče izpiše pg_lsclusters:
pg_lsclusters
V Ubuntuju (in Debianu) lahko na enem računalniku vzporedno teče več glavnih različic in več gruč, zato ima vsaka gruča svojo enoto systemd: postgresql@18-main. Storitev postgresql je le zbirna enota, ki jih vse zažene in ustavi. Posamezno gručo lahko upravljaš tudi tako:
sudo systemctl restart postgresql@18-main
sudo pg_ctlcluster 18 main restart
Konfiguracijske datoteke tu niso v podatkovnem imeniku, temveč v mapi /etc/postgresql/18/main/ (postgresql.conf, pg_hba.conf in podmapa conf.d za lastne nastavitve). Podatki so v /var/lib/postgresql/18/main, dnevnik pa v datoteki /var/log/postgresql/postgresql-18-main.log. Za povezave TCP znotraj računalnika paket že nastavi preverjanje z geslom scram-sha-256.
Iz repozitorija PGDG
Paket postgresql-common vsebuje skript, ki nastavi repozitorij PGDG:
sudo apt install postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install postgresql-18
Glavno različico določa ime paketa (postgresql-17, postgresql-18). Ko je na računalniku že tekla gruča 18, namestitev glavne različice 17 v preizkusu ni ustvarila nove gruče main; takrat jo ustvari sudo pg_createcluster 17 main --start, na naslednjih prostih vratih (5433).
V Ubuntu 26.04 je po nastavitvi repozitorija PGDG namesto sistemskega paketa postgresql-18 kandidat za posodobitev postala različica PGDG (18.6-1.pgdg26.04+2), ker ima višjo številko različice. Naslednji apt upgrade ga torej zamenja s paketom PGDG; glavna različica ostane ista, spremeni se le vir paketa.
Prva prijava
Namestitev ustvari sistemskega uporabnika postgres in istoimenskega superuporabnika podatkovne baze. Znotraj računalnika, prek vtičnice Unix, velja preverjanje peer: ime uporabnika PostgreSQL se mora ujemati z imenom sistemskega uporabnika. Zato se prijaviš takole, brez gesla:
sudo -u postgres psql
Nekaj uporabnih ukazov psql:
| Ukaz | Kaj naredi |
|---|---|
\l |
seznam podatkovnih baz |
\du |
seznam uporabnikov (vlog) |
\c appdb |
prehod v drugo podatkovno bazo |
\dt |
seznam tabel v trenutni podatkovni bazi |
\password appuser |
nastavitev ali sprememba gesla s skritim vnosom |
\q |
izhod |
Ustvarjanje uporabnika in podatkovne baze
Za vsako aplikacijo ustvari ločenega uporabnika in lastno podatkovno bazo in je ne povezuj s superuporabnikom postgres. Z orodji ukazne vrstice:
sudo -u postgres createuser --pwprompt appuser
sudo -u postgres createdb -O appuser appdb
--pwprompt dvakrat zahteva geslo, skrito; -O appuser uporabnika naredi za lastnika nove podatkovne baze. Enako v SQL, v psql:
CREATE ROLE appuser LOGIN PASSWORD 'Hosszu-Egyedi-Jelszo';
CREATE DATABASE appdb OWNER appuser;
Pri različici SQL lahko geslo pride tudi v zgodovino ukazov psql (~/.psql_history); zato sta ukaz \password appuser ali createuser --pwprompt varnejša. Rezultat pokažeta \du in \l:
Če uporabnik ni lastnik podatkovne baze. Od PostgreSQL 15 lahko v shemi public tabele ustvarja le lastnik podatkovne baze. Če uporabniku predaš obstoječo podatkovno bazo, ki je v lasti nekoga drugega, se ustvarjanje tabel ustavi z napako „permission denied for schema public”. Takrat mu daj pravice za shemo:
sudo -u postgres psql -d masikdb -c "GRANT ALL ON SCHEMA public TO appuser"
Abecedni vrstni red jezika. Pravilo razvrščanja podatkovne baze (collation) se določi ob ustvarjanju, v preizkusu je bilo v AlmaLinux en_US.UTF-8, v Ubuntuju pa C.UTF-8. Če aplikacija razvrščanje besed prepusti podatkovni bazi, ustvari podatkovno bazo z nastavitvijo jezika (spodnji primer je madžarski, za slovenščino uporabi sl_SI.UTF-8):
sudo -u postgres createdb -O appuser -T template0 -l hu_HU.UTF-8 appdb_hu
V AlmaLinux je za to najprej potreben jezikovni paket glibc-langpack-hu (za slovenščino glibc-langpack-sl), brez njega je napaka „invalid LC_COLLATE locale name”. V preizkusu je podatkovna baza hu_HU.UTF-8 razvrščala po madžarskem pravilu (cukor pred csiga, olló pred öböl), en_US.UTF-8 pa ne.
Prijava z geslom (pg_hba.conf)
Aplikacije se običajno povezujejo prek TCP (localhost, vrata 5432), z uporabniškim imenom in geslom. Kdo se lahko prijavi, od kod in s kakšnim preverjanjem, določa pg_hba.conf. PostgreSQL vrstice bere od zgoraj navzdol, odloči pa prva ujemajoča se vrstica.
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
Načini preverjanja:
peer: le prek vtičnice Unix. Ime sistemskega uporabnika se mora ujemati z imenom uporabnika podatkovne baze, gesla ni. Zato delujesudo -u postgres psqlin zatopsql -U appuser appdbvrne napako „Peer authentication failed for user “appuser””, če ga ne zaženeš kot sistemski uporabnik z imenomappuser. Takrat dodaj stikalo-h localhostin povezava gre prek TCP, z geslom.ident: prek TCP isto zahteva od strežnika ident; v praksi se z njim z geslom ni mogoče prijaviti. To privzeto nastavi lastni paket AlmaLinux.scram-sha-256: preverjanje z geslom, ki gesla ne pošlje po omrežju, na strežniku pa hrani le soljen odtis. Uporabljaj tega.md5: stari način z geslom. PostgreSQL 18 ga označuje kot zastarelega; pri novi namestitvi ga ne uporabljaj. Po dokumentaciji PostgreSQL preverja s SCRAM, čepg_hba.confnavajamd5, geslo pa je že shranjeno kot odtis SCRAM (osnovna vrednostpassword_encryptionje od glavne različice 14scram-sha-256, tako je bilo tudi v preizkusu).
V AlmaLinux s sistemskim paketom vrstice host prepiši iz ident v scram-sha-256, nato znova naloži nastavitve:
sudo sed -i -E '/^host/ s/ident$/scram-sha-256/' /var/lib/pgsql/data/pg_hba.conf
sudo systemctl reload postgresql
Nato prijava z geslom deluje:
psql -h localhost -U appuser appdb
Podatki za povezavo aplikacije: gostitelj localhost ali 127.0.0.1, vrata 5432, zgornje ime podatkovne baze, uporabnik in geslo; v obliki URL postgresql://appuser:jelszo@localhost:5432/appdb. V skriptih lahko geslo podaš iz datoteke ~/.pgpass (localhost:5432:appdb:appuser:jelszo, dovoljenja 600), da ne pride v ukazno vrstico.
Dostop na daljavo
PostgreSQL privzeto sprejema povezave le znotraj računalnika (listen_addresses = 'localhost'). Če podatkovno bazo uporablja aplikacija na istem strežniku, tega ne spreminjaj. Z drugega računalnika je varnejša pot tunel SSH; če pa potrebuješ neposreden dostop, je treba nastaviti tri stvari: naslov poslušanja, pravilo pg_hba.conf in požarni zid.
Varnejša pot: tunel SSH
Tunel prek SSH poveže vrata tvojega računalnika z naslovom 127.0.0.1:5432 strežnika. V PostgreSQL ni treba ničesar spreminjati, vrata ostanejo od zunaj zaprta, promet pa potuje šifriran:
ssh -N -L 15432:127.0.0.1:5432 felhasznalo@szerver.pelda.hu
Dokler to teče, se na svojem računalniku lahko povežeš na naslov localhost:15432 (psql -h localhost -p 15432 -U appuser appdb ali iz grafičnega odjemalca, na primer DBeaver ali pgAdmin, ki znata tunel SSH zgraditi tudi sama). V preizkusu se je bilo tako mogoče z drugega računalnika prijaviti z geslom, z zgornjimi vrsticami pg_hba.conf. Če ga pogosto uporabljaš, lahko tunel vpišeš tudi v datoteko SSH config (LocalForward).
Neposreden dostop
1. Naslov poslušanja. V AlmaLinux v datoteki /var/lib/pgsql/data/postgresql.conf (pri PGDG /var/lib/pgsql/18/data/postgresql.conf), v Ubuntuju pa v novi datoteki v mapi conf.d:
echo "listen_addresses = '*'" | sudo tee /etc/postgresql/18/main/conf.d/listen.conf
'*' posluša na vseh naslovih; navedeš lahko tudi določen naslov IP. Sprememba zahteva ponovni zagon (sudo systemctl restart postgresql), nato sudo ss -ltnp | grep 5432 že pokaže naslov 0.0.0.0:5432 (glej: Izpis odprtih vrat).
2. pg_hba.conf. Oddaljenemu računalniku dovoli dostop, po možnosti le do potrebne podatkovne baze, omejeno z uporabnikom in naslovom IP:
host appdb appuser 203.0.113.10/32 scram-sha-256
Za to zadošča ponovno nalaganje (sudo systemctl reload postgresql). Če za povezavo ni ujemajoče se vrstice, sporočilo o napaki to tudi pove: „no pg_hba.conf entry for host “…”, user “appuser”, database “postgres”, no encryption”. Obseg naslovov 0.0.0.0/0 bi spustil noter celoten internet; ne uporabljaj ga.
3. Požarni zid. Vrata 5432 odpri le za naslov oddaljenega računalnika. V AlmaLinux (firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="postgresql" accept'
sudo firewall-cmd --reload
V Ubuntuju (ufw):
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
Če ufw še ni vklopljen, najprej dovoli SSH (sudo ufw allow OpenSSH), sicer se po sudo ufw enable zakleneš ven. O osnovah požarnega zidu govori članek o nastavitvi požarnega zidu na VPS.
Šifriranje. Paket AlmaLinux privzeto ne vklopi TLS (ssl = off), povezava je torej nešifrirana; to kaže tudi „no encryption” v zgornjem sporočilu o napaki. Paket Ubuntu se zažene z vrednostjo ssl = on, s samopodpisanim potrdilom sistema (snakeoil). Za neposredno povezavo prek interneta nastavi lastno potrdilo (ssl_cert_file, ssl_key_file) in vrstico pg_hba.conf prepiši v hostssl; ali pa ostani pri tunelu SSH.
SELinux v AlmaLinux
Lastni paket PostgreSQL iz AlmaLinux pod SELinuxom teče kot omejen proces (postgresql_t), zato je treba ob spremembi vrat ali podatkovnega imenika obvestiti tudi SELinux. V preizkusu se storitev po nastavitvi port = 5433 ni zagnala, v dnevniku je bilo avc: denied { name_bind }. Rešitev:
sudo dnf install policycoreutils-python-utils
sudo semanage port -a -t postgresql_port_t -p tcp 5433
Pri drugem podatkovnem imeniku (na primer na ločenem disku, /srv/pgdata) je treba v enoti systemd prepisati spremenljivko PGDATA, imeniku pa dati ustrezno oznako SELinux:
sudo systemctl edit postgresql
# v datoteko, ki se odpre:
# [Service]
# Environment=PGDATA=/srv/pgdata
sudo install -d -o postgres -g postgres -m 700 /srv/pgdata
sudo semanage fcontext -a -t postgresql_db_t "/srv/pgdata(/.*)?"
sudo restorecon -R /srv/pgdata
sudo postgresql-setup --initdb
sudo systemctl start postgresql
Brez oznake se storitev ni zagnala, z napako avc: denied { getattr }. O iskanju takih napak piše članek o napakah SELinux „Permission denied”. Programi paketa PGDG (/usr/pgsql-18/bin) v preizkusu niso dobili oznake SELinux, zato je PostgreSQL iz PGDG tekel brez omejitev (unconfined_service_t) in se je na drugih vratih ali z drugim podatkovnim imenikom zagnal tudi brez zgornjih korakov.
Osnovno prilagajanje
Osnovne nastavitve PostgreSQL so namenjene računalniku z malo pomnilnika: v preizkusu je bil shared_buffers (lastni predpomnilnik PostgreSQL) 128MB. Dokumentacija za izhodišče priporoča približno 25 % pomnilnika; na strežniku z 2 GB na primer 512 MB:
sudo -u postgres psql -c "ALTER SYSTEM SET shared_buffers = '512MB'"
sudo systemctl restart postgresql
sudo -u postgres psql -c "SHOW shared_buffers"
ALTER SYSTEM vrednost zapiše v datoteko postgresql.auto.conf, ki prepiše postgresql.conf; te datoteke ne urejaj ročno. Sprememba shared_buffers zahteva ponovni zagon, za večino drugih nastavitev zadošča ponovno nalaganje. Pomnilnik načrtuj skupaj z drugimi storitvami, da ostane tudi za spletni strežnik in PHP (glej: Zmanjkalo je pomnilnika: OOM killer, ukaz free in datoteka swap). Za natančnejše prilagajanje (work_mem, effective_cache_size, max_connections) je treba meriti tudi obremenitev; to presega ta članek. Če aplikacija pogosto poizveduje po istih podatkih, lahko breme s podatkovne baze prevzame tudi predpomnilnik Redis ali Valkey.
Varnostno kopiranje in obnovitev
Varnostna kopija podatkovne baze v stisnjeni lastni obliki, iz katere obnavlja pg_restore:
sudo -u postgres pg_dump -Fc appdb -f /var/lib/pgsql/backups/appdb.dump
V Ubuntuju je domači imenik uporabnika postgres /var/lib/postgresql, kopijo shrani tja ali v drugo mapo, v katero lahko piše uporabnik postgres. Obnovitev v novo, prazno podatkovno bazo:
sudo -u postgres createdb -O appuser appdb_vissza
sudo -u postgres pg_restore -d appdb_vissza /var/lib/pgsql/backups/appdb.dump
Če želiš besedilno datoteko SQL (na primer za prenos na drug računalnik ali za pregled), izpis pg_dump stisni in ga naloži nazaj s psql:
sudo -u postgres pg_dump appdb | gzip > appdb.sql.gz
gunzip -c appdb.sql.gz | sudo -u postgres psql -d appdb_vissza
pg_dump ne shrani uporabnikov in njihovih gesel, le vsebino podatkovne baze. Te shrani pg_dumpall; s stikalom --globals-only le uporabnike in pravice, brez njega celotno gručo z vsemi podatkovnimi bazami:
sudo -u postgres pg_dumpall --globals-only > globals.sql
sudo -u postgres pg_dumpall | gzip > osszes.sql.gz
V preizkusu je obnovitev zgornjih kopij uspela, skupaj s tabelami in podatki s šumniki. Redno varnostno kopiranje lahko načrtuješ s crontabom, kopijo pa hrani tudi na drugem računalniku (glej: Kako naredim varnostno kopijo svojega VPS?).
Menjava glavne različice
Podrazličice (na primer 18.5 → 18.6) pridejo z običajno posodobitvijo sistema (glej: Posodabljanje sistema z ukazoma dnf in apt), podatkov se ni treba dotikati. Pri menjavi glavne različice (na primer 16 → 18) je treba podatkovni imenik pretvoriti. Pred tem vedno naredi celotno varnostno kopijo s pg_dumpall.
V Ubuntuju in Debianu to opravi pg_upgradecluster. V preizkusu smo gručo 17 nadgradili na 18; najprej je treba izbrisati prazno, samodejno ustvarjeno gručo nove glavne različice:
sudo pg_dropcluster 18 main --stop
sudo pg_upgradecluster -m upgrade 17 main
pg_lsclusters
Privzeta metoda (-m dump) dela z izvozom in ponovnim uvozom; -m upgrade uporablja hitrejši program pg_upgrade. Nova gruča je prevzela vrata stare, stara je ostala v ustavljenem stanju. Če vse deluje, staro lahko izbrišeš: sudo pg_dropcluster 17 main.
V AlmaLinux 10 paket postgresql18-upgrade vsebuje stari strežnik (16) za pg_upgrade. V preizkusu je deloval ta vrstni red:
sudo systemctl stop postgresql
sudo dnf swap postgresql-server postgresql18-server
sudo dnf install postgresql18-upgrade
sudo PGSETUP_INITDB_OPTIONS="--no-data-checksums" postgresql-setup --upgrade
sudo systemctl start postgresql
Stikalo --no-data-checksums je potrebno, ker PostgreSQL 18 novo gručo privzeto ustvari s kontrolnimi vsotami podatkovnih strani, starejše glavne različice pa ne; brez njega se je postgresql-setup --upgrade ustavil z napako „old cluster does not use data checksums but the new one does”. Pazi tudi, da sta po pretvorbi postgresql.conf in pg_hba.conf privzeta: stare nastavitve in podatki se premaknejo v mapo /var/lib/pgsql/data-old, od tam prevzemi svoje spremembe. V AlmaLinux 9 je v modulu 18 paket postgresql-upgrade; te različice nismo preizkusili. Če tudi AlmaLinux nadgrajuješ na novo glavno različico, ti pomaga članek o ELevate.
Kateri paket izbrati?
Podatkovna baza manjše aplikacije dobro teče tudi na KVM VPS skupaj s spletno aplikacijo, če pomnilnik razdeliš tako, da ostane za predpomnilnik PostgreSQL in za aplikacijo. Če je podatkovna baza velika ali streže veliko hkratnim povezavam, izberi paket z več pomnilnika ali jo postavi na ločen strežnik. Če nisi prepričan, kateri ustreza tvoji aplikaciji, nam piši, pomagali ti bomo izbrati.


