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
- OS: Windows Server 2016+ or Windows 10/11 (x64)
- Java: Java 21+ (bundled with the installer — no separate install required)
- Disk: 200 MB for install directory; additional space for user home directories
- Ports: SFTP (default 22), FTP/FTPS (default 21), Web Admin (default 9980)
- Permissions: Administrator privileges for installation and Windows service registration
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:
| Step | Description |
|---|---|
| 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. |
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).
| Property | Value |
|---|---|
| Service name | StylusSFTPServer |
| Display name | IVI Technologies Stylus SFTP Server |
| Startup type | Automatic |
| Log on as | NT Authority\LocalService |
| JVM timezone | -Duser.timezone=UTC is set by the service registration |
-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
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
- Place
activation.keyin the data directory root. - Start the service:
sc start StylusSFTPServer - Check log:
C:\ProgramData\StylusSFTPServer\logs\stylus-sftp.log - Test SFTP:
sftp -P 22 admin@localhost - Open Web Admin:
http://localhost:9980
Linux Installation
Prerequisites
- OS: Any modern Linux distribution (RHEL/CentOS 8+, Ubuntu 20.04+, Debian 11+, SUSE 15+)
- Java: Java 21+ (bundled JRE included in the distribution archive, or install system-wide)
- Disk: 200 MB for install directory; additional space for user home directories
- Ports: Ports below 1024 require
rootorCAP_NET_BIND_SERVICE - User: Dedicated service account recommended (e.g.
sftpserver)
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
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
- Place
activation.keyin the data directory root:/var/lib/stylus-sftp-server/activation.key - Start the service:
sudo systemctl start stylus-sftp-server - Check log:
tail -f /var/lib/stylus-sftp-server/logs/stylus-sftp.log - Test SFTP:
sftp -P 22 admin@localhost - 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
| Parameter | Required | Description |
|---|---|---|
--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. |
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.
-
dataFolder.txtin the install root contains the absolute path to the data directory as a single line of plain text. -
System property:
stylus.sftpserver.data— set automatically by the startup scripts. -
Path macro:
${STYLUS_SFTPSERVER_DATA}— usable in all configuration files.
Upgrade
- Stop the server (Windows:
sc stop StylusSFTPServer/ Linux:sudo systemctl stop stylus-sftp-server). - Run the new installer, pointing it at the same install directory and same data directory.
- The installer backs up
conf/anddb/before overwriting files. - Configuration is preserved. Review release notes for new configuration options.
- Start the server.
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.
| Property | Value |
|---|---|
| File location | ${STYLUS_SFTPSERVER_DATA}/activation.key |
| Maximum validity | 366 days |
| Hot-reload | Checked hourly — no restart needed for key renewal |
| Expiry warning | Logged 30 days before expiration |
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.