Installation

Stylus SFTP Server ships as a single executable installer JAR that runs on both Windows and Linux. The installer provides an interactive GUI wizard and a silent command-line mode for automated deployments.

Windows Installation

Prerequisites

GUI Installer

Launch the installer by double-clicking the JAR or running:

java -jar stylus-sftp-server-installer.jar

The wizard walks through the following steps:

StepDescription
Welcome Product name, version, and build number.
License Review and accept the license agreement.
Install Location Binaries and libraries. Default: C:\Program Files\StylusSFTPServer
Data Directory Configuration, database, logs, homes. Default: C:\ProgramData\StylusSFTPServer
SFTP Port Port for the SFTP listener. Default: 22
FTP Config Optional FTP/FTPS: port, TLS mode, keystore path and password.
Admin Account Initial administrator username and password for the web admin console. A live match indicator confirms when the password and confirmation fields agree.
Cloud Vault Optional. Store the master key password in a cloud vault (Azure Key Vault, AWS Secrets Manager, or Google Cloud Secret Manager) instead of keeping it on disk. The installer displays the generated password, waits for you to store it in your vault, then verifies the round-trip. See Cloud Vault Integration.
Credential Protection (Windows only) Choose how master.key and credentials.p12 are protected on disk. Options: use an existing Windows group, create a new local group, or skip (no group ACL). The installer adds the current user and the service account to the group automatically. See Windows Group ACL.
Progress Files extracted, configuration generated, Windows service registered, database initialized.
Finish Installation complete. Optionally start the service.
Note The installer sets Windows ACLs on the data directory so the NT Authority\LocalService account can read and write files.

Directory Structure

Install Directory (read-only binaries)

C:\Program Files\StylusSFTPServer\
    bin\           -- start.bat, stop.bat, admin.bat, admin-gui.bat, prunsrv64.exe
    libs\          -- stylus-sftp-server.jar and dependencies
    tomcat\        -- embedded Tomcat for web admin console
    jre\           -- bundled Java 21 runtime
    dataFolder.txt -- pointer to data directory

Data Directory (writable, mutable state)

C:\ProgramData\StylusSFTPServer\
    conf\          -- sftp-server.xml, filesystem-config.xml, admin-console.xml, users.xml
    db\            -- H2 database files (AES-encrypted on new installs)
    homes\         -- per-user home directories
    logs\          -- stylus-sftp.log, log4j2.xml
    conf\hostkey-*.ser        -- auto-generated SSH host keys
    conf\credentials.p12      -- PKCS12 credential vault (db password, signing passphrase)
    activation.key            -- license key file
    backup_activation_keys\   -- previous activation.key archives on license update
    branding\                 -- Portal white-label assets (Enterprise)
    signing\                  -- Server PGP signing key store (Enterprise)
    geodb\                    -- GeoIP database files (optional)

The install image also ships the file-verifier tool alongside the server binaries so it can be downloaded via the Portal at /portal/tools/verify.jar or handed out directly:

C:\Program Files\StylusSFTPServer\tools\
    verify.jar                -- shaded fat JAR (Java 21+)
    verify.exe                -- Windows native launcher (GUI)
    verify-cli.exe            -- Windows native launcher (console)
    verify-portable.zip       -- self-contained bundle: jlink JRE + JAR + launchers

Windows Service

The GUI installer automatically registers Stylus SFTP Server as a Windows service using Apache Commons Daemon (prunsrv64.exe).

PropertyValue
Service nameStylusSFTPServer
Display nameIVI Technologies Stylus SFTP Server
Startup typeAutomatic
Log on asNT Authority\LocalService
JVM timezone-Duser.timezone=UTC is set by the service registration
Note — UTC posture The installer pins the JVM to UTC via -Duser.timezone=UTC on the service command line. All database timestamps, audit records, and log lines are written in UTC. The admin console (Web and Swing) converts to the operator's local timezone at display time, so tenants operating from different timezones stay consistent when looking at the same event.

Manage the service via command line or services.msc:

sc start StylusSFTPServer
sc stop StylusSFTPServer
sc query StylusSFTPServer
Note NT Authority\LocalService has limited network privileges. If home directories reside on a network share, change the service account to a domain account with appropriate permissions.

First Run

  1. Place activation.key in the data directory root.
  2. Start the service: sc start StylusSFTPServer
  3. Check log: C:\ProgramData\StylusSFTPServer\logs\stylus-sftp.log
  4. Test SFTP: sftp -P 22 admin@localhost
  5. Open Web Admin: http://localhost:9980

Linux Installation

Prerequisites

Install from Archive

The Linux distribution is a ZIP archive. Extract it to your preferred location:

# Create install directory
sudo mkdir -p /opt/stylus-sftp-server
sudo unzip StylusSFTPServer-linux.zip -d /opt/stylus-sftp-server

# Create data directory
sudo mkdir -p /var/lib/stylus-sftp-server/{conf,db,homes,logs,geodb}

# Point install to data
echo "/var/lib/stylus-sftp-server" | sudo tee /opt/stylus-sftp-server/dataFolder.txt

# Create service account
sudo useradd -r -s /sbin/nologin sftpserver
sudo chown -R sftpserver:sftpserver /opt/stylus-sftp-server
sudo chown -R sftpserver:sftpserver /var/lib/stylus-sftp-server

Or use the silent installer (see below):

java -jar stylus-sftp-server-installer.jar --console --defaults \
    --installdir /opt/stylus-sftp-server \
    --datadir /var/lib/stylus-sftp-server \
    --port 22 \
    --adminuser admin \
    --adminpassword secret

Directory Structure

Install Directory

/opt/stylus-sftp-server/
    bin/           -- start.sh, stop.sh, admin.sh, admin-gui.sh
    libs/          -- stylus-sftp-server.jar and dependencies
    tomcat/        -- embedded Tomcat for web admin console
    jre/           -- bundled Java 21 runtime (optional)
    dataFolder.txt -- pointer to data directory

Data Directory

/var/lib/stylus-sftp-server/
    conf/          -- sftp-server.xml, filesystem-config.xml, admin-console.xml, users.xml
    db/            -- H2 database files
    homes/         -- per-user home directories
    logs/          -- stylus-sftp.log, log4j2.xml
    conf/hostkey-*.ser  -- auto-generated SSH host keys
    activation.key -- license key file
    geodb/         -- GeoIP database files (optional)

systemd Service

Create a systemd unit file to manage the server as a service. This is the recommended approach for production Linux deployments.

# /etc/systemd/system/stylus-sftp-server.service

[Unit]
Description=Stylus SFTP Server
After=network.target

[Service]
Type=simple
User=sftpserver
Group=sftpserver
WorkingDirectory=/opt/stylus-sftp-server

Environment=JAVA_HOME=/opt/stylus-sftp-server/jre
Environment=STYLUS_SFTPSERVER_HOME=/opt/stylus-sftp-server
Environment=STYLUS_SFTPSERVER_DATA=/var/lib/stylus-sftp-server

ExecStart=/opt/stylus-sftp-server/bin/start.sh
ExecStop=/opt/stylus-sftp-server/bin/stop.sh

Restart=on-failure
RestartSec=10

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/lib/stylus-sftp-server
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Enable and start the service:

sudo systemctl daemon-reload
sudo systemctl enable stylus-sftp-server
sudo systemctl start stylus-sftp-server
sudo systemctl status stylus-sftp-server

Binding to Privileged Ports (below 1024)

If you need to run on port 22 (standard SFTP) without running as root, grant the Java binary the CAP_NET_BIND_SERVICE capability:

sudo setcap 'cap_net_bind_service=+ep' /opt/stylus-sftp-server/jre/bin/java
Tip Alternatively, use a non-privileged port (e.g. 2222) and redirect port 22 with iptables or firewalld:
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

Firewall Configuration

# firewalld (RHEL/CentOS/Fedora)
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=9980/tcp
sudo firewall-cmd --reload

# ufw (Ubuntu/Debian)
sudo ufw allow 22/tcp
sudo ufw allow 9980/tcp

If FTP/FTPS is enabled, also open the control port and passive port range:

sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=50000-50100/tcp
sudo firewall-cmd --reload

First Run

  1. Place activation.key in the data directory root: /var/lib/stylus-sftp-server/activation.key
  2. Start the service: sudo systemctl start stylus-sftp-server
  3. Check log: tail -f /var/lib/stylus-sftp-server/logs/stylus-sftp.log
  4. Test SFTP: sftp -P 22 admin@localhost
  5. Open Web Admin: http://localhost:9980

Silent / CLI Installer

For scripted or unattended deployments on either platform, pass the --console --defaults flags along with all required parameters:

Windows

java -jar stylus-sftp-server-installer.jar --console --defaults ^
    --installdir "C:\Program Files\StylusSFTPServer" ^
    --datadir "C:\ProgramData\StylusSFTPServer" ^
    --port 22 ^
    --adminuser admin ^
    --adminpassword secret

Linux

java -jar stylus-sftp-server-installer.jar --console --defaults \
    --installdir /opt/stylus-sftp-server \
    --datadir /var/lib/stylus-sftp-server \
    --port 22 \
    --adminuser admin \
    --adminpassword secret

All Parameters

ParameterRequiredDescription
--console Yes Run the text-mode installer instead of the GUI (required for headless / unattended installs).
--defaults Yes Accept the default for any parameter not supplied, without prompting.
--installdir Yes Installation directory for binaries.
--datadir Yes Data directory for configuration and mutable state.
--port No SFTP listener port number (default 22).
--ftpport No FTP/FTPS listener port. Omit to disable FTP.
--ftpssl No TLS mode: none, explicit, or implicit.
--ftpkeystorepath No Path to the PKCS#12 or JKS keystore for FTPS.
--ftpkeystorepassword No Keystore password.
--adminuser Yes Administrator username for the web admin console.
--adminpassword Yes Administrator password.
Tip The silent installer exits with code 0 on success and non-zero on failure. Check the installer log in the data directory for details.

Data Directory Separation

Stylus SFTP Server separates read-only binaries from mutable runtime data. This simplifies upgrades and supports locked-down environments.

Upgrade

  1. Stop the server (Windows: sc stop StylusSFTPServer / Linux: sudo systemctl stop stylus-sftp-server).
  2. Run the new installer, pointing it at the same install directory and same data directory.
  3. The installer backs up conf/ and db/ before overwriting files.
  4. Configuration is preserved. Review release notes for new configuration options.
  5. Start the server.
Tip The backup is stored in the data directory as a timestamped ZIP file (e.g., backup-20260317-143000.zip). Keep it until you have verified the upgrade was successful.

Activation Key

Stylus SFTP Server requires a valid activation key to operate. Place the activation.key file in the root of the data directory.

PropertyValue
File location${STYLUS_SFTPSERVER_DATA}/activation.key
Maximum validity366 days
Hot-reloadChecked hourly — no restart needed for key renewal
Expiry warningLogged 30 days before expiration
Warning If the activation key is missing, expired, or tampered with, the server logs a LICENSE_REJECTED audit event and shuts down. The hourly runtime enforcer also checks key validity and will stop the server if the key becomes invalid after startup.