Přeskočit obsah

Instalace interní DB

Jedná se o interní build DataLite kompilovaný pro použití s TSM. Obsahuje nejnovější stabilní verzi (v době překladu) PostgreSQL verze 12.7.

Obsahuje následující rozšiřující moduly:

  • PostGIS
  • Pgrouting

Pro verzi Centos 7.x je kompilována s knihovnou OpenSSL ve verzi 1.0.2k (to je nejnovější známá verze 1.0.x knihovny).

Binární balíček

Zákazníkům dodáváme kompletně připravený build, který obsahuje dva soubory, např.:

  • postgresql-12.7.centos7.2012-07-21.tgz
  • postgresql-12.7.centos7.2012-07-21.tgz.sha
Note

Např. SHA256 kontrolní součet pro binární balíček postgresql-12.7.centos7.2012-07-21.tgz je 3d15b876f63f594517033e54c35f9f8d14377989a8168640da0ddc1ce5eb1efe

Rozbalení balíčku

Soubor je potřeba rozbalit ve složce /opt/tsm/sw, distribuce je připraveno přímo pro tento adresář:

1
2
cd /opt/tsm/sw
tar zxf postgresql-12.7.centos7.2012-07-21.tgz

Systemd skript

Pokud je distribuce TSM spouštěna pod uživatelem tsm, pak pod stejným uživatelem by měla běžet i dodaná PostgreSQL DB. Postup zprovoznění systemd by měl být takto:

  1. vytvořit soubor /opt/tsm/systemd.d/tsm-postgres.service
  2. vytvořit symbolický odkaz tohoto souboru do /usr/lib/systemd/system

Obsah soboru tsm-postgres.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[Unit]
Description=PostgreSQL database server 12.x
After=network.target

[Service]
Type=forking

User=tsm
Group=tsm

Environment=LD_LIBRARY_PATH=/opt/tsm/sw/postgres/12/dist/lib
Environment=POSTGRESQL_PG_CONFIG=/opt/tsm/sw/postgres/12/dist/bin/pg_config
Environment=POSTGRESQL_EXECUTABLE=/opt/tsm/sw/postgres/12/dist/bin/postgres

ExecStart=/opt/tsm/sw/postgres/12/dist/bin/pg_ctl -D /opt/tsm/data/postgres/TSM -l /opt/tsm/data/postgres/TSM/logfile start
ExecStop=/opt/tsm/sw/postgres/12/dist/bin/pg_ctl -D /opt/tsm/data/postgres/TSM -l /opt/tsm/data/postgres/TSM/logfile stop -m fast
ExecReload=/opt/tsm/sw/postgres/12/dist/bin/pg_ctl -D /opt/tsm/data/postgres/TSM -l /opt/tsm/data/postgres/TSM/logfile reload

[Install]
WantedBy=default.target

Vytvoření TSM databáze

Pod uživatelem tsm nastavíme proměnné prostředí:

1
2
3
4
export PATH=/opt/tsm/sw/postgres/12/dist/bin:$PATH
export LD_LIBRARY_PATH=/opt/tsm/sw/postgres/12/dist/lib:$LD_LIBRARY_PATH
export POSTGRESQL_PG_CONFIG=/opt/tsm/sw/postgres/12/dist/bin/pg_config
export POSTGRESQL_EXECUTABLE=/opt/tsm/sw/postgres/12/dist/bin/postgres

Dále vytvoříme databázi tsm:

1
2
3
4
initdb \
  -D /opt/tsm/data/postgres/TSM \
  --encoding=utf-8  \
  --locale=cs_CZ.utf-8

Upravíme soubor /opt/tsm/data/postgres/TSM/postgresql.conf, zvýšíme počet konexí ze 100 na 500:

1
max_connections = 500 # (change requires restart)

Upravíme soubor /opt/tsm/data/postgres/TSM/pg_hba.conf. Změníme řádky, kde je:

1
host    all             all             127.0.0.1/32            trust

Upravíme nakonci z trust na md5:

1
host    all             all             127.0.0.1/32            md5

Pod uživatelem root spustíme systemd službu tsm-postgres:

1
2
systemct enable tsm-postgres
systemctl start tsm-postgres

Zkontrolujeme, zda databáze běží:

1
systemctl status tsm-postgres

Na výstupu by se mělo objevit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
● tsm-postgres.service - PostgreSQL database server 12.x
   Loaded: loaded (/usr/lib/systemd/system/tsm-postgres.service; enabled; vendor preset: disabled)
   Active: active (running) since St 2021-07-21 08:32:32 UTC; 1h 3min ago
 Main PID: 457 (postgres)
   CGroup: /system.slice/tsm-postgres.service
           ├─457 /opt/tsm/sw/postgres/12/dist/bin/postgres -D /opt/tsm/data/postgres/TSM
           ├─459 postgres: checkpointer
           ├─460 postgres: background writer
           ├─461 postgres: walwriter
           ├─462 postgres: autovacuum launcher
           ├─463 postgres: stats collector
           └─464 postgres: logical replication launcher

Pod uživatelem tsm se zkusíme připojit k postgres databázi přes socket, nemělo by vyžadovat heslo:

1
2
3
4
5
6
psql -d postgres

psql (12.7)
Type "help" for help.

postgres=# \q

Pokud spojení funguje, vytvoříme databázi tsm, nejprve se opět připojíme k DB přes socket:

1
psql -d postgres

A spustíme následující SQL příkazy:

1
2
3
4
CREATE ROLE tsm_admin WITH CREATEROLE LOGIN PASSWORD 'tsm_admin';
CREATE DATABASE tsm ENCODING 'utf-8' LC_COLLATE 'cs_CZ.utf-8' TEMPLATE template0 OWNER='tsm_admin';
GRANT ALL ON DATABASE tsm TO tsm_admin;
ALTER USER tsm_admin WITH SUPERUSER;

Celý průběh v terminálu vypadá takto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[tsm@localhost ~]$ psql -d postgres
psql (12.7)
Type "help" for help.

postgres=# CREATE ROLE tsm_admin WITH CREATEROLE LOGIN PASSWORD 'tsm_admin';
CREATE ROLE
postgres=# CREATE DATABASE tsm ENCODING 'utf-8' LC_COLLATE 'cs_CZ.utf-8' TEMPLATE template0 OWNER='tsm_admin';
CREATE DATABASE
postgres=# GRANT ALL ON DATABASE tsm TO tsm_admin;
GRANT
postgres=# ALTER USER tsm_admin WITH SUPERUSER;
ALTER ROLE
postgres=# \q
[tsm@localhost ~]$

Po vytvoření databáze tsm se k ní zkusíme připojit a před-vytvořit schéma am, které potřebuje rozšíření postgis, takto se připojíme pod uživatelem tsm opět přes socket:

1
psql -d tsm

Spustíme následující SQL skripty:

1
2
CREATE SCHEMA AM;
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA AM;

Celá ta session v terminálu by měla vypadat takto:

1
2
3
4
5
6
7
8
9
[tsm@localhost ~]$ psql -d tsm
psql (12.7)
Type "help" for help.

tsm=# CREATE SCHEMA AM;
CREATE SCHEMA
tsm=# CREATE EXTENSION IF NOT EXISTS postgis SCHEMA AM;
CREATE EXTENSION
tsm=# \q

Zkusíme se připojit do nově vytvořené databáze nikoliv přes socket, ale přímo přes host, tak jak to budou dělat aplikace tsm přes JDBC, pomocí vytvořeného uživatele tsm_admin (heslo je rovněž tsm_admin):

1
psql -h 127.0.0.1 -U tsm_admin -d tsm

Pokud se připojíme, v terminálu by se mělo objevit:

1
2
3
4
5
[tsm@localhost ~]$ psql -d postgres
psql (12.7)
Type "help" for help.

postgres=# \q

Build

Kapitola popisuje, jak reprodukovat (tedy připravit "shodný") build dodávaný společností DataLite.

Build databáze PostgreSQL může probíhat přímo na nějakém virtuálním serveru, kde běží CentOS ve verzi 7.x, nebo se k tomu dá využít prostředí docker.

V prostředí docker se spustí container takto:

1
docker run --rm -it -v $(pwd)/out:/out centos:7
Note

Adresář ./out se připojuje do containeru proto, abychom do něj pak přenesli zbuildovanou verzi zpět k sobě na PC, na kterém docker spouštíme. Detaily práce s docker nejsou předmětem této dokumentace.

Instalace balíčků

Na PC, na kterém probíhá build je pak potřeba nainstalovat následující balíčky (přes yum).

Build pak probíhá tímto způsobem:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
yum group install -y "Development Tools"
yum install -y epel-release
yum install -y \
    libreadline \
    readline-devel \
    openssl-devel \
    python-devel \
    which \
    cmake3 \
    boost169-devel \
    perl-version perl-Data-Dumper

Build skript

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
export SRC_DIR=/usr/local/src/
export PG_DIST_DIR=/opt/tsm/sw/postgres/12/dist
export PATH=${PG_DIST_DIR}:$PATH

export PG_VERSION=12.7
export GEOS_VERSION=3.9.1
export PROJ_VERSION=8.0.0
export SQLITE_VER=3350500
export LIB_TIFF_VERSION=4.3.0
export CURL_VERSION=7.77.0
export POSTGIS_VERSION=3.1.2
export GDAL_VERSION=3.3.0
export PG_ROUTING_VERSION=3.2.0

mkdir -p ${PG_DIST_DIR}

# Install POSTGRES
cd ${SRC_DIR}
curl -OL https://ftp.postgresql.org/pub/source/v${PG_VERSION}/postgresql-${PG_VERSION}.tar.gz
tar zxf postgresql-${PG_VERSION}.tar.gz
chmod 644 postgresql-${PG_VERSION}

cd ${SRC_DIR}/postgresql-${PG_VERSION}
./configure --prefix=${PG_DIST_DIR} --with-openssl
make -j$(getconf _NPROCESSORS_ONLN)
make install

# Install GEOS
cd ${SRC_DIR}
curl -OL http://download.osgeo.org/geos/geos-${GEOS_VERSION}.tar.bz2
bunzip2 geos-${GEOS_VERSION}.tar.bz2
tar xf geos-${GEOS_VERSION}.tar
cd ${SRC_DIR}/geos-${GEOS_VERSION}
./configure --prefix=${PG_DIST_DIR}
make -j$(getconf _NPROCESSORS_ONLN)
make install

# Install PROJ
cd ${SRC_DIR}
curl -OL https://www.sqlite.org/2021/sqlite-autoconf-${SQLITE_VER}.tar.gz
tar zxf sqlite-autoconf-${SQLITE_VER}.tar.gz
cd sqlite-autoconf-${SQLITE_VER}
autoconf
./configure --prefix=${PG_DIST_DIR}

make -j$(getconf _NPROCESSORS_ONLN)
make install

cd ${SRC_DIR}
curl -OL http://download.osgeo.org/libtiff/tiff-${LIB_TIFF_VERSION}.tar.gz
tar zxf tiff-${LIB_TIFF_VERSION}.tar.gz
cd tiff-${LIB_TIFF_VERSION}

PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure --prefix=${PG_DIST_DIR}

make -j$(getconf _NPROCESSORS_ONLN)
make install

cd ${SRC_DIR}
curl -OL https://curl.se/download/curl-${CURL_VERSION}.tar.gz
tar zxf curl-${CURL_VERSION}.tar.gz
cd curl-${CURL_VERSION}

PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure --prefix=${PG_DIST_DIR} --with-openssl

make -j$(getconf _NPROCESSORS_ONLN)
make install

cd ${SRC_DIR}
curl -OL https://download.osgeo.org/proj/proj-${PROJ_VERSION}.tar.gz
tar zxf proj-${PROJ_VERSION}.tar.gz
cd ${SRC_DIR}/proj-${PROJ_VERSION}

PATH=${PG_DIST_DIR}/bin:$PATH \
PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure --prefix=${PG_DIST_DIR}

make -j$(getconf _NPROCESSORS_ONLN)
make install

# Install PostGIS
cd ${SRC_DIR}
curl -OL ftp://xmlsoft.org/libxml2/libxml2-git-snapshot.tar.gz
tar zxf libxml2-git-snapshot.tar.gz
cd $(ls -d */ -1 | grep libxml2)

PATH=${PG_DIST_DIR}/bin:$PATH \
PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure --prefix=${PG_DIST_DIR}

make -j$(getconf _NPROCESSORS_ONLN)
make install

cd ${SRC_DIR}
curl -OL https://github.com/OSGeo/gdal/releases/download/v${GDAL_VERSION}/gdal-${GDAL_VERSION}.tar.gz
tar zxf gdal-${GDAL_VERSION}.tar.gz
cd gdal-${GDAL_VERSION}

PATH=${PG_DIST_DIR}/bin:$PATH \
PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure \
--prefix=${PG_DIST_DIR} \
--with-proj=${PG_DIST_DIR} \
--with-sqlite3=${PG_DIST_DIR}

make -j$(getconf _NPROCESSORS_ONLN)
make install

cd ${SRC_DIR}
curl -OL https://download.osgeo.org/postgis/source/postgis-${POSTGIS_VERSION}.tar.gz
tar zxf postgis-${POSTGIS_VERSION}.tar.gz
cd postgis-${POSTGIS_VERSION}

PATH=${PG_DIST_DIR}/bin:$PATH \
PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib \
./configure --prefix=${PG_DIST_DIR} \
--with-proj=${PG_DIST_DIR} \
--with-project=${PG_DIST_DIR} \
--with-sqlite3=${PG_DIST_DIR} \
--with-opensll --without-protobuf

make -j$(getconf _NPROCESSORS_ONLN)
make install

# Install Pgrouting
cd ${SRC_DIR}
curl -OL https://github.com/pgRouting/pgrouting/releases/download/v${PG_ROUTING_VERSION}/pgrouting-${PG_ROUTING_VERSION}.tar.gz
tar zxf pgrouting-${PG_ROUTING_VERSION}.tar.gz
cd pgrouting-${PG_ROUTING_VERSION}
mkdir build
cd build/

BOOST_ROOT=/usr/include/boost169 \
PATH=${PG_DIST_DIR}/bin:$PATH \
PKG_CONFIG_PATH=${PG_DIST_DIR}/lib/pkgconfig \
LD_LIBRARY_PATH=${PG_DIST_DIR}/lib cmake3 ..

# Patch cmake script to resolve some issues!
echo "set(CMAKE_C_STANDARD 99)" >> ../CMakeLists.txt.fix
echo "set(CMAKE_C_STANDARD_REQUIRED TRUE)" >> ../CMakeLists.txt.fix
'mv' ../CMakeLists.txt ../CMakeLists.txt.gen
cat ../CMakeLists.txt.fix ../CMakeLists.txt.gen > ../CMakeLists.txt

make -j$(getconf _NPROCESSORS_ONLN)
make install

Výsledný balíček s postgres

Pokud je build proveden v docker (jak je zmíněno výše), pak na konci buildu stačí provést tyto příkazy:

1
2
3
4
cd /opt/tsm/sw
tar zcvf /out/postgresql-12.7.centos7.2012-07-21.tgz postgres/

exit

Po ukončení práce s containerem (příkaz exit) je pak na PC, na kterém probíhal build výsledný soubor:

1
2
ls -la ./out
.rw-r--r-- 290M root 21 čvc 08:43 postgresql-12.7.centos7.2012-07-21.tgz