While TDE (Transparent Data Encryption) is considered a checklist feature in some parts of the PostgreSQL community this topic comes up all over again. The same is true with our customers, it doesn’t matter at all if it technically makes sense to have TDE or not, some just must have it for reasons outside of their control, mostly due to legal requirements. As vanilla community PostgreSQL does not provide TDE the only option is to use one of the commercial distributions of PostgtreSQL. There are several out there and we’ll take a look at some of them but today we’ll start with Fujitsu Enterprise Postgres. This will be a two blog series, the first one (this) describing how to setup this version of PostgreSQL and in the follow up post we’ll look at how TDE looks like in this distribution and how it can be setup in Fujitsu Enterprise Postgres.

Fujitsu provides a 90 trial version for which you need to register here. Once you’ve done that you should receive an Email with a link to download the software (around 1.3gb). The supported operating systems are either RHEL 8 & 9 or SLES 15. If you are on Debian or anything based on Debian such as Ubuntu then you can already stop here as it is not supported.

As usual, the operating system needs to be prepared, and on RHEL 9 which I am using here this means enabling the code ready builder repository and installing the required packages:

[root@rhel9-latest ~]$ subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
[root@rhel9-latest ~]$ dnf install alsa-lib audit-libs bzip2-libs cyrus-sasl-lib gdb pcp-system-tools glibc glibc.i686 iputils libnsl2 libicu libgcc libmemcached-awesome libselinux libstdc++ libtool-ltdl libzstd llvm lz4-libs ncurses-libs net-tools nss-softokn-freebl pam perl-libs protobuf-c python3 rsync sudo sysstat tcl unzip xz-libs zlib perl

For this the system needs to be subscribed to Red Hat but you might also try either Rocky or Alma Linux, this should work as well (both are clones of RHEL) and those do not need a subscription.

In the Quick Start Guide an operating system user called “fepuser” is used, but we prefer to go with standard “postgres” user, so:

[root@rhel9-latest ~]$ groupadd postgres
[root@rhel9-latest ~]$ useradd -g postgres -m postgres
[root@rhel9-latest ~]$ grep postgres /etc/sudoers
postgres        ALL=(ALL)       NOPASSWD: ALL

We’ll also not use “/database/inst1” as PGDATA but rather our standard:

[root@rhel9-latest ~]$ su - postgres
[postgres@rhel9-latest ~]$ sudo mkdir -p /u02/pgdata
[postgres@rhel9-latest ~]$ sudo chown postgres:postgres /u02/pgdata/
[postgres@rhel9-latest ~]$ exit

As the installation files are provided in ISO format, loop-back mount that:

[root@rhel9-latest ~]$ mkdir /mnt/media
[root@rhel9-latest ~]$ mount -t iso9660 -r -o loop /root/ep-postgresae-linux-x64-1800-1.iso /mnt/media/
[root@rhel9-latest ~]$ ls -l /mnt/media/
total 161
dr-xr-xr-x. 4 root root  2048 Dec  4 03:24 CIR
dr-xr-xr-x. 3 root root  2048 May 18  2023 CLIENT64
dr-xr-xr-x. 4 root root  2048 Dec  4 03:24 COMMON
-r-xr-xr-x. 1 root root  4847 Aug 14 10:49 install.sh
dr-xr-xr-x. 5 root root  2048 Nov  5 08:47 manual
dr-xr-xr-x. 2 root root 24576 Oct 29 17:04 OSS_Licence
dr-xr-xr-x. 3 root root  2048 Jun 13  2016 parser
dr-xr-xr-x. 3 root root  2048 Mar 27  2024 PGBACKREST
dr-xr-xr-x. 3 root root  2048 May 18  2023 PGPOOL2
-r--r--r--. 1 root root 46882 Nov 28 02:39 readme.txt
-r--r--r--. 1 root root 53702 Nov 28 01:21 readme_utf8.txt
dr-xr-xr-x. 2 root root  2048 May 18  2023 sample
dr-xr-xr-x. 3 root root  2048 May 18  2023 SERVER
-r-xr-xr-x. 1 root root 12848 Aug 14 10:50 silent.sh
dr-xr-xr-x. 3 root root  2048 May 18  2023 WEBADMIN

That should be all to start the installation (there is a silent mode as well, but we’re not going to look into this for the scope of this post):

[root@rhel9-latest ~]$ cd /mnt/media/
[root@rhel9-latest media]$ ./install.sh
ERROR: The installation of Uninstall (middleware) ended abnormally.

Installation was ended abnormally.

… and that directly fails. Looking at the log file it becomes clear that “tar” is missing (this is a minimal installation of RHEL 9 and this does apparently does not come with tar by default):

[root@rhel9-latest media]$ grep tar /var/log/fsep_SERVER64_media_1800_install.log
sub_envcheck.sh start
sub_cir_install.sh start
./CIR/Linux/cirinst.sh: line 562: tar: command not found
sub_envcheck.sh start
sub_cir_install.sh start
./CIR/Linux/cirinst.sh: line 562: tar: command not found

So, once more:

[root@rhel9-latest media]$ dnf install -y tar
[root@rhel9-latest media]$ ./install.sh

The following products can be installed:
1: Fujitsu Enterprise Postgres Advanced Edition (64bit) 18
2: Fujitsu Enterprise Postgres Client (64bit) 18
3: Fujitsu Enterprise Postgres WebAdmin 18
4: Fujitsu Enterprise Postgres Pgpool-II 18
5: Fujitsu Enterprise Postgres pgBackRest 18

Select the product to be installed.
Note: If installing the Server, it is strongly recommended to install WebAdmin.
To select multiple products, separate using commas (,). (Example: 1,2)
[number,all,q](The default value is 1,2,3): all

From the output above we can see that Fujitsu bundles Pgpool-II and pgBackRest with their distribution of PostgreSQL. We’re just going to install “all” and the installation runs smoothly until the end:

Selected product
  Fujitsu Enterprise Postgres Advanced Edition (64bit) 18
  Fujitsu Enterprise Postgres Client (64bit) 18
  Fujitsu Enterprise Postgres WebAdmin 18
  Fujitsu Enterprise Postgres Pgpool-II 18
  Fujitsu Enterprise Postgres pgBackRest 18

Do you want to install the above product?
y: Proceed to the next step
n: Select the product again
q: Quit without installing
[y,n,q](The default value is y): y

==============================================================================

Product to be installed
  Fujitsu Enterprise Postgres Advanced Edition (64bit) 18
    New installation
  Fujitsu Enterprise Postgres Client (64bit) 18
    New installation
  Fujitsu Enterprise Postgres WebAdmin 18
    New installation
  Fujitsu Enterprise Postgres Pgpool-II 18
    New installation
  Fujitsu Enterprise Postgres pgBackRest 18
    New installation

Installation directory information
  Fujitsu Enterprise Postgres Advanced Edition (64bit) 18
    /opt/fsepv18server64
  Fujitsu Enterprise Postgres Client (64bit) 18
    /opt/fsepv18client64
  Fujitsu Enterprise Postgres WebAdmin 18
    /opt/fsepv18webadmin
  Fujitsu Enterprise Postgres Pgpool-II 18
    /opt/fsepv18pgpool-II
  Fujitsu Enterprise Postgres pgBackRest 18
    /opt/fsepv18pgbackrest

Setup information
  WebAdmin setup: Execute
  Web server port number: 27515
  WebAdmin internal port number: 27516

Start installation using the above information?
y: Start the installation
c: Change the information
q: Quit without installing
[y,c,q](The default value is y): y


==============================================================================
Starting installation.

Fujitsu Enterprise Postgres Advanced Edition (64bit) 18 Installation

Installation is complete.

Fujitsu Enterprise Postgres Client (64bit) 18 Installation

Installation is complete.

Fujitsu Enterprise Postgres WebAdmin 18 Installation

Installation is complete.

Fujitsu Enterprise Postgres Pgpool-II 18 Installation

Installation is complete.

Fujitsu Enterprise Postgres pgBackRest 18 Installation

Installation is complete.

Starting setup.

Sets up WebAdmin.

Setup is complete.

Installed successfully.

All the files have been installed under “/opt”, grouped by component:

[root@rhel9-latest ~]$ ls -l /opt/
total 4
dr-xr-x---.  5 root root   59 Jan 26 09:41 FJSVcir
drwxr-xr-x.  3 root root 4096 Jan 26 09:42 FJSVqstl
drwxr-xr-x. 14 root root  155 Nov 21 08:57 fsepv18client64
drwxr-xr-x.  7 root root   63 Jan 26 09:42 fsepv18pgbackrest
drwxr-xr-x.  9 root root   91 Jan 26 09:42 fsepv18pgpool-II
drwxr-xr-x. 15 root root  162 Oct 27 05:57 fsepv18server64
drwxr-xr-x. 13 root root  137 Jan 26 09:42 fsepv18webadmin

What follows below is the installation of our DMK, just ignore it (or ask in the comments if you’re interested), this makes it a bit easier with the environment:

[postgres@rhel9-latest ~]$ sudo mkdir -p /opt/local
[postgres@rhel9-latest ~]$ sudo chown postgres:postgres /opt/local/
[postgres@rhel9-latest ~]$ cd /opt/local/
[postgres@rhel9-latest local]$ unzip /home/postgres/dmk_postgres-2.4.1.zip
[postgres@rhel9-latest local]$ cat /etc/pgtab
fe18:/opt/fsepv18server64/bin/:dummy:9999:D
[postgres@rhel9-latest local]$ sudo chown postgres:postgres /etc/pgtab
[postgres@rhel9-latest local]$ cp dmk/etc/dmk.conf.unix dmk/etc/dmk.conf
[postgres@rhel9-latest local]$ dmk/bin/dmk.bash
[postgres@rhel9-latest local]$ cat dmk/templates/profile/dmk.postgres.profile >> ~/.bash_profile
[postgres@rhel9-latest local]$ exit
logout
[root@rhel9-latest ~]$ su - postgres
Last login: Mon Jan 26 09:51:49 CET 2026 from 192.168.122.1 on pts/1


 PostgreSQL Clusters up and running on this host:
 ----------------------------------------------------------------------------------------------

 PostgreSQL Clusters NOT running on this host:
 ----------------------------------------------------------------------------------------------

Having that setup we do not need to worry about PATH and other environment settings, they just got setup correctly, so we can directly ask for which version of PostgreSQL we’re faced here:

postgres@rhel9-latest:/home/postgres/ [fe18] which initdb
/opt/fsepv18server64/bin/initdb
postgres@rhel9-latest:/home/postgres/ [fe18] initdb --version
initdb (PostgreSQL) 18.0

Except for the installation directory there does not seem to be a special Fujitsu branding and we’re on PostgreSQL 18.0. The preferred method of creating a new PostgreSQL instance seems to be to use WebAdmin which was installed and started during the installation:

We could go this way, but as we do want to know how it looks in the background we’re going to use plain initdb. Looking at the switches of this version of initdb it is mostly the same as plain PostgreSQL except for the “coordinator”, “coord_conninfo”, and “datanode” switches:

postgres@rhel9-latest:/home/postgres/ [fe18] initdb --help
initdb initializes a PostgreSQL database cluster.

Usage:
  initdb [OPTION]... [DATADIR]

Options:
  -A, --auth=METHOD         default authentication method for local connections
      --auth-host=METHOD    default authentication method for local TCP/IP connections
      --auth-local=METHOD   default authentication method for local-socket connections
      --coordinator         create an instance of the coordinator       <- XXXXXXXXXXXXXXXXXXXXXXXXX
      --coord_conninfo      connection parameters to the coordinator    <- XXXXXXXXXXXXXXXXXXXXXXXXX
      --datanode            create an instance of the datanode          <- XXXXXXXXXXXXXXXXXXXXXXXXX
 [-D, --pgdata=]DATADIR     location for this database cluster
  -E, --encoding=ENCODING   set default encoding for new databases
  -g, --allow-group-access  allow group read/execute on data directory
      --icu-locale=LOCALE   set ICU locale ID for new databases
      --icu-rules=RULES     set additional ICU collation rules for new databases
  -k, --data-checksums      use data page checksums
      --locale=LOCALE       set default locale for new databases
      --lc-collate=, --lc-ctype=, --lc-messages=LOCALE
      --lc-monetary=, --lc-numeric=, --lc-time=LOCALE
                            set default locale in the respective category for
                            new databases (default taken from environment)
      --no-locale           equivalent to --locale=C
      --builtin-locale=LOCALE
                            set builtin locale name for new databases
      --locale-provider={builtin|libc|icu}
                            set default locale provider for new databases
      --no-data-checksums   do not use data page checksums
      --pwfile=FILE         read password for the new superuser from file
  -T, --text-search-config=CFG
                            default text search configuration
  -U, --username=NAME       database superuser name
  -W, --pwprompt            prompt for a password for the new superuser
  -X, --waldir=WALDIR       location for the write-ahead log directory
      --wal-segsize=SIZE    size of WAL segments, in megabytes

Less commonly used options:
  -c, --set NAME=VALUE      override default setting for server parameter
  -d, --debug               generate lots of debugging output
      --discard-caches      set debug_discard_caches=1
  -L DIRECTORY              where to find the input files
  -n, --no-clean            do not clean up after errors
  -N, --no-sync             do not wait for changes to be written safely to disk
      --no-sync-data-files  do not sync files within database directories
      --no-instructions     do not print instructions for next steps
  -s, --show                show internal settings, then exit
      --sync-method=METHOD  set method for syncing files to disk
  -S, --sync-only           only sync database files to disk, then exit

Other options:
  -V, --version             output version information, then exit
  -?, --help                show this help, then exit

If the data directory is not specified, the environment variable PGDATA
is used.

Report bugs to <[email protected]>.
PostgreSQL home page: <https://www.postgresql.org/>

(Not sure if bugs for this version of initdb really should go to the official mailing lists, but this is another topic).

Initializing a new instance is not different from what we know from vanilla PostgreSQL:

postgres@rhel9-latest:/home/postgres/ [fe18] initdb --pgdata=/u02/pgdata/fe18/PG1 --lc-collate="C" --lc-ctype="C" --encoding=UTF8
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with this locale configuration:
  locale provider:   libc
  LC_COLLATE:  C
  LC_CTYPE:    C
  LC_MESSAGES: en_US.UTF-8
  LC_MONETARY: en_US.UTF-8
  LC_NUMERIC:  en_US.UTF-8
  LC_TIME:     en_US.UTF-8
The default text search configuration will be set to "english".

Data page checksums are enabled.

creating directory /u02/pgdata/fe18/PG1 ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Europe/Berlin
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /u02/pgdata/fe18/PG1 -l logfile start

As we do want the instance to start automatically when the operating system is starting up lets use the systemd service template provided by Fujitsu to integrate that with systemd:

## Template
postgres@rhel9-latest:/home/postgres/ [fe18] cat /opt/fsepv18server64/share/fsepsvoi.service.sample
# Copyright FUJITSU LIMITED 2025
[Unit]
Description=FUJITSU Enterprise Postgres <inst1>
Requires=network-online.target
After=network.target network-online.target

[Service]
ExecStart=/bin/bash -c '/opt/fsepv<x>server64/bin/pgx_symstd start /opt/fsepv<x>server64 /database/inst1'
ExecStop=/bin/bash -c '/opt/fsepv<x>server64/bin/pgx_symstd stop /opt/fsepv<x>server64 /database/inst1'
ExecReload=/bin/bash -c '/opt/fsepv<x>server64/bin/pgx_symstd reload /opt/fsepv<x>server64 /database/inst1'
Type=forking
User=fsepuser
Group=fsepuser

[Install]
WantedBy=multi-user.target

## Adapted
postgres@rhel9-latest:/home/postgres/ [fe18] sudo cat /etc/systemd/system/fe-postgres-1.service
# Copyright FUJITSU LIMITED 2025
[Unit]
Description=FUJITSU Enterprise Postgres PG1
Requires=network-online.target
After=network.target network-online.target

[Service]
Environment="PATH=/opt/fsepv18server64/bin/:$PATH"
ExecStart=/bin/bash -c '/opt/fsepv18server64/bin/pgx_symstd start /opt/fsepv18server64 /u02/pgdata/fe18/PG1/'
ExecStop=/bin/bash -c '/opt/fsepv18server64/bin/pgx_symstd stop /opt/fsepv18server64 /u02/pgdata/fe18/PG1/'
ExecReload=/bin/bash -c '/opt/fsepv18server64/bin/pgx_symstd reload /opt/fsepv18server64 /u02/pgdata/fe18/PG1/'
Type=forking
User=postgres
Group=postgres

[Install]
WantedBy=multi-user.target

“pgx_symstd” is a simple wrapper around pg_ctl, not sure about the reason for this. Enable and start:

postgres@rhel9-latest:/home/postgres/ [fe18] sudo systemctl enable fe-postgres-1
Created symlink /etc/systemd/system/multi-user.target.wants/fe-postgres-1.service → /etc/systemd/system/fe-postgres-1.service.
11:22:11 postgres@rhel9-latest:/home/postgres/ [fe18] sudo systemctl daemon-reload
11:22:13 postgres@rhel9-latest:/home/postgres/ [fe18] sudo systemctl start fe-postgres-1
11:22:20 postgres@rhel9-latest:/home/postgres/ [fe18] sudo systemctl status fe-postgres-1
● fe-postgres-1.service - FUJITSU Enterprise Postgres PG1
     Loaded: loaded (/etc/systemd/system/fe-postgres-1.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-01-26 11:22:16 CET; 8s ago
    Process: 33363 ExecStart=/bin/bash -c /opt/fsepv18server64/bin/pgx_symstd start /opt/fsepv18server64 /u02/pgdata/fe18/PG1/ (code=exited, status=0/SUCCESS)
   Main PID: 33366 (postgres)
      Tasks: 10 (limit: 7834)
     Memory: 31.3M (peak: 33.0M)
        CPU: 48ms
     CGroup: /system.slice/fe-postgres-1.service
             ├─33366 /opt/fsepv18server64/bin/postgres -D /u02/pgdata/fe18/PG1
             ├─33367 "postgres: io worker 0"
             ├─33368 "postgres: io worker 1"
             ├─33369 "postgres: io worker 2"
             ├─33370 "postgres: checkpointer "
             ├─33371 "postgres: background writer "
             ├─33373 "postgres: walwriter "
             ├─33374 "postgres: autovacuum launcher "
             ├─33375 "postgres: user profile status writer "
             └─33376 "postgres: logical replication launcher "

Jan 26 11:22:16 rhel9-latest bash[33366]: 2026-01-26 10:22:16.003 GMT [33366] WARNING:  The license will expire in 90 days.
Jan 26 11:22:16 rhel9-latest bash[33366]: 2026-01-26 11:22:16.014 CET [33366] LOG:  starting PostgreSQL 18.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4), 64-bit
Jan 26 11:22:16 rhel9-latest bash[33366]: 2026-01-26 11:22:16.015 CET [33366] LOG:  listening on IPv6 address "::1", port 27500
Jan 26 11:22:16 rhel9-latest bash[33366]: 2026-01-26 11:22:16.015 CET [33366] LOG:  listening on IPv4 address "127.0.0.1", port 27500
Jan 26 11:22:16 rhel9-latest bash[33366]: 2026-01-26 11:22:16.019 CET [33366] LOG:  listening on Unix socket "/tmp/.s.PGSQL.27500"

Notice the license warning in the output. Another thing to note is the “user profile status writer” process as this does not exist in community PostgreSQL. Looking at the version of PostgreSQL confirms that we’re on 18.0:

postgres@rhel9-latest:/home/postgres/ [fe18] psql
psql (18.0)
Type "help" for help.

postgres=$ select version();
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 18.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4), 64-bit
(1 row)

postgres=$

There is also a file provided by Fujitsu which details the version installed:

postgres@rhel9-latest:/home/postgres/ [fe18] cat /opt/fsepv18server64/etc/product.inf
PRODUCT="Fujitsu Enterprise Postgres Advanced Edition"
MAJOR=18
MINOR=0
MICRO=0
VERSION1="18"
VERSION2=1800
RELEASE=0
EDITION=AE
EXEMODE=64
TYPE=SERVER
AREA=COMMON
OSTYPE=Linux
PRODUCTTYPE=FSEP
SOFTWAREID=7A705C507E0E11EE8008303035303536
FJQSSNAME="FSEP1864"
PKG_MC=ON
FORMALNAME="Fujitsu Enterprise Postgres"

Finally, let’s import the new instance into WebAdmin:

Reducing

Importing works fine, but there are not a lot of parameters which can be changed in WebAdmin, maybe this is on purpose.

Final thoughts about the installation and initial setup of the instance:

  • Bundling several products makes sense, as you anyway need a tool for backup/restore and connection pooling. I am not judging the selection of the tools.
  • Providing a graphical user interface makes sense for users not very familiar with PostgreSQL but I guess more experienced users will not use it.
  • There is no Fujitsu branding (at least not in the binaries).
  • The installation process is easy and straight forward.
  • Not sure about the pgx_ wrappers, at least for the systemd integration this seems not to be necessary (there are several more of them we’ve not looked at right now).
  • Limiting the supported operating systems to Red Hat and SUSE excludes the complete Debian world. I guess this is because Fujitsu is targeting larger customers which are anyway on either Red Hat or SUSE.

In the next post we’ll look at how TDE looks like in Fujitsu Enterprise Postgres.