Globalyzer Server Docker Installation
Globalyzer Server Docker Based Installation
The following instructions cover the installation of a Globalyzer Server instance on an internally controlled virtual machine running a Docker instance in which the Globalyzer Server is installed.
In the event that a forward proxy is leveraged within the network for all external traffic, note the inclusion of "REQUIRED FOR FORWARD PROXY ONLY" indicated sections for specific instructions for handling that part of the configuration.
Deployment Architecture
- Two containers on a single VM:
- Globalyzer Server: Tomcat 9 running the Globalyzer Server WAR application
- MySQL 8.0: Database with persistent storage (named container: "gzserverDatabase")
Containers communicate via Docker network "mysqlnetsgzserver". Both containers auto-restart unless explicitly stopped.
System Requirements
VM Specifications
- CPU: 2+ cores recommended
- RAM: 4GB minimum (Java heap: 256m initial, 1600m max)
- Disk: 100GB or more depending upon DB size
- OS: Linux with Docker support
Ports
- 8080: HTTP access to Globalyzer Server (configurable)
- 3306: MySQL (container-internal only, not exposed)
REQUIRED FOR FORWARD PROXY ONLY
Proxy outbound connections pass through ports
- 3128: http outbound
- 3128` https outbound
This configuration assumes that all outbound http/https connections made on the VM will be routed through a forward proxy similar to Squid.
Prerequisites
- Docker installed and running
- Git LFS installed - Used for syncing the installation files from GitHub if that method is selected below.
- Available in RHEL9 using DNF
- Sudo privileges on the Deployment VM
- Docker Hub credentials for "lingoportcustomer" organization
- SMTP credentials (username, password) for email notifications
REQUIRED FOR FORWARD PROXY ONLY
- Forward proxy installed and functional
- Confirm using curl command similar to:
curl -x http://<PROXY_URL>:<PROXY_PORT> https://www.google.com
Installation of Docker
In order to run dnf as noted below, the dnf configuration file must be set to use the proxy for all outbound communications. To do so edit the "/etc/dnf/dnf.conf" configuration file and add the proxy details there. If authentication is required to access the proxy, this would also be performed here. Below is an example with the proxy added to the last line of the configuration.
[main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=True best=False skip_if_unavailable=True proxy=http://proxy.mycorp.local:8080 # REQUIRED FOR FORWARD PROXY ONLY
If Docker Engine is not already installed on the host, use the Docker CE repository for RHEL.
# Optional: remove older Docker-related packages first sudo dnf remove \ docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ podman \ runc # Add the Docker CE repository sudo dnf -y install dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo # Install Docker Engine and common plugins sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Start Docker now and on boot sudo systemctl enable --now docker
REQUIRED FOR FORWARD PROXY ONLY
At this point, we need to allow Docker itself to communicate through the proxy. Since dockerd runs a a systemd service, it will not inherit shell proxy variables, so we need to add this to the service itself.
# Create this directory if it does not already exist sudo mkdir -p /etc/systemd/system/docker.service.d # Create a /etc/systemd/system/docker.service.d/http-proxy.conf file # in the directory with these contents customized for the installation instance # Adjust these values to match your organizations requirements. [Service] Environment="HTTP_PROXY=http://proxy.example.com:8080" Environment="HTTPS_PROXY=http://proxy.example.com:8080" Environment="NO_PROXY=localhost,127.0.0.1,.example.local"
The docker service needs to be aware of these changes and restarted
sudo systemctl daemon-reload sudo systemctl restart docker
Validate the configuration was read into docker
systemctl show --property=Environment docker # There should be something like this presented: Environment=HTTP_PROXY=...
Confirm Docker installations are possible using hello-world
# Verify Docker works sudo docker run hello-world
REQUIRED FOR FORWARD PROXY ONLY
Edit the file /root/.docker/config.json file and add the below. This will inject proxy related variables into the container for applications that will support them.
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "***********************"
}
},
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:3128",
"httpsProxy": "http://proxy.example.com.io:3128",
"noProxy": "localhost,127.0.0.1"
}
}
}
To validate the effect of this addition, run the following command with the running container ID. There will now be both upper and lower case formats of the proxy information shown in the environment.
[root@ip-172-31-51-200 ~]# sudo docker exec 8d7b2dffc1ae env PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=8d7b2dffc1ae https_proxy=http://proxy.example.com:3128 NO_PROXY=localhost,127.0.0.1 no_proxy=localhost,127.0.0.1 HTTP_PROXY=http://proxy.example.com:3128 http_proxy=http://proxy.example.com:3128 HTTPS_PROXY=http://proxy.example.com:3128 JAVA_HOME=/opt/java/openjdk LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 JAVA_VERSION=jdk-11.0.29+7 CATALINA_HOME=/usr/local/tomcat TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib TOMCAT_MAJOR=9 TOMCAT_VERSION=9.0.113 TOMCAT_SHA512=************************************************ COMMAND_CENTER_CONFIG=/usr/local/tomcat/CommandCenterConfig.groovy HOME=/usr/local/tomcat
Zip and Git LFS Installation
sudo dnf -y install zip sudo dnf -y install git sudo dnf -y install git-lfs sudo git lfs install
Globalyzer Server Installation Files
REQUIRED FOR FORWARD PROXY ONLY
Git does not respect the forward proxy settings at the container level so this must be performed to tell it to leverage the proxy. Note this must be done for the user that will be running the git command. It only impacts that user.
git config --global http.proxy http://proxy.company.com:8080
For both forward proxy and non forward proxy. At the time of this writing, only the second option is currently available. Please contact support@lingoport.com if there is a desire to install Globalyzer Server within a local network so that we can supply you with the required files.
There are two options. First is to Clone the repo to obtain the Globalyzer Server files like this:
- Clone repository
git clone <repository-url> cd globalyzer-server-docker
- Second option is to unzip the globalyzer zip file in the home directory of the user that the Docker files exist in.
unzip globalyzer-server-docker-client-20260708_150715.zip cd globalyzer-server-docker-client-20260708_150715 # Verify LFS files downloaded (artifacts should be large binaries, not pointer files) ls -lh gzserver-enterprise.war server-subcomponents/ # Configure installation Edit `install.conf` before installation: vim install.conf
The install.conf Configuration
Here is the install.conf example. Update it as appropriate. Use password generator for passwords to ensure randomness.
# Installation location. This is an example. Generally can be the # home directory of the user with sudo rights. home_directory=/home/centos # Docker image tag suffix / version gzserver_image_version=gzserver-6.8 # Server settings serverPort=8080 gzserver_url=gzserver.example.com # Public hostname only; do not include http://, https://, port, or /gzserver # MySQL database_root_password=<strong-password> # Create using a password generator if possible # Application database user database_app_user=lingoport # (another unique password similar to one used for root) database_app_password=<app-password> # SMTP (for email notifications) This assumes you are using mailgun # for an SMTP server. If not there will be an additional edit # required post configuration. email_username=<smtp-username> email_password=<smtp-password> # Docker Hub (for pulling lingoport/gzserver image) docker_username=lingoportcustomer docker_account_token=<your-token> # Image repository docker_image=lingoport/gzserver_customer
Installation Execution
# Run installation sudo ./InstallGzserver.sh
Installation takes ~8 minutes.
Additional Notes regarding some fields in the install.conf file
- docker_image contract:
- docker_image may be either a repository name or a fully tagged image reference.
- The recommended default is the repository only: lingoport/gzserver_customer.
- If docker_image already includes a tag, the install and update scripts will use it as-is.
- If docker_image does not include a tag, the scripts append :<gzserver_image_version>.
- gzserver_image_version contract:
- gzserver_image_version is the exact Docker tag suffix used with docker_image when docker_image is untagged.
- For the current customer registry tags, use values such as gzserver-6.8.
- This means the default image reference resolves to lingoport/gzserver_customer:gzserver-6.8.
- gzserver_url contract:
- Set gzserver_url to the public DNS hostname only, for example gzserver.example.com.
- Do not include http:// or https://`.
- Do not include a port such as :8080.
- Do not include the application path /gzserver.
- The app expands this into https://<gzserver_url>/gzserver for generated absolute links.
- Host/network expectation:
- Before a reverse proxy is set up, the app is reachable locally on the VM over plain HTTP at http://localhost:<serverPort>/gzserver.
- For normal user access, put a reverse proxy or load balancer in front of the app, terminate TLS there, and forward traffic to serverPort on the VM.
- Point public DNS for gzserver_url at that reverse proxy or host.
Once the installation is finished and the server is running, run the final FinishInstallAfterStartupFinished.sh script.
sudo ./FinishInstallAfterStartupFinished.sh
- What it does:
- Main Script
- Creates directories: $home_directory/lingoport/, $home_directory/gzserver/config/, $home_directory/gzserver/backup/, $home_directory/gzserver/mysql/conf.d/
- Creates Docker network: mysqlnetsgzserver
- Starts MySQL container (gzserverDatabase) with UTF-8 configuration
- Waits for MySQL to be ready (up to 60 seconds with health checks)
- Starts Globalyzer Server container
- Injects your config values into GzserverConfig.groovy
- Restarts Globalyzer Server to apply configuration
- Final database tweaks (Finish Install Script)
Important MySQL persistence note
The host directory $home_directory/gzserver/mysql/data is persistent. If it already contains MySQL data from a previous install attempt, MySQL will keep using the original root password from when that directory was first initialized. Changing database_root_password in install.conf does not reset an already-initialized MySQL data directory.
Container IDs saved to:
- $home_directory/gzserver/config/gz_container_id.txt - Globalyzer Server
- $home_directory/gzserver/config/gz_mysql_id.txt - MySQL
Copy Globalyzer License Into Container
Obtain the container ID for the container that is currently running Globalyzer Server. Run the below command and copy the ID of the container running Globalyzer Server, it will be used in the next step.
sudo docker ps
Take the license supplied by Lingoport and place it on the VM in your users home directory. Next we copy this license in to the /tmp directory in the container as a temporary storage location
sudo docker cp <PATH_TO_LICENSE_ON_VM> <CONTAINER_ID>:/tmp/
Create command line alias for login to container
The below allows you to type gotogzroot at the terminal and you will land in the container as root user.
# Edit the .bashrc in the VM and add this at the bottom of the file
alias gotogzroot="sudo docker exec -it -u root `sudo docker ps | grep lingoport/gzserver | awk '{print $1}' ` bash"
# Save the file and source it to load it in
source ~/.bashrc
Log into the container
Log into the container using the new alias create
gotogzroot
Update SMTP Server in Container if Needed
# When not using mailgun as an SMTP server, log into the container as root and edit the entry for host or SMTP mail will not connect # /usr/local/tomcat/GzserverConfig.groovy host = "smtp.mailgun.com" << == Update this!! port = 465 username = "user@example.com" password = "********"
Install New License In Application within Container
Make a backup of the Globalyzer.license if one already exists and copy over the new license to the proper location
cd /usr/local/tomcat
cp Globalyzer.license Globalyzer.license_bak
cp /tmp/Globalyzer.license ./Globalyzer.license
Verification
After installation completes:
# Restart the Globalyzer Server Container so the license takes effect sudo docker container <CONTAINER_ID> stop sudo docker container <CONTAINER_ID> start # Should see both containers with status "Up" # lingoport/gzserver_customer:gzserver-6.8 on port 8080 # mysql:8.0 with name "gzserverDatabase" # Check Globalyzer Server logs CONTAINER_ID=$(cat $home_directory/gzserver/config/gz_container_id.txt) sudo docker logs $CONTAINER_ID | tail -20 # Look for: "Server startup in [X] milliseconds"
Access the application
http://<vm-ip>:<serverPort>/gzserver
(Replace <serverPort> with value from "install.conf", default is 8080)
Quick host-side curl test before reverse proxy/TLS setup:
curl -i http://localhost:<serverPort>/gzserver/login # Or just return the HTTP status code curl -s -o /dev/null -w '%{http_code}\n' http://localhost:<serverPort>/gzserver/login
Use plain HTTP for this local test. Do not use "https://" until TLS termination is configured in front of the app.
Login
For a fresh install, the bundled default local administrator credentials are:
Username: admin@lingoport.com Password: <reach out to support@lingoport.com for password>
Change this password immediately after first login.
If you are connecting to an existing deployment, use that deployments current Globalyzer administrator credentials instead.
Common Operations
Backup Database
Using the backup script:
sudo ./BackupGzserverDatabase.sh
This creates a timestamped backup file in `$home_directory/gzserver/backup/GZSERVER_backup_YYYYMMDD_HHMM.sql`.
Restore Database
Using the restore script:
sudo ./RestoreGzserverDatabase.sh YYYYMMDD_HHM
Example: sudo ./RestoreGzserverDatabase.sh 20251010_1430
The script will:
- Locate the backup file for the specified date
- Restore the database
- Update the container ID file if needed
View Logs
CONTAINER_ID=$(cat $home_directory/gzserver/config/gz_container_id.txt) sudo docker logs -f $CONTAINER_ID
Restart Server
CONTAINER_ID=$(cat $home_directory/gzserver/config/gz_container_id.txt) sudo docker restart $CONTAINER_ID
Access Database
# Using container name sudo docker exec -it gzserverDatabase mysql -u root -p # Or using container ID MYSQL_ID=$(cat $home_directory/gzserver/config/gz_mysql_id.txt) sudo docker exec -it $MYSQL_ID mysql -u root -p
Upgrading Globalyzer Server
Automated Update Using the update script:
# Edit install.conf to specify new version vim install.conf # Update gzserver_image_version # Run the update script sudo ./UpdateGzserver.sh
The update script performs:
- Validates configuration (prompts for missing values)
- Stops the current Globalyzer Server container (but does not remove it)
- Creates automatic database backup to $home_directory/gzserver/backup/
- Pulls new Docker image from Docker Hub
- Starts new container with updated version
- Applies configuration from install.conf
- Restarts container to apply changes
Note: The MySQL container and data remain untouched during updates. Only the Globalyzer Server container is replaced.
Update the Globalyzer License
Since the Globalyer.license resides in the container, it will need to be updated following the same procedure that was used during an installation. Obtain the container ID for the container that is currently running Globalyzer Server. Run the below command and copy the ID of the container running Globalyzer Server, it will be used in the next step.
sudo docker ps
Take the license supplied by Lingoport and place it on the VM in your users home directory. Next we copy this license in to the /tmp directory in the container as a temporary storage location
sudo docker cp <PATH_TO_LICENSE_ON_VM> <CONTAINER_ID>:/tmp/
Install New License In Application within Container
Make a backup of the Globalyzer.license if one already exists and copy over the new license to the proper location
cd /usr/local/tomcat
cp Globalyzer.license Globalyzer.license_bak
cp /tmp/Globalyzer.license ./Globalyzer.license
Rollback Procedure
Note that roll backs, especially to a previous version, will entail some risk. In general leveraging backups at the VM itself will provide a more reliable method.
To rollback to a previous version
- Edit install.conf to specify previous version
vim install.conf # Change gzserver_image_version to previous version
- Run the update script (it works for rollback too)
sudo ./UpdateGzserver.sh
- If needed, restore database backup
sudo ./RestoreGzserverDatabase.sh YYYYMMDD_HHMM
Uninstalling
Using the uninstall script:
sudo ./UninstallGzserver.sh
- What it does:
- Stops and removes the Globalyzer Server container
- Stops and removes the MySQL container
- Leaves backup files and configuration in place
Note: This does NOT remove:
- Docker images
- Docker network
- Backup files in $home_directory/gzserver/backup/
- Configuration files in $home_directory/gzserver/config/
To completely remove everything
# After running UninstallGzserver.sh sudo docker network rm mysqlnetsgzserver sudo docker rmi lingoport/gzserver:<version> sudo docker rmi mysql:8.0 rm -rf $home_directory/gzserver rm -rf $home_directory/lingoport
Configuration Reference
Manual Configuration Changes
To change configuration after installation:
CONTAINER_ID=$(cat $home_directory/gzserver/config/gz_container_id.txt) # Edit config inside container sudo docker exec -it $CONTAINER_ID vim /usr/local/tomcat/GzserverConfig.groovy # Restart to apply sudo docker restart $CONTAINER_ID
Troubleshooting
Installation Issues
Container won't start
- Check Docker daemon
sudo systemctl status docker
- Check port availability
sudo netstat -tlnp | grep 8080
- View container logs for errors
sudo docker logs $(cat $home_directory/gzserver/config/gz_container_id.txt)
Database connection errors:
- Verify MySQL is running
sudo docker ps | grep gzserverDatabase
- Or use container ID
MYSQL_ID=$(cat $home_directory/gzserver/config/gz_mysql_id.txt) sudo docker exec $MYSQL_ID mysql -u root -p<password> -e "SHOW DATABASES;"
- Check network connectivity between containers
sudo docker network inspect mysqlnetsgzserver
MySQL not ready during installation:
The install script waits up to 60 seconds for MySQL to be ready. If installation fails with MySQL readiness errors:
- Check MySQL container logs: `sudo docker logs gzserverDatabase`
- Verify MySQL image pulled correctly: `sudo docker images | grep mysql`
- Check available disk space: `df -h`
MySQL root password rejected during installation:
If the installer says MySQL did not accept the configured root credentials, the usual cause is an existing data directory at $home_directory/gzserver/mysql/data.
- Option: keep the existing database
- Update install.conf with the original MySQL root password used when the data directory was first created
sudo ./InstallGzserver.sh
- Option: start fresh
sudo rm -rf $home_directory/gzserver/mysql/data/* sudo ./InstallGzserver.sh
The installer removes the temporary gzserverDatabase container after this failure, but it does not delete the persisted MySQL data directory.
Git LFS Issues
- WAR file is a pointer file (130 bytes instead of ~50MB):
git lfs pull git lfs checkout
- Cloned without Git LFS:
- Install Git LFS
sudo dnf install git-lfs git lfs install # Pull LFS files git lfs pull
Runtime Issues
Out of memory errors:
- Edit server-config/hosted.sh and increase heap size:
export JAVA_OPTS="-Xms512m -Xmx2048m -Dstringchararrayaccessor.disabled=true"
- Rebuild image and redeploy using `UpdateGzserver.sh`.
Slow performance:
- Check VM resources: top, free -h, df -h
- Check Java heap usage in logs
- Consider increasing VM RAM or Java heap size
MySQL authentication plugin errors:
- The installation uses `mysql_native_password`. If you see authentication errors, verify the MySQL container started with --default-authentication-plugin=mysql_native_password.
Script Issues
- Update script fails:
- Check if containers are running
sudo docker ps
- Verify config file has all required values
cat install.conf
- Check Docker Hub credentials
echo $docker_account_token | docker login -u $docker_username --password-stdin
- Restore script can't find backup:
- List available backups
ls -lh $home_directory/gzserver/backup/ Restore expects format: GZSERVER_backup_YYYYMMDD_HHMM.sql
Command Center fails to communicate with Globalyzer Server
If the Command Center instance which pulls rule sets from the Globalyzer instance sits behind a forward proxy, the below can be added to the Command Center Instance to allow communications to pass through the forward proxy. The below assumes the that step has already been taken where the /root/.docker/config.json file has been updated to use the forward proxy.
REQUIRED FOR FORWARD PROXY ONLY
In the event that this instance needs to have connectivity to the the outside world from within the web applications UI and the system sits behind a proxy, the following file must be created. This is created inside of the container at ~/bin/setenv.sh
#!/bin/sh # The below will pull the values out of the environment git config --system http.proxy "$HTTP_PROXY" git config --system https.proxy "$HTTPS_PROXY" exec catalina.sh run CATALINA_OPTS="$CATALINA_OPTS \ -Dhttp.proxyHost=proxy.example.com \ -Dhttp.proxyPort=3128 \ -Dhttps.proxyHost=proxy.example.com \ -Dhttps.proxyPort=3128 \ -Dhttp.nonProxyHosts=localhost,127.0.0.1" export CATALINA_OPTS
Once created the docker application must be restarted in order for this to take effect.
Backup Best Practices
Automated backups:
If possible at the VM level perform regular backups to retain the entire VM contents.
If needed there are methods to back up the DB itself in addition. Create a cron job to run backups regularly:
# Edit crontab crontab -e # Add daily backup at 2 AM 0 2 * * * cd /path/to/globalyzer-server-docker && sudo ./BackupGzserverDatabase.sh # Add weekly cleanup (keep last 30 days) 0 3 * * 0 find $HOME/gzserver/backup/ -name "GZSERVER_backup_*.sql" -mtime +30 -delete
Backup retention:
Backups include full timestamps (YYYYMMDD_HHMM), allowing multiple backups per day. Consider:
- Daily backups retained for 30 days
- Weekly backups retained for 3 months
- Monthly backups retained for 1 year
Testing restores:
Regularly test your restore procedure to ensure backups are valid:
# Test restore on a dev/test system sudo ./RestoreGzserverDatabase.sh YYYYMMDD_HHMM
Verify data integrity through the web interface
Copyright (c) Lingoport 2025-2026