Files
richard-churchman 5f6bbe45f7 A major refactoring of the software to make model IDs less volatile between Import, Export, and Peek (comparison) of the model configuration environment. As part of the extensive refactor, most tables have been updated to include a GUID field, which is consistent across Import, irrespective of the IDs remaining volatile. The consistent GUID allows for the separation of production (i.e., Case, Transaction, and Counter data), Redis cache data and quasi-production data(i.e, Lists, Suppressions, and Dictionaries) from the configuration environment. Significant rework of Controllers, Repositories and POCOs to support GUID as an access path rather than ID.
Major bug fixes relating to the Redis implementation in Reprocessing and Search Key Cache were identified and fixed as part of the rekeying development.

Included functionality to stop the Exhaustive training.  Fixed the Unsupervised learning functionality in Exhaustive Training.  Embedded the Mock Data CSV data into a class to make it compatible with Docker without needing to modify the Dockerfile (i.e, build).  Included a new table that stores training data to enhance support capabilities for Exhaustive.

Reintroduced and validated the Multitenancy functionality.

Postgres is now fully deprecated in place of Redis for cache, and all implementations of the Interfaces for Postgres have been removed.  No migrations exist to support this deprecation, and Postgres as a cache is now wholly unsupported.  Removed the Indexing background thread,  as Redis does not require it, given that it is a key-value pair database.

Created a RedisCommandFlag Environment Variable to support Fire and Forget write to Redis in Invocation.

Implemented functionality to Export, Peek and Download configuration environments using a secure, encrypted scheme.  Created a permission to access the functionality via the user interface.  Extensive database-based logging is included to provide for a comprehensive audit.  Created functionality to Import the encrypted Export file inside a database transaction to ensure consistency.

As Docker is now the primary deployment model, log4net instantiation has been moved to an approach that primarily uses programmatic instantiation of the ConsoleLogger and RollingFileAppender given Environment Variables. Implemented functionality to support remote \ mounted Log4Net XML Serialisation files for more advanced log4net configurations.

Reintroduced access to counters via the user interface and created a permission.

Took the opportunity to implement ReSharper linter suggestions.

Disabled the Lock button across the whole application, with that functionality being reserved for future use. It is intended that locking happens programmatically on the basis of dependencies in future commits.

Fixed several significant end-use bugs which became apparent during testing of the refactored code relating to case management and visualisations.  Fixed certain other minor bugs that came up during testing.

Brought documentation up to date for this commit.

Brought the Docker Compose file up to date for this commit.

Removed Redundant Environment Variables for this commit.

Made the README file less verbose and unnecessary.
2025-08-13 19:01:08 +03:00

5.0 KiB

layout, title, nav_order, parent
layout title nav_order parent
default Installing Jube To Virtual Machine 5 Getting Started

🚀Speed up implementation with hands-on, face-to-face training from the developer.

Installing Jube To Virtual Machine

Start by cloning the project from Github and changing to the executable directory:

git clone https://github.com/jube-home/aml-fraud-transaction-monitoring
cd aml-fraud-transaction-monitoring/Jube.App

Noting the credentials from the Managed Postgres Database:

username = doadmin
password = *******
host = db-postgresql-fra1-32549-do-user-12376516-0.b.db.ondigitalocean.com
port = 25060
database = defaultdb
sslmode = require

Arrange the credentials into a connection string format as follows to be passed as an Environment Variable:

export ConnectionString="Host=<host>;Port=<port>;Database=<defaultdb>;Username=<username>;Password=<password>;Pooling=true;Minimum Pool Size=0;Maximum Pool Size=100;SSL Mode=Require;Trust Server Certificate=true;"

Or rather:

export ConnectionString="Host=db-postgresql-fra1-52677-do-user-12376516-0.b.db.ondigitalocean.com;Port=25060;Database=defaultdb; Username=doadmin;Password=*******;Pooling=true;Minimum Pool Size=0;Maximum Pool Size=100;SSL Mode=Require;Trust Server Certificate=true;"

In the case of Redis:

username = default
password = ************************ show
host = db-redis-fra1-14927-do-user-12376516-0.c.db.ondigitalocean.com
port = 25061

Arrange the credentials into a connection string format as follows to be passed as an Environment Variable:

export RedisConnectionString="<Host>:<Port>,password=<Password>"

Or rather:

export RedisConnectionString="db-redis-fra1-14927-do-user-12376516-0.c.db.ondigitalocean.com:25061,password=************************"

Use Redis on DigitalOcean only if comfortable with the content as follows:

https://www.digitalocean.com/community/tutorials/how-to-connect-to-managed-redis-over-tls-with-stunnel-and-redis-cli

Otherwise do not use Redis in the context of this guide, falling back to PostgreSQL cache:

export Redis="False"
``

Execute the shell command to create the Environment Variable.

The User Interface and API endpoints need to passed the URL to bind to.  In this example, the public IP of the Droplet is 164.92.193.229 as observed in the Droplet page:

![Image](LocationOfPublicIP.png)

It is recommended that Jube always be behind a reverse proxy henceforth non standard ports are used,  in this case port 5001.  It follows that the Jube User Interface and API Endpoint will listen on https://164.92.193.229:5001/ which will be set in the ASPNETCORE_URLS Environment Variable:

```shell
export ASPNETCORE_URLS="https://143.198.224.41:5001/"

For security, there is no means to pass configuration values via anything other than Environment Variables, and the contents of those Environment Variables are never - ever - stored by Jube (which is something the CodeQL security scanner tests for).

There are sensitive cryptographic values that need to be included at startup. At a minimum the JWTKey value is required:

export JWTKey="IMPORTANT:_ChangeThisKey_~%pvif3KRo!3Mkm1oMC50TvAPi%{mUt<9sBm>DPjGZyfYYWssseVrNUqLQE}mz{L_UsingThisKeyIsDangerous"

The JWTKey value is used to encrypt access tokens providing for API authentication, and therefore user interface authentication.

While outside of the scope of this installation documentation, other sensitive variables, while optional, are strongly suggested:

export PasswordHashingKey="IMPORTANT:_ChangeThisKey_~%pvif3KRo!3Mkm1oMC50TvAPi%{mUt<9sBm>DPjGZyfYYWssseVrNUqLQE}mz{L_UsingThisKeyIsDangerous"

It is imperative that the keys be changed from their defaults and kept safe in appropriate storage. Jube will not start if the keys above are used.

Execute the shell command to create the Environment Variable.

For the purpose of illustration the dotnet run command will be used, however, for production it is extremely unlikely that this would be satisfactory, instead it is far more likely that a formal release will be built for a specific operating system. There is such an abundance of release techniques for .Net applications that it exists outside the scope of this documentation. The dotnet run command will build then run the application and it is perfectly adequate for comprehensive testing, proof of concept and smaller production implementations.

Build and run Jube:

dotnet run

It will take some time to run firstly as the project will be compiled after which the startup message will be written out to the console.

Waiting a few moments will ensure that the Kestrel web server is properly started and the routing configurations are in place. In a web browser navigate to the biding https://164.92.193.229:5001/ set in the ASPNETCORE_URLS Environment Variable.

The default user name \ password combination is Administrator \ Administrator, although the password will be need to be changed on first login.