UniTime Installation

For simplified step by step installation notes, see

Table of Contents

Prerequisites

Java Development Kit

If you do not have Java SE (Standard Edition) Development Kit 11 or later already installed, you will need to download and install it from Java SE Downloads first.

Apache Tomcat

Download Apache Tomcat

Install Apache Tomcat

MySQL

Download MySQL from MySQL Downloads

Install MySQL

Install MySQL JDBC driver

Installation

Download the latest UniTime 4.8 distribution from UniTime Downloads

Unzip the archive

tar -xvzf unitime-4.8_bld100.tar.gz

Install timetable database

Deploy UniTime application

Start tomcat

Tip: If you have installed Tomcat on a Linux-based machine from a package (e.g., by running apt-get install tomcat9), you will need to make sure that there is a data folder available within the tomcat directory and that Tomcat has enough permissions to write files in there. This can be accomplished with something like:

mkdir /var/lib/tomcat9/data
chown tomcat9 /var/lib/tomcat9/data

Tip: If you are using Tomcat 9 on Ubuntu/Debian, you may need to create a file /etc/systemd/system/tomcat9.service.d/override.conf containing the following lines:

[Service] ReadWritePaths=/var/lib/tomcat9/data

Upgrade

Please note that UniTime 4.8 requires Java 11 or later. Java 8 is no longer supported. To upgrade an existing UniTime installation, only the new UniTime.war file should be placed in the Tomcat/webapps folder instead of the existing one. All the necessary changes to the database are done automatically during the first deployment. The safest way to do so is as follows:

  1. Stop tomcat
  2. Backup the existing database (e.g., using mysqldump on MySQL or exp on Oracle)
  3. In Tomcat/webapps, remove UniTime folder and replace the existing UniTime.war with the new one
  4. Delete the content of Tomcat/work folder.
  5. Start the tomcat

If you are using remove solver servers, the appropriate JARs need to be updated as well.

Some HQL reports may need to be updated due to the Hibernate upgrade, in particular:

Scheduling Subparts: Limit and Course Name are no longer pre-computed, in the reports

Instructional Offering: Limit and Demand are no longer pre-computed, in the reports

Some Scripts may need to be updated due to the Hibernate upgrade, e.g,

See UniTime 4.8 release notes for other changes.

Customization

Custom Properties

There are a lot of properties that are defined in file application.properties that is located in timetable.jar which is located in UniTime.war at WEB-INF/lib. These properties can be changed in one of the following ways:

  1. By providing a custom property file, this file should be named custom.properties and located in UniTime.war at WEB-INF/classes.
  2. Alternatively, the custom property file can be located somewhere else, with system property tmtbl.custom.properties pointing to it.
  3. By adding and/or changing the appropriate properties directly in the UniTime application – see Administration / Defaults / Configuration menu item when logged in as administrator.
  4. By adding these properties in Tomcat/conf/catalina.properties
  5. By providing JVM that is running tomcat with the appropriate system properties, for instance:
    export JAVA_OPTS="${JAVA_OPTS} -Dtmtbl.title=Timetabling Demo"
    export JAVA_OPTS="${JAVA_OPTS} -Dtmtbl.custom.properties=/etc/default/unitime.properties
    

Tip: Name the custom properties file Tomcat/conf/unitime.properties and put all the properties you need in there. For UniTime to use the file, add the following line to Tomcat/conf/catalina.properties

tmtbl.custom.properties=${catalina.base}/conf/unitime.properties

If the same property is defined on multiple places, the first one from the following order will be taken:

  1. UniTime Configuration (Administration / Defaults / Configuration menu item)
  2. System property (-Dproperty=value, or defined in Tomcat/conf/catalina.properties)
  3. File custom.properties (UniTime.war/WEB-INF/classes/custom.properties or as defined by tmtbl.custom.properties system property)
  4. File application.properties (UniTime.war/WEB-INF/lib/timetable.jar/application.properties)

Database Connection

The database connection can be changed using custom properties. However, please note that these properties cannot be defined using the UniTime application (Administration / Defaults / Configuration menu item) since the database connection needs to be configured before the database can be accessed. For instance, custom.properties file can contain the following:

# MySQL Configuration Example
connection.url=jdbc:mysql://localhost:3306/timetable?serverTimezone=Europe/Prague
connection.username=timetable
connection.password=unitime
connection.driver_class=com.mysql.jdbc.Driver
dialect=org.hibernate.dialect.MySQLDialect
tmtbl.uniqueid.generator=org.hibernate.id.TableHiLoGenerator
default_schema=timetable

Other

Remote Solver Server(s)

By default, all timetabling problems are solved within the application (using the same Java Virtual Machine), however, especially for bigger institutions, it might be desired to solve the timetabling problems by one or more separate solver servers.

All the necessary libraries are in the solver folder of the distribution except the JDBC driver. For MySQL 8.x download mysql-connector-java-8.0.33.jar,  or for Oracle download ojdbc8.jar. If a different version of the driver is downloaded, rename it to mysql-connector-java.jar or ojdbc8.jar.

Place the JDBC driver in the solver directory (same location as the timetable.jar), for instance:

curl https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar --output solver/mysql-connector-java.jar

To run a remote solver, do:

java -Xmx2g -Dtmtbl.custom.properties=custom.properties -jar solver/timetable.jar

File custom.properties should contain all the custom parameters needed for the starting up the server (e.g., database connection properties, if different from the defaults). It is usually the same as the one used on the Tomcat, except the jgroups.tcp.address property (see below). The load is automatically and seamlessly balanced between the remote solvers. The remote solver server also automatically reconnects itself when the web server is restarted. When the remote solver is shut down, all active timetabling instances are backed up and restored when the solver server is started again. The following properties need to be set in the custom.properties file. Please note that all these properties need to be set on the Tomcat side as well.

jgroups.tcp.address=127.0.0.1

IP address of the machine that is using this configuration file. This property should be different on each machine; the remaining properties are usually the same for all the UniTime instances (Tomcats as well as remote solver servers). If the property is set to 127.0.0.1 or localhost, the server will not be able to accept remote connections – use only if all the instances are running on the same machine!

unitime.solver.cluster=true

This property enables the Solver cluster. This cluster is used for RPCs between the Tomcat(s) and the remote solver server(s). Communication between UniTime instances is done using JGroups.

unitime.solver.port=7800

Default communication port for the Solver cluster. If the given port is taken (e.g., there are running multiple remote solver server(s) on the same machine), the next one available will be used instead.

unitime.solver.initial_hosts=127.0.0.1[7800]

By default, TCP ping discovery is used to form a cluster. The above parameter defines a comma-separated list of machines (and their communication ports) on which a UniTime instance may be running. It does not necessarily need to have all the possible IP addresses; usually, it is set to the IP addresses of the Tomcat server(s) running UniTime.

unitime.solver.jgroups.config=solver-jgroups-tcp.xml

An alternative JGroups configuration file can be provided with this property. The default configuration file is available here.

Having Multiple Tomcats (Clustering)

With UniTime 4.0, it is possible to run multiple instances of UniTime on a cluster of Tomcats and/or remote solver servers. Besides the Solver cluster and Enrollment cluster, it is also possible to form a Hibernate cluster that is used to replicate Hibernate L2 cache. The following properties can be used to configure the Hibernate cluster.

unitime.hibernate.cluster=true

This property enables the Hibernate cluster. This cluster is used for replication of Hibernate second level cache between multiple UniTime instances.

unitime.hibernate.port=7833

Default communication port for the Hibernate cluster. If the given port is taken (e.g., there are running multiple remote solver server(s) on the same machine), the next one available will be used instead.

unitime.hibernate.initial_hosts=127.0.0.1[7833]

By default, TCP ping discovery is used to form a cluster. The above parameter defines a comma-separated list of machines (and their communication ports) on which a UniTime instance may be running. It does not necessarily need to have all the possible IP addresses; usually, it is set to the IP addresses of the Tomcat server(s) running UniTime.

unitime.hibernate.jgroups.config=hibernate-jgroups-tcp.xml

An alternative JGroups configuration file can be provided with this property. The default configuration file is available here.

Please note that Hibernate cluster is only needed when there are two or more Tomcats running UniTime. Remote solver servers have the L2 cache disabled and hence no need to connect to the Hibernate cluster.

Using Oracle Database

Here are some notes about using Oracle Database

The following custom properties need to be set (connection URL, username, and password may vary)

# Oracle Configuration Example
connection.url=jdbc:oracle:thin:@localhost:1521:xe
connection.username=timetable
connection.password=unitime
connection.driver_class=oracle.jdbc.driver.OracleDriver
dialect=org.hibernate.dialect.OracleDialect
tmtbl.uniqueid.generator=org.hibernate.id.SequenceGenerator

If the schema is different from timetable, the default_schema property needs to be changed as well

default_schema=timetable

File ojdbc8.jar (or later) needs to be copied either to Tomcat/lib or to Tomcat/webapps/UniTime/WEB-INF/lib. This file can be downloaded, e.g., from Oracle JDBC Drivers

Oracle installation scripts are located in doc/oracle folder of the distribution

User timetable needs to be created first, e.g., using sqlplus

sqlplus system
create user timetable identified by ######; grant dba to timetable; exit

Using PostgreSQL

Here are some notes about using PostgreSQL, for more details, please see the Migrating to PostgreSQL document.

Install PostgreSQL 12.0 or later from https://www.postgresql.org/download (using the default port 5432, and a custom password)

Create timetable user and timetable database, using the same name and credentials as the default UniTime database:

createuser --interactive --pwprompt -U postgres
Enter name of role to add: timetable
Enter password for new role: unitime
Enter it again: unitime
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password: <password provided during install>
createdb timetable -U timetable -O timetable
Password: unitime

Populate the timetable database, using this timetable.sql file (Documentation/Database/PostgreSQL/timetable.sql in https://github.com/UniTime/unitime)

psql -U timetable <timetable.sql

Download JDBC Driver from https://jdbc.postgresql.org/download.html and place it to Tomcat/lib (e.g., postgresql-42.2.8.jar)

Change UniTime connection properties. The following custom properties need to be set (connection URL, username, password may vary)

# PostgreSQL Configuration Example
connection.url=jdbc:postgresql://localhost:5432/timetable
connection.driver_class=org.postgresql.Driver
dialect=org.hibernate.dialect.PostgreSQLDialect
connection.username=timetable
connection.password=unitime
default_schema=timetable
hibernate.dbcp.validationQuery=select 1
hibernate.globally_quoted_identifiers=true

Start UniTime, and check the logs for any errors.