# Deploy SyncEngine
To deploy SyncEngine:
-
Ensure that SyncEngine host requirements are met.
-
Complete the steps to deploy SyncEngine control plane and UI/CLI.
-
Complete the steps to deploy one or more SyncEngine workers.
Host Requirements
A minimum SyncEngine configuration includes three hosts: one for the control plane and two for workers.
-
CPU 4 cores
-
Minimum 128GB of RAM for the control plane and 256GB for workers
-
50GB of free disk space per host at
/opt/syncengine(or your chosen install path) -
Network: at least 10 GB for the control plane and 100 GbE for workers (recommended)
-
Network connectivity between the control plane and worker hosts, and also to migration source and destination
-
Rocky Linux v9.5 is recommended; Python 3.8 or higher, Docker or Podman installed, curl and tar utilities
-
Root or sudo access on all hosts; admin access to the VAST Management Service (VMS)
-
Available ports per Containers and required ports.
Firewall
Open Ports
Ensure the required ports are open on the control plane host.
-
On RHEL / Rocky Linux / CentOS:
-
Ensure that
firewalldis running:sudo firewall-cmd --state -
Open the required ports by running the following command for each of the required ports:
sudo firewall-cmd --permanent --add-port=<port number>/tcp -
Apply the configuration:
sudo firewall-cmd --reload -
Verify by listing open ports:
sudo firewall-cmd --list-ports
-
-
On Debian / Ubuntu:
-
Ensure that
ufwis running:sudo ufw status -
Open ports by running the following command for each of the required ports:
sudo ufw allow <port number>/tcp -
Verify by listing open ports:
sudo ufw status
-
Check iptables Rules
Check for iptables rules that may block traffic:
sudo iptables -L -n
Containers and Required Ports
The following SyncEngine containers run on the control plane host:
| Container | Port | Worker |
|---|---|---|
syncengine-control |
5009 | SyncEngine API server |
postgres |
5432 | Internal database |
redis |
6379 | Job coordination and queuing |
syncengine-ui |
HTTP: 18088, HTTPS: 8443 | SyncEngine UI |
prometheus |
19091 | Metrics collection |
grafana |
3009 | Dashboards |
pgadmin |
5050 | Database management UI |
redisinsight |
5540 | Job visualization |
otel-collector |
4318 | Telemetry aggregation |
loki |
3100 | Log aggregation |
The following ports must be open to ensure worker connectivity:
| Port | Purpose |
|---|---|
| 2049 | NFS |
| 80 | S3 over HTTP |
| 443 | S3 over HTTPS |
If you are going to use SyncEngine CLI (deployed via a additional RPM), open port:
| Port | Purpose |
|---|---|
| 8888 | SyncEngine CLI |
Deploy Control Plane, UI and CLI
Perform these steps on the host intended for the control plane.
Step 1: Download and Extract Installation Files
Using the links provided by VAST, download and extract the following files for the latest SyncEngine release to your control plane host:
-
ms- The install script -
Vastdata_SyncEngine_v<version>.tar.gz- The container images and
configs, including SyncEngine UI -
syncengine-cli-<...>.<platform>.tar.gz- The SyncEngine CLI
(optional)
Step 2: Make Install Script Executable
Run to ensure that the install script can be executed:
chmod +x ms
Step 3: Install Control Plane
Run to install the control plane:
./ms install control /<path>/Vastdata_SyncEngine_v<version>.tar.gz /opt/syncengine
If needed, replace /opt/syncengine with the install directory of your choice.
The install procedure:
-
Checks that curl, tar, and Podman are available.
-
Extracts the SyncEngine bundle contents to
/opt/syncengine. -
Validates and loads all SyncEngine container images.
-
Starts all control plane services.
Step 4: Verify Control Plane
-
Ping the control plane:
./ms ping -
List SyncEngine containers:
podman ps --filter label=project=syncengineThe output should include containers listed in Containers and required ports. In case any of the containers is not running, check the logs with
podman logs <container_name>.
Step 5 (Optional): Install CLI
-
On the control plane host, install the downloaded RPM:
sudo rpm -Uvh syncengine-cli-<...>.<platform>.rpm
Step 6: Log in to SyncEngine UI
In your browser, navigate to:
http://<control plane IP>:18088
Use credentials provided by VAST.
In addition to the UI, the following resources are available:
-
Grafana performance dashboards:
http://<control plane IP>:3009 -
Raw metrics (Prometheus):
http://<control plane IP>:19091 -
API documentation:
http://<control plane IP>:5009/docs
Set up TLS for SyncEngine UI
Complete these steps to enable TLS for the SyncEngine UI web server using a self-signed certificate or a CA-issued certificate.
When TLS is enabled, the server listens on two ports:
-
HTTP port 8888
-
HTTPS port 8443
-
Create the
ssldirectory:sudo mkdir -p /etc/ssl/syncengine sudo chown root:syncengine /etc/ssl/syncengine sudo chmod 750 /etc/ssl/syncengine -
Provide a certificate:
-
If you have a CA-issued certificate, copy the certificate and the private key to the
ssldirectory:sudo cp your-certificate.crt /etc/ssl/syncengine/server.crt sudo cp your-private-key.key /etc/ssl/syncengine/server.key -
If you want to use a self-signed certificate, generate the
server.crtandserver.keyfiles under/etc/ssl/syncengine/:sudo syncengine-cli tls generate --hostname $(hostname -f)If the UI is to be accessed via multiple hostnames or IPs, add more hostnames, for example:
sudo syncengine-cli tls generate \ --hostname $(hostname -f) \ --san "localhost,192.168.1.100,syncengine.example.com"
-
-
Set certificate permissions:
sudo chown root:syncengine /etc/ssl/syncengine/server.key sudo chmod 640 /etc/ssl/syncengine/server.key sudo chmod 644 /etc/ssl/syncengine/server.crt -
Edit
/etc/default/syncengine-cliso that it includes these lines:SYNCENGINE_CLI_WEB_PORT=8888 SYNCENGINE_CLI_TLS_ENABLED=true SYNCENGINE_CLI_HTTPS_PORT=8443 -
Restart the UI service:
sudo systemctl daemon-reload sudo systemctl restart syncengine-ui -
Check the UI status:
sudo systemctl status syncengine-uiThe output should indicate that both HTTP and HTTPS are running:
Web UI started successfully! HTTP: http://localhost:8888 HTTPS: https://localhost:8443 Certificate expires in 365 days (2027-05-05) -
Verify that TLS is working:
-
Check service logs:
sudo journalctl -u syncengine-ui -n 50 -
Test the HTTP endpoint:
curl http://localhost:8888/api/webuihealth -
Test the HTTPS endpoint:
curl -k https://localhost:8443/api/webuihealthNote: The
-kflag is required only if you're using a self-signed certificate. -
Check TLS status:
curl http://localhost:8888/api/tls/statusThe response should be similar to:
{ "tls_enabled": true, "https_port": 8443, "certificate": { "subject": "your-hostname", "issuer": "Self-Signed", "days_remaining": 365, "status": "valid" } }
-
-
Access the SyncEngine UI in your browser using HTTPS:
https://<control plane IP>:8443If using a self-signed certificate, the browser will display a security warning.
Troubleshoot TLS
Service won't start
sudo journalctl -u syncengine-ui -n 100 --no-pager
Certificate file not found
Check if the certificate files exist:
ls -la /etc/ssl/syncengine/
Regenerate the files if needed.
Private key is world-readable
Update the permissions:
sudo chmod 640 /etc/ssl/syncengine/server.key
sudo chown root:syncengine /etc/ssl/syncengine/server.key
HTTPS port already in use
-
Check which service is using port 8443:
sudo ss -tlnp | grep 8443 -
Either stop the conflicting service or change the HTTPS port. For example, if the CLI was installed as a RPM:
echo "SYNCENGINE_CLI_HTTPS_PORT=8444" | sudo tee -a /etc/default/syncengine-cli sudo systemctl restart syncengine-ui
Certificate expired
Check expiration:
syncengine-cli tls info /etc/ssl/syncengine/server.crt
Regenerate the files if needed.
Deploy Worker
Perform these steps on the host intended for a SyncEngine worker.
Step 1: Copy SyncEngine Bundle and Install Script to Worker Host
Copy the two files extracted from the SyncEngine bundle (ms and Vastdata_SyncEngine_v<version>.tar.gz ) to the worker host.
Step 2: Make Install Script Executable
Run to ensure that the install script can be executed:
chmod +x ms
Step 3: Install Worker
Install worker images:
./ms install worker /<path>/Vastdata_SyncEngine_v<version>.tar.gz /opt/syncengine
If needed, replace /opt/syncengine with the install directory of your choice.
Step 4: Deploy Worker
Deploy the worker:
cd /opt/syncengine
WORKER_LABEL=<label> CONTROL_IP=<control plane IP> ./ms deploy worker
The deploy command includes worker deployment variables:
-
WORKER_LABEL=<label>sets a text string that lets you associate the worker with a particular migration task. You assign this label when configuring a migration. -
CONTROL_IP=<control plane IP>sets the IP of the host where the control plane is deployed.
Tip: For more worker deployment variables, see Worker deployment variables.
Tune Workers
The worker can be tuned for a particular type of workload:
-
Many small files
Set the
PROCESS_COUNTvariable to a higher value so that all threads are kept busy (e.g., 80-128). -
Large files
Set the
PROCESS_COUNTvariable to a lower value to avoid memory pressure and let each thread move data efficiently (e.g., 16-32). -
Mount points outside of
/mntSupply a comma-separated list of mount paths on the
VOLUMESvariable.
For example, to migrate a very large number of small files across multiple mount points:
VOLUMES='/mnt,/data' PROCESS_COUNT=96 WORKER_LABEL=bulk-migration CONTROL_IP=<IP> ./ms deploy worker
Step 5: Verify Worker State
-
Check the container:
podman ps | grep worker -
Check the logs:
podman logs -f syncengine-workerYou should see that the worker has registered with the control plane and started polling for jobs.
Worker Deployment Variables
| Port | Service |
|---|---|
WORKER_LABEL |
(Required) A label that lets you associate the worker with a particular migration task. You assign this label when configuring a migration. |
CONTROL_IP |
(Required) The IP of the control plane. |
CONTROL_PORT |
Control plane API port. Default is 5009. |
PROCESS_COUNT |
Controls the number of parallel transfer threads the worker spawns. Default is CPU count multiplied by 2. |
VOLUMES |
Controls which host paths the worker container mounts, making them accessible for migration jobs. Enter a comma-separated list of mount paths ( /srv, /mnt, /home). Default is /mnt. |
CONTROL_USERNAME |
Username for automatic token creation. |
CONTROL_PASSWORD |
Password for automatic token creation. |
LOG_LEVEL |
Logging level. Valid values: DEBUG, INFO (default), AUDIT. |
Restart Control Plane
Complete these steps if you need to reboot the control plane host or restart all SyncEngine services:
-
Stop all containers:
cd /opt/syncengine podman-compose -f podman-compose.yaml stop -
Reboot the host (if needed):
sudo reboot -
After the host is online, bring the services back up:
cd /opt/syncengine ./ms deploy control -
Verify the control plane is reachable:
./ms ping -
Verify that all containers are up and running:
podman ps --filter label=project=syncengine
Uninstall SyncEngine
Use the SyncEngine install script (ms) to uninstall the control plane. workers, and the UI/CLI RPM.
Uninstall Control Plane and UI
On the control plane host, run from your install directory (/opt/syncengine/):
./ms uninstall
The install script removes all SyncEngine containers, images, volumes and networks, and verifies the cleanup.
Uninstall Worker
In the worker host:
-
Stop the worker container:
podman stop syncengine-worker -
Remove the container:
podman rm syncengine-worker -
Remove the worker image and install directory:
cd /opt/syncengine ./ms uninstall
Uninstall CLI RPM
On the host where the CLI RPM was installed:
sudo rpm -e syncengine-ui