Frequently Asked Questions and User Guide
Installation
Date
Aug 2024
Version
3.1

Welcome to the installation chapter of the user guide. BALTRAD software has been built and installed in several countries. If it works for us, it can work for you.

The golden rule when it comes to installation in BALTRAD is that instructions should always be provided in a text file called INSTALL. This is the ultimate installation reference, and it takes precidence over fancier documentation like this. It's also likelier that the INSTALL file will be updated quicker than this page. However, we will do our best to present the same information here in a more attractive way that gives a little more context than the terseness of the reference.

In the following, we assume that you are interested in installing a BALTRAD node, which is a complete system comprising the collection of various subsystems. If you want to install any of these individual subsystems alone, please consult that package's INSTALL file.

Preparation - what's going to happen

As of release 3.1 we have added automatic building of RPMs that can be used on both RedHat 8 and CentOS Stream 8 and above which is the recommended way to install the software, please refer to Installing pre-built rpms (CentOS Stream 8). We realise that some users are not able to use RedHat or CentOS Stream 8 and in those cases we also provide the old legacy node installer.

This means that there are two different ways to install the software and it's up to the user to decide what is the preferred way.

In both situations, it's essential that you have installed a 64-bit Linux and if using the node installer that the requirements in \req req_sw is installed.

Preparing a database

We use a Postgre SQL server. It doesn't have to be physically located on the same machine that you're using to install your BALTRAD node. Start by checking how secure your Postgre server is. Optionally you can raise its security level a bit by editing the /var/lib/pgsql/data/pg_hba.conf file. Towards the bottom, the entries should appear as here:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

If you did this, then you have to restart the server:

root# service postgresql restart

This was an optional step. Next, we create the database and database user for the node. As user postgres:

# su - postgres
$ psql
psql (version)
Type "help" for help.
postgres=# CREATE USER baltrad with PASSWORD 'baltrad';
postgres=# CREATE DATABASE baltrad with OWNER baltrad;

You can choose other names for your database and user, and you should probably use another password, but please keep track of them; for the purposes of this documentation, we'll continue using these ones. If your database is on another machine, then keep track of that machine's IP number!

Installing pre-built rpms (CentOS Stream 8)

All pre-built rpms can be found here: http://rpm.baltrad.eu/CentOS/8/latest/ and you can also find the yum repository file here.

The recommended way to install the baltrad node is to setup the server to use the baltrad node yum repository. To do that you will have to login as root and do a number of steps. After that the installation and updates will hopefully be quite painless.

First, you will have to fetch the repo-file to setup the Baltrad-repository and update the repositories

%> cd /etc/yum.repos.d
%> wget http://rpm.baltrad.eu/CentOS/8/latest/baltrad-package-latest.repo
%> dnf update

Next is to install the dependencies. Most of them should be handled automatically by the rpms but there are some things that will not work out of the box. You will need to install the epel-release as well as enabling powertools.

%> dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
%> dnf config-manager --set-enabled powertools

Now, it is time to install the baltrad software. There are 3 main packages. Rave, baltrad-db and baltrad-node-*. These will install servers and product generators. Then there are plugins that will hook into the rave pgf. For example bropo, beamb and so on. Typically, the following command should install everything.

%> dnf install rave* baltrad* bropo* beamb*

After the installation of the BALTRAD rpms it is time to configure the system. The configuration is performed by using a tool "baltrad-config" which also has been installed, please refer to RPM Configuration.

Updating pre-built rpms

Usually, if the baltrad node repo file has been added to the yum.repos.d folder, the baltrad node will automatically be notified when new updates are available. In some situations it might be necessary to first invoke

%> yum clean all

and then

%> yum update `yum list installed | grep baltrad-repo | awk '{print $1;}'`

Node installer

The node installer can be used if you have decided to use a different operating system than CentOS Stream/RedHat or for some other reason want to control the installation process.

This software installation process will make heavy use of Python to fetch software and install it. The first thing that will be done is that the installer will determine if you have a Python installation that can be used for its purposes. If it can't find one, then it will bootstrap a Python for you and continue using it. As long as you specify where all the software should be installed, preferably not in a place where it will conflict with existing things, then all will be fine. The default location is /opt/baltrad.

NOTICE!!

BALTRAD uses some packages that has no active maintenance any longer which means that you might end up with some problems during the build process. The node-installer uses Python 3.6 which reachead EOL in December 2021 and is not updated any longer. This in turn might cause problems during the install process and we are looking into how this best should be handled. At the moment we can't upgrade to Python >= 3.8 since we have dependencies towards keyczar and pycrypto which are not compatible.

Another of the problems that has been experienced is if the gcc-version used is >= 9 there will be problems building Python3 or odd linking problems. This can in most cases be handled by changing the compiler used. On Ubuntu 21.10 you can switch gcc-version quite easy

%> sudo apt install gcc-8 g++-8
%> update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8

and then change version by

%> update-alternatives --config gcc

Repository and downloading the node-installer

We run a Git repository internally in the partnership, so it makes sense to use the same service for public releases.

The package that installs the complete BALTRAD node is called the node-installer, and it can be downloaded from the BALTRAD Git repository at https://github.com/baltrad, which is the repository's web interface. You can download a snapshot from the node-installer.git project, in which case you'll download a tarball (.tar.gz file).

You can also grab the latest release from the command line if you have (or download and install) a Git client. In this case, do the following:

$ git clone https://github.com/baltrad/node-installer.git

Doing this will download the node installer in a directory named ./node-installer. You can immediately change to this directory and read the INSTALL file. Don't try to install anything before you have prepared a database, as is described next.

Installing the software

Installation is a one-liner! The command to use is setup.

setup comes with a lot of arguments and options. To list them all, run

$ ./setup --help

This may appear to be a bit of a jungle at first sight, but setup is a systematic, comprehensive, and powerful tool. Let's make sense out of this. A basic installation that will give you a node for exchanging data can be installed with the following command, assuming the node is located at SMHI on a CentOS machine and the passwords have been kept secret:

$ ./setup --tomcatpwd=<> --nodename=se.smhi.balthazar --prefix=/opt/baltrad \
--jdkhome=/usr/java/jdk1.6.0_16 \
--with-psql=/usr/include/pgsql,/usr/lib64/pgsql --dbpwd=<> install

The tomcat password should be set using the –tomcatpwd argument; this will make the tomcat server much more secure. The node name given using the –nodename argument should use a systematic naming convention; we recommend one inspired by Java which is like reverse Internet domain addresses. The other arguments point out the root directory under which all software is to be installed (–prefix), the location of you JDK SDK, where your Postgre installation's headers and libraries are, and your database's password.

Save your use of setup to file. You can even use it as as simple script.

The first time you install the system is going to take some time because there's a lot of software to be built, so just sit back and enjoy the show! When installation is finished and successful, you should see something like this:

===== SUCCESS ======
System has sucessfully been installed and started
You should be able to access the system by navigating a browser to:
http://localhost:8080/BaltradDex


Your BDB sources might not be up-to-date. You can import them from
Rave's radar-db with the following command:

/opt/baltrad/baltrad-db/bin/baltrad-bdb-client \
  import_sources \
  --url=http://localhost:8090 \
  --dry-run \
  /opt/baltrad/rave/config/odim_source.xml

You can omit some changes by adding '--ignore=src' to the command.
Once you are satisified with what the importer will do, omit the
'--dry-run' switch and let it work on the actual database.

Don't mind the part about the BDB for now. We'll get to that in Configuration. Use your web browser with the URI given above. If you see something like this, then you've succeeded!

A slightly more complex installation involves installing the BALTRAD toolbox with several packages containing tools:

$ ./setup --tomcatpwd=<> --nodename=se.smhi.balthazar --prefix=/opt/baltrad \
--jdkhome=/usr/java/jdk1.6.0_16 \
--with-psql=/usr/include/pgsql,/usr/lib64/pgsql --dbpwd=<> \
--with-rave --rave-dex-spoe=localhost:8080 --rave-center-id=82 \
--with-rave-gmap --with-bropo --with-beamb --with-bufr install

Note that we have explicitly specified the BALTRAD node's single point of entry so that RAVE will know where to inject files. This is done with the –rave-dex-spoe argument. We've also set the WMO code for the originating centre using the –rave-center-id argument. It is important that you use your country's center ID number if you're running BALTRAD at a national meteorological service!

If, for some reason, you need to re-install one or more packages, use the –rebuild option and list them before re-running setup. To avoid reinstalling database tables, use the –excludedb argument. To explicitely reinstall them, use the –reinstalldb argument. This will wipe out whatever configuration you had previously. This is more relevant when you are Upgrading to a new node version (see below).

There are lots more arguments and options, for example for specifying the location of the database server, the ports used by the tomcat server and BDB. Please see the setup reference for a systematic tabulation of them all.

Installing behind a firewall

This is a short section. setup comes with a couple of commands that you can use to download, but not install, all the packages on to a machine that's exposed to the Internet. That gives you the ability to transfer everything to the protected machine and continue the installation there. There are two options:

  • -fetch will fetch all packages
  • -dist will create a distribution tarball that you can move wherever you want.

Upgrading to a new node version

The easiest way to upgrade to a new version is to use your Git client to synchronize with the repository at git.baltrad.eu. Just enter the node-installer directory on your machine and

$ git pull

That'll do it. Following this synchronization, just run setup again, like you did the first time. If the release notes don't mention any changes to the database tables, you can safely add the –excludedb option to avoid messing with them.

$ ./setup --tomcatpwd=<> --nodename=se.smhi.balthazar --prefix=/opt/baltrad \
--jdkhome=java-8-openjdk-amd64 \
--with-psql=/usr/include/pgsql,/usr/lib64/pgsql --dbpwd=<> --excludedb \
--with-rave --rave-dex-spoe=localhost:8080 --rave-center-id=82 \
--with-rave-gmap --with-bropo --with-beamb --with-bufr install

You should get the same ===== SUCCESS ====== message again with each upgrade.

setup reference

Note: this information may be updated in your setup before it is updated here.

NODE INSTALLER
Usage: setup <options> command, use --help for information

This is the main installation script for installing a baltrad node.
Most of the installation is handled without any interaction. However
if you don't want to specify --tomcatpwd on command line you will
get a question about it. 

The script will remember several configuration parameters between
runs but some of them will not be stored, like passwords and
similar items. If you want to use the previous parameters, then
you can specify --recall-last-args

Command:
Valid commands are:
 - install
     Installs the software
     
 - check
     Checks that the provided dependencies are correct

 - clean
     Cleans up everything

 - fetch
     Fetch all packages so that it is possible to run an installation
     in 'offline' mode. It will atempt to clean up any unessecary 
     content but it is suggested to execute clean prior fetch.
 
 - dist
     Create distribution tarball
     
Options:
--help
    Shows this text

--recall-last-args
    If you want to use the previous arguments, then you can use
    this option. It will try to restore the configuration parameters
    used in the last run. 

--nodename=<name>
    This attribute should really be specified but there is a default value which
    is the hostname as shown by the command 'hostname'. The node name is a 
    unique identifier that is used for identifying you within the exchange
    network. The node name should usually explain exactly who you are. A good
    example is to use the Java package naming. For example se.myorg or 
    se.myorg.test or similar. This node name will also defining what this 
    installations key will be named.

--prefix=<prefix>
    Points out where the system should be installed. 
    [Default /opt/baltrad]
    
--tprefix=<prefix>
    Points out where the third-party software should be installed.
    [Default <prefix>/third_party]
    
--jdkhome=<jdkhome>
    Points out the jdkhome directory. If omitted, the installer will
    try to find a valid jdk.

--keystore=<path>
    Point out the keystore directory to use when configuring setting up the
    different modules for certification. If not specified, one will be
    created for you in <prefix>/etc/bltnode-keystore.

--with-zlib=yes|no|<zlibroot>|<zlibinc>,<zliblib>
    Specifies if zlib should be built by the installer or not. 
    [Default yes]
    - 'yes' means that the installer should install the provided zlib
    - 'no' means that the installer should atempt to locate a valid
      zlib installation
    - zlibroot specifies a zlib installation where includes can be 
      found in <zlibroot>/include and libraries can be found in 
      <zlibroot>/lib
    - <zlibinc>,<zliblib> can be used to point out the specific 
      include and library paths

--with-psql=<psqlroot>|<psqlinc>,<psqllib>
    Specifies where to locate the postgresql include and library files.
    If omitted the install script assumes that they can be found in 
    the standard locations.
    - psqlroot specifies a postgres installation where includes can be 
      found in <psqlroot>/include and libraries can be found in <psqlroot>/lib
    - <psqlinc>,<psqllib> can be used to point out the specific 
      include and library paths

--with-freetype=<freetypeinc>,<freetypelib>
    In order to get freetype support built in the Python Imaging Library (PIL,
    for use with Google maps plugin). You might have to specify this
    library. <freetypeinc> is the path to the freetype include directory
    as shown when executing freetype-config --cflags excluding the -I of course.
    <freetypelib> is the path where libfreetype.so can be found.

--dbuser=<user>
    Specifies the database user to use. 
    [Default baltrad]

--dbpwd=<pwd>
    Specifies the database user password to use. 
    [Default baltrad]
    
--dbname=<name>
    Specified the database name to use. 
    [Default baltrad]

--dbhost=<host>
    Specified the database host to use. 
    [Default 127.0.0.1]

--with-hdfjava=<hdf java root>
    Specifies the HDF Java root installation directory. 
    If omitted, the installer will install it's own version of hdf-java.
    
--reinstalldb
    Reinstalls the database tables. Use with care.

--excludedb
    Ignores installation of the database tables. Might be since they
    already has been installed. This will cause the DBINSTALL package
    to be set as installed.
    
--runas=<user>
    Specifies the runas user for Tomcat and other processes. It is not 
    allowed to use a runas user that is root due to security issues. 
    [Defaults to user that is installing]

--datadir=<dir>
    The directory where all the data storage files should be placed for 
    BALTRAD-db.
    [Default <prefix>/bdb_storage]

--urlrepo=<url>
    The URL from where the dependency packages can be fetched.
    [Default http://git.baltrad.eu/blt_dependencies]
    
--gitrepo=<url>
    The URL from which the BALTRAD node Git packages can be fetched.
    For example --gitrepo=http://git.baltrad.eu
    [Default git://git.baltrad.eu]

--with-rave
    Install the RAVE PGF

--rave-pgf-port=<port>
    Set the port RAVE should run on.
    [default: 8085]

--rave-log-port=<port>
    Set the port the RAVE logger should run on.
    [default: 8089]

--with-bufr
    Install OPERA BUFR software. This will affect RAVE such that readling of
    polar data in BUFR will be supported.

--rave-center-id=<id>
    WMO originating center ID to be used by RAVE as the source of its products.
    Reference: WMO No. 306.
    [default: 82]

--rave-dex-spoe=<spoe>
    DEX's single point of entry to be used by RAVE. 
    [default: localhost:8080]
    
--with-rave-gmap
    Install the RAVE Google map plugin. Will also cause RAVE PGF to be 
    installed.

--with-bropo
    Install bRopo anomaly detectors. Will also cause RAVE to be installed.

--with-beamb
    Install beam blockage detector package. Will also cause RAVE to be 
    installed.

--with-bwrwp
    Installs the BALTRAD weather radar wind profile generator. Will also cause 
    RAVE to be installed. This is a very special product generator that 
    requires a Fortran compiler to built its dependencies, e.g. gfortran.
    This product requires that the following options also are specified: 
    --with-blas=, --with-cblas=, --with-lapack= and --with-lapacke=. 
    See below on how to use these options.
 
--with-blas=<libblas.a directory>
    Specifies the directory where the libblas.a library resides. Currently only 
    used when installing bwrwp.
    NOTE that the library objects must have been compiled with -fPIC or similar 
    for shared object capabilities since it will be linked into a shared 
    library.

--with-cblas=<root> or <cblas.h incdir>,<libcblas.a dir>
    Specifies where the cblas.h include directory and the libcblas.a directory 
    resides. You can also specify CBLAS root directory that should contain the 
    include and lib directory. Currently only used when installing bwrwp.
    NOTE that the library objects must have been compiled with -fPIC or similar 
    for shared object capabilities since it will be linked into a shared 
    library.

--with-lapack=<liblapack.a directory>
    Specifies the directory where the liblapack.a library resides. Currently 
    only used when installing bwrwp. NOTE that the library objects must have 
    been compiled with -fPIC or similar for shared object capabilities since it 
    will be linked into a shared library.

--with-lapacke=<lapacke.h incdir>,<liblapacke.a dir>
    Specifies where the cblas.h include directory and the libcblas.a directory 
    resides. Currently only used when installing bwrwp.
    NOTE that the library objects must have been compiled with -fPIC or similar 
    for shared object capabilities since it will be linked into a shared 
    library.

--bdb-port=8090
    BDB server port

--bdb-uri=<uri>
    The BDB URI, as default this has no use even when specified. It will only 
    be used if subsystems have been specified so that you can specify a 
    different BDB server. Also, if this is specified, bdb-port will not have 
    any meaning.
    E.g. --bdb-uri=http://somehost:8090
    [Default: Not used]

--bdb-pool-max-size=<N>
    Set the pool size for BDB connections to <N>
    [default: 10]

--bdb-auth=<authtype>
    BDB authentication model. Valid values are:
      * 'noauth' - perform no authentication
      * 'keyczar' - authenticate using Keyczar, reusing host keys
    [default: keyczar]

--bdb-storage=<storagetype>
    BDB storage model. Valid values are:
      * db - store files in the database with a cache in 
      * fs - store files in 
    [default: db]

--rebuild=<module1>,<module2>,...
    Will force a rebuild and installation of the specified modules. To get a 
    list of available modules and their versions. See option --print-modules.
    E.g. --rebuild=TOMCAT,RAVE
    
--print-modules
    Prints all available modules and their respective version.
    
--print-config
    Prints the build configuration
    
--exclude-tomcat
    Will exclude installation of Tomcat. This is not a recommended procedure 
    but it is here for the possibility to use your own Tomcat installation if 
    necessary.

--tomcatport=<port>
    Specifies the port on which the Tomcat installation should listen.
    Don't use together with --tomcaturl. 
    [Default 8080]

--keystoredn=<dn>
    The distinguished name used in the keystore cert for the secure 
    communication. If <dn> is yes, then a number of questions will be asked 
    during the creation of the keystore. If <dn> is no, then a predefined DN 
    will be created with the format
      "CN=Unknown,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown"
    Or you can specify your own DN, just keep the above format. Note, that you 
    cannot specify a DN with any spaces in it. If you have that format you will 
    have to use 'yes' instead to get the questions.
    [Default yes]
    
--keystorepwd=<pwd>
    Specifies the password that should be used for the key. If this has not been
    defined, the tomcatpwd will be used.

--tomcatsecureport=<port>
    Specifies the port on which the Tomcat installation should listen on for 
    secure messages.
    [Default 8443]

--tomcaturl=<url>
    Specifies the URL where the Tomcat installation resides. Don't use together 
    with --tomcatport. 
    [Default http://localhost:8080]
    
--tomcatpwd=<pwd>
    Specifies the password that should be used for the manager in the tomcat
    installation.

--tomcatfwdports=<httpport>,<httpsport>
    Specifies that port forwarding has to be supported by the node and hence a secondary mapping
    is added to the dex applicationContext. This attribute is typically used when having the tomcat
    server behind a firewall and proxying calls through a webserver like apache.
    
--force
    Unused at the moment
    
--experimental
    When running into problems with building, like missing libraries, link 
    problems or other miscellaneous problems, this might be the option to 
    specify to get through the build. Some modules are currently being 
    evaluated for stability in a production environment, and by specifying this 
    option, these modules will be built instead.
    
--subsystems=(STANDALONE_RAVE, RAVE ,BDB ,DEX)
    If you are interested in running a standalone installation of RAVE, BDB or 
    DEX, it is possible to do so by specifying which subsystems that should be 
    installed. Since RAVE depends on the BALTRAD-DB Python client API, you are 
    able to specify a specific RAVE module called STANDALONE_RAVE which installs
    RAVE without any BDB-dependencies.