Skip to content

Latest commit

 

History

History
242 lines (231 loc) · 7.67 KB

2. Instalacja i konfiguracja postgresql z rozszerzeniem postgis.md

File metadata and controls

242 lines (231 loc) · 7.67 KB

I. Ja wykonałem poniższe czynności na czystej instalacji Rocky Linux 9, ale nic nie stoi na przeszkodzie żeby użyć swojej ulubionej dystrybucji (o ile da się do niej zaimportować oficjalne repo postgresa). Postgis jest dostępny w repo postgresa dla RH/Centos/Rocky.
II. Zakładam że wszystkie komendy linuxowe wykonujemy przy uzyciu konta z uprawnieniami root.

  1. Instalacja repo, wyłączenie wbudowanego modułu (opcjonalnie - jeśli jest) i instalacja postgresa:
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql  
dnf install -y postgresql15 postgresql15-server  
  1. Tworzymy hasło dla (automatycznie utworzonego) usera LINUXOWEGO postgres:
passwd postgres
<wpisujemy/wklejamy hasło>
  1. (opcjonalnie) Kilka modyfikacji usługi:
    a. logowanie do konkretnego pliku (zgrywa się z późniejszą konfiguracją logów):
vim /etc/rsyslog.d/postgresql-startup.conf

wkleić:

if $programname == 'postgresql-startup' then /var/log/postgresql/postgresql-startup.log
& stop

dołożyć:

mkdir /var/log/postgresql/
touch /var/log/postgresql/postgresql-startup.log
chown postgres:root /var/log/postgresql/ -R
systemctl restart rsyslog

b. dodanie usługi do autostartu, ale tak, żeby pominąć "-15" na końcu oraz podmiana domyślnego katalogu z bazą:

ln -s /usr/lib/systemd/system/postgresql-15.service /usr/lib/systemd/system/postgresql.service
systemctl edit postgresql

dołożyć/podmienić:

[Service]
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/15/euronet_QGIS_db/
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=postgresql-startup

[Install]
Alias=postgresql.service
  1. Inicjalizacja bazy. U mnie wszystko jest w UTF8:
locale -a
/usr/pgsql-15/bin/postgresql-15-setup initdb postgresql --pgdata=/var/lib/pgsql/15/euronet_QGIS_db --username=postgres --encoding=UTF8 --locale=en_US.utf8
rm -rf /var/lib/pgsql/15/euronet_QGIS_db/log
(katalog log usunięty bo i tak mi nie będzie potrzebny - patrz niżej)
  1. Modyfikacja uprawnień dostępu:
vim /var/lib/pgsql/15/euronet_QGIS_db/pg_hba.conf

należy dodać przynajmniej:

host    all             all             moja_podsieć_biurowa/25           md5

u mnie całość wygląda tak:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             postgres                                peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             moja_podsieć_biurowa/25           md5
# IPv6 local connections:
# host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
# host    replication     all             ::1/128                 scram-sha-256
  1. Modyfikacja konfiguracji:
vim /var/lib/pgsql/15/euronet_QGIS_db/postgresql.conf

u mnie całość wygląda tak (poniżej wszystkie "odhashowane" linijki pliku, od góry do dołu):

listen_addresses = '127.0.0.1, IP MOJEGO SERWERA'
max_connections = 1000
superuser_reserved_connections = 3
shared_buffers = 512MB
temp_buffers = 64MB
work_mem = 8GB
maintenance_work_mem = 128MB
logical_decoding_work_mem = 256MB
max_stack_depth = 4MB
dynamic_shared_memory_type = posix
max_files_per_process = 1000
effective_io_concurrency = 10
# no more than CPU cores:
max_worker_processes = 20
max_parallel_workers = 20
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/postgresql/'
log_filename = 'postgresql-%a.log'
log_rotation_age = 1d
log_rotation_size = 0
log_truncate_on_rotation = on
log_min_messages = notice
log_min_error_statement = warning
log_min_duration_statement = 3000
log_checkpoints = on
log_connections = off
log_disconnections = off
log_duration = off
log_error_verbosity = default
log_hostname = off
log_line_prefix = '%t session ID: %c <U: %u DB: %d host: %r> tag: %i,  '
log_lock_waits = on
log_statement = 'ddl'
log_replication_commands = on
log_timezone = 'Europe/Warsaw'
track_activities = on
track_counts = on
track_io_timing = on
track_functions = all 
compute_query_id = auto
datestyle = 'SQL, DMY'
timezone = 'Europe/Warsaw'
client_encoding = 'utf8'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
shared_preload_libraries = 'pg_prewarm' 
pg_stat_statements.max = 100000
pg_stat_statements.track = all
pg_prewarm.autoprewarm = 'true'
pg_prewarm.autoprewarm_interval = 120s

oczywiście każdy może sobie konfigurować jak mu wygodniej :]

(opcjonalnie) jeśli chcemy ssl* - zapisujemy na serwerze pliki z: certyfikatem, ścieżką certyfikacji oraz kluczem, a następnie:

chmod 0640 /etc/ssl/certs/plik z kluczem
chown root:postgres /etc/ssl/certs/plik z kluczem
vim /var/lib/pgsql/15/euronet_QGIS_db/postgresql.conf

modyfikujemy:

ssl = on
ssl_ca_file = '/etc/ssl/certs/plik z łańcuchem CA + chain'
ssl_cert_file = '/etc/ssl/certs/plik z certyfikatem'
ssl_key_file = '/etc/ssl/certs/plik z kluczem'

*ssl jest wymagany do wdrożenia LISTEN -- NOTIFY, aczkolwiek jeszcze mi się tego nie udało uruchomić (wywala mi ciągle QGIS-a)

w tym momencie komenda:

systemctl start postgresql

powinna uruchomić naszą usługę bez błędów. Jeśli tak się stało - zaczynamy od zabezpieczenia bazy:

su - postgres
psql -c "ALTER USER postgres WITH PASSWORD 'jakieś_długie_hasło';"
exit
systemctl restart postgresql
  1. utworzenie bazy danych:
CREATE DATABASE MOJA_BAZA_QGISA ENCODING UTF8 LOCALE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
  1. Instalacja postgisa:
dnf install -y postgis33_15 postgis33_15-client postgis33_15-utils postgis33_15-docs

jeśli wyskoczy wymaganie yum-utils bądź powertoolsów:
"Powertools is known as crb under RL9. dnf config-manager --enable crb"

dnf -y install yum-utils
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf config-manager --set-enabled crb
systemctl restart postgresql
su - postgres
psql MOJA_BAZA_QGISA
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION address_standardizer;

sprawdzenie:

SELECT postgis_full_version();
  1. Konfiguracja ról i użytkowników. Przyjąłem rolę 'qgisdbuser_role' za główną - będzie np. właścicielem bazy. Pozostali użytkownicy będą należeli do roli:
psql MOJA_BAZA_QGISA
CREATE ROLE qgisdbuser_role WITH
  NOLOGIN
  NOSUPERUSER
  INHERIT
  NOCREATEDB
  NOCREATEROLE
  NOREPLICATION;
GRANT pg_read_all_data, pg_signal_backend TO qgisdbuser_role;

i dodanie przykładowego użytkownika:

CREATE ROLE testowy_user WITH
  LOGIN
  NOSUPERUSER
  INHERIT
  NOCREATEDB
  NOCREATEROLE
  NOREPLICATION;
GRANT qgisdbuser_role TO testowy_user;

userowi najprościej zmienić hasło za pomocą:

su - postgres
psql -c "ALTER USER testowy_user WITH PASSWORD 'jakieś_hasło';"

a jak będzie chciał ustawić sobie własne - może to zrobić z łatwością choćby poprzez QGIS-owego DB managera: Baza danych -> DB manager -> rozwinąć postgis, rozwinąć swoją bazę -> okno SQL (lewy górny róg) -> wpisać:

ALTER USER testowy_user WITH PASSWORD 'jakieś_nowe_hasło';

kliknąć "wykonaj"