Skip to content

Deployment Guide

Deploying Joynare Nexus involves compiling the Go application for your target operating system and packaging it alongside your YAML configurations (flows/, routes/, and config/).

Because Joynare Nexus utilizes CGO (for packages like go-sqlite3 and alexbrainman/odbc), cross-compiling from Windows to Linux isn't straightforward without a specific C cross-compiler. The best practice is to build the application natively on the OS you intend to deploy it to.


1. Preparing the Environment

Depending on your target OS, you may need to install the golang compiler and the Unix ODBC development headers so that CGO can successfully build the database adapters.

Windows

On Windows, standard Go and GCC (via MinGW or similar) is sufficient.

Linux (Ubuntu / Debian / WSL)

bash
sudo apt-get update
sudo apt-get install golang gcc zip unixodbc-dev

Linux (AlmaLinux / RHEL / CentOS)

On Enterprise Linux, the ODBC development headers are often located in the CRB (or PowerTools) repository which is disabled by default.

AlmaLinux 9 / RHEL 9:

bash
sudo dnf config-manager --set-enabled crb
sudo dnf install golang gcc zip unixODBC-devel

AlmaLinux 8 / CentOS 8:

bash
sudo dnf config-manager --set-enabled powertools
sudo dnf install golang gcc zip unixODBC-devel

(If you encounter a missing sql.h error during build, it means the unixODBC-devel package is missing!)


2. Deployment Scripts

We recommend standardizing your build output into separate dist/windows and dist/linux directories to prevent artifact mixing. We've provided two scripts to automate this process.

Building for Windows (build-deploy.ps1)

Run this in PowerShell if you plan to deploy to a Windows Server.

powershell
$ErrorActionPreference = "Stop"

$BaseDir = "dist"
$OutputDir = "$BaseDir/windows"
$ZipFile = "$BaseDir/joynare-nexus-windows.zip"
$BinaryName = "joynare-nexus.exe"

Write-Host "Cleaning up old Windows build..." -ForegroundColor Cyan
if (Test-Path $OutputDir) { Remove-Item -Path $OutputDir -Recurse -Force }
if (Test-Path $ZipFile) { Remove-Item -Path $ZipFile -Force }

Write-Host "Creating $OutputDir directory..." -ForegroundColor Cyan
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null

Write-Host "Building Joynare Nexus for Windows..." -ForegroundColor Cyan
go build -o "$OutputDir/$BinaryName" ./cmd/esb

Write-Host "Copying configuration and resources..." -ForegroundColor Cyan
$FoldersToCopy = @("flows", "routes", "config")
foreach ($Folder in $FoldersToCopy) {
    if (Test-Path $Folder) {
        Copy-Item -Path $Folder -Destination "$OutputDir/$Folder" -Recurse -Force
    }
}

Write-Host "Packaging deployment archive ($ZipFile)..." -ForegroundColor Cyan
Compress-Archive -Path "$OutputDir\*" -DestinationPath $ZipFile -Force
Write-Host "Deployment package ready: $ZipFile" -ForegroundColor Green

Building for Linux (build-deploy.sh)

Run this in Bash (on your Linux server, or via WSL on Windows) if you plan to deploy to a Linux Server.

bash
#!/bin/bash
set -e

BASE_DIR="dist"
OUTPUT_DIR="$BASE_DIR/linux"
ZIP_FILE="$BASE_DIR/joynare-nexus-linux.zip"
BINARY_NAME="joynare-nexus"

echo -e "\e[36mCleaning up old Linux build...\e[0m"
rm -rf "$OUTPUT_DIR"
rm -f "$ZIP_FILE"

echo -e "\e[36mCreating $OUTPUT_DIR directory...\e[0m"
mkdir -p "$OUTPUT_DIR"

echo -e "\e[36mBuilding Joynare Nexus for Linux...\e[0m"
go build -o "$OUTPUT_DIR/$BINARY_NAME" ./cmd/esb

echo -e "\e[36mCopying configuration and resources...\e[0m"
for folder in flows routes config; do
    if [ -d "$folder" ]; then cp -r "$folder" "$OUTPUT_DIR/" ; fi
done

echo -e "\e[36mPackaging deployment archive ($ZIP_FILE)...\e[0m"
cd "$OUTPUT_DIR"
zip -r "../joynare-nexus-linux.zip" ./* > /dev/null
cd ../..

echo -e "\n\e[32mDeployment package ready: $ZIP_FILE\e[0m"

(Make sure to grant execution permissions to the script: chmod +x build-deploy.sh)


3. Running as a Background Service (Linux systemd)

Once you transfer and unzip the deployment package onto your Linux server (e.g., into /opt/joynare-nexus), you should configure it as a systemd service so it runs continuously in the background and restarts on server reboots.

  1. Ensure the binary has execute permissions:

    bash
    sudo chmod +x /opt/joynare-nexus/joynare-nexus
  2. Create the service file:

    bash
    sudo nano /etc/systemd/system/joynare-nexus.service
  3. Paste the following configuration:

    ini
    [Unit]
    Description=Joynare Nexus ESB
    After=network.target
    
    [Service]
    Type=simple
    User=root
    WorkingDirectory=/opt/joynare-nexus
    ExecStart=/opt/joynare-nexus/joynare-nexus serve
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
  4. Enable and start the service:

    bash
    sudo systemctl daemon-reload
    sudo systemctl enable joynare-nexus
    sudo systemctl start joynare-nexus
    sudo systemctl status joynare-nexus

You can now monitor the application logs using:

bash
sudo journalctl -u joynare-nexus -f

Released under the ISC License.