Skip to content

Getting Started

As of the latest release, Sylve requires FreeBSD 15.0-RELEASE or later. You will also need to have a ZFS pool available if you intend to use Sylve for managing Virtual Machines or Jails. If you are using Sylve just for things like WireGuard or the built-in firewall, you can use any filesystem, but ZFS is still recommended for its advanced features and reliability.

If you want to get going right away, run pkg install sylve on a FreeBSD >= 15 machine and open https://<host>:8181 in your browser. For more details, continue reading.

Sylve is designed to run using only base FreeBSD dependencies if you prefer. However, we recommend installing the following packages:

Capability Packages What they enable Requirement
Bhyve virtualization libvirt, bhyve-firmware, swtpm, qemu-tools Virtual-machine creation and management, firmware support, virtual TPMs, and disk-image tooling. Required to use the virtualization subsystem.
SMB file sharing samba4XX SMB shares for guests and Jails, including basic share management and audit logging. Optional; required for SMB features.
DHCP and DNS dnsmasq Managed DHCP ranges, leases, and DNS services from within Sylve. Optional; required for managed DHCP and DNS.

Install all recommended dependencies at once:

Terminal window
pkg install -y libvirt bhyve-firmware swtpm qemu-tools samba423 dnsmasq

If you install Sylve with pkg install sylve, these dependencies are pulled in automatically; the command above is only needed when installing Sylve manually or building it from source.

Use this estimator as a conservative starting point for a Sylve host running a mix of Jails, Bhyve virtual machines, and replicated workloads. Enter the resources assigned across your VMs rather than relying on a VM count. Jails use a modest mixed-services baseline; applications with known requirements should be sized separately.

Workload allocations
Storage planning
CPU7 threadsWithout overcommit
Memory14.5 GBIncludes host + ARC reserve
Primary ZFS227 GBIncludes selected headroom
Replica targets134 GBData × copies, with headroom

Planning baseline, not a performance guarantee. CPU overcommit, thin provisioning, compression, deduplication, snapshot retention, and workload peaks can materially change the result.

How this estimate is calculated

The host reserve is one CPU thread plus 4 GB of memory for FreeBSD, Sylve, and a modest ARC. VM allocations are added directly. Each Jail contributes a planning allowance of 0.5 GB of memory, 10 GB of storage, and one quarter of a CPU thread. Storage totals preserve the selected percentage as free ZFS headroom.

Replica capacity is shown separately because it is consumed on the destination host or backup target. For active replication, prefer at least a 1 Gbps link and leave additional ZFS headroom for snapshots and changed blocks.

As mentioned before, the easiest way to install Sylve is via the FreeBSD package manager. Run the following command:

Terminal window
pkg install sylve

It will pull in all the required dependencies and install Sylve on your system. Once the installation is complete, you can enable and start the service using:

Terminal window
service sylve enable && service sylve start

We recommend first getting your system up and running with a pkg installation, and then replacing the binary with the latest release from GitHub if you want to stay on the bleeding edge. This is because the pkg version may lag behind the latest nightly release, and you may want to take advantage of new features or bug fixes (which we do support and recommend).

Before replacing the packaged binary, lock the Sylve package:

Terminal window
pkg lock -y sylve

The package database still considers /usr/local/sbin/sylve part of the installed Sylve package. Locking it prevents a later pkg upgrade from silently replacing your GitHub release with the repository version. Other system packages can continue to update normally.

You can visit the releases page and download the latest release for your architecture. Once downloaded, you can move the sylve binary to a location in your PATH, such as /usr/local/bin. The below commands will do this for you:

Terminal window
# Replace amd64 with arm64 if you're on an ARM64 system
fetch https://github.com/AlchemillaHQ/Sylve/releases/download/tip/sylve-amd64 -o sylve
chmod +x sylve
mv sylve /usr/local/sbin/

Should get you the absolute latest release, but if you want to get a specific version, just replace tip with the version tag you want to install for instance v0.3.0.

Keep the package locked while managing the binary from GitHub Releases. To return to the FreeBSD package version, unlock and reinstall it explicitly:

Terminal window
pkg unlock -y sylve
pkg install -f sylve

Building Sylve is actually insanely simple. You obviously need the Go toolchain and Node.js installed on your system, but other than that you can just clone the repository and run the build command. If you don’t have Go or Node.js installed, you can install them via pkg:

Terminal window
pkg install go node npm git-lite

Once that’s done, you can clone the repository, navigate to the project directory, and run the build command:

Terminal window
git clone https://github.com/AlchemillaHQ/Sylve.git
cd Sylve
make

That should build both the backend and frontend, and place the sylve binary in the bin/ directory. You can then move it to a location in your PATH:

Terminal window
mv bin/sylve /usr/local/sbin/

Sylve reads its runtime configuration from /usr/local/etc/sylve/config.json. Start with the following production-oriented example and replace the administrator password before the first launch:

{
"environment": "production",
"proxyToVite": false,
"profile": false,
"ip": "0.0.0.0",
"port": 8181,
"httpPort": 8182,
"logLevel": 3,
"dataPath": "/var/db/sylve",
"auth": {
"enablePAM": false
},
"admin": {
"email": "admin@sylve.local",
"password": "replace-this-with-something-strong",
"forcePasswordReset": false
},
"raft": {
"reset": false
},
"btt": {
"rpc": {
"enabled": false,
"address": "127.0.0.1",
"port": 6890
},
"dht": {
"enabled": true,
"port": 7246
}
},
"jails": {
"disableDevFS": false
},
"zfs": {
"tune": true
},
"uploads": {
"maxFileBytes": 68719476736,
"maxConcurrentTransfers": 2
},
"trustedProxies": []
}
Object / parameterExamplePurpose
config.jsonRoot configuration
environment"production"Runtime mode: production, development, or debug.
proxyToVitefalseProxies frontend requests to Vite. Keep disabled in production.
profilefalseEnables Go block and mutex profiling for diagnostics.
ip"0.0.0.0"Bind address for the HTTP and HTTPS listeners.
port8181HTTPS API and web-interface port. Set to 0 to disable.
httpPort8182Plain HTTP port. Set to 0 to disable.
logLevel30 debug, 1 info, 2 warning, 3 error, 4 fatal, 5 panic.
dataPath"/var/db/sylve"Stores databases, Raft state, downloads, uploads, and working data.
trustedProxies[]Trusted proxy IP addresses or CIDR ranges. Keep empty unless required.
authSystem authentication
enablePAMfalseAllows authentication with FreeBSD system accounts when explicitly enabled. Disabled by default.
adminBuilt-in administrator
email"admin@sylve.local"Email address assigned to the built-in administrator.
password"…"Sets the initial password. It may be blank after initialization without clearing the stored hash.
forcePasswordResetfalseApplies a non-empty configured password on the next startup, then clears itself.
raftCluster state
resetfalseDestructively resets this node's Raft state for deliberate cluster recovery.
btt.rpcOptional torrent RPC listener
enabledfalseEnables the BTT RPC listener.
address"127.0.0.1"RPC bind address. The field is named address, not host.
port6890RPC listener port.
btt.dhtTorrent peer discovery
enabledtrueEnables BitTorrent DHT discovery for magnet downloads.
port7246UDP port used for DHT peer discovery.
jailsJail integration
disableDevFSfalseDisables Sylve-managed DevFS rules. Automatically disabled when Sylve runs in a Jail.
zfsHost tuning
tunetrueApplies Sylve's recommended ZFS tuning during startup.
uploadsTransfer limits
maxFileBytes68719476736Maximum accepted file size in bytes; this example is 64 GiB.
maxConcurrentTransfers2Maximum number of simultaneous upload transfers.

Create the configuration directory and place the completed file there:

Terminal window
mkdir -p /usr/local/etc/sylve
mv config.json /usr/local/etc/sylve/

Sylve creates dataPath and its required subdirectories automatically. Place it on storage with enough capacity for databases, Raft state, uploads, ISO images, base archives, and other downloads.

The pkg and ports installations provide the rc.d service automatically. For manual GitHub Release or source installations, use the maintained FreeBSD ports rc.d template as the reference implementation instead of copying a script from this guide. Ports placeholders such as %%PREFIX%% and %%ETCDIR%% are substituted during packaging and must resolve to the paths used by your manual installation.

Sylve loads its required kernel modules during operational startup. If you enable Jails while RACCT is disabled, Sylve adds kern.racct.enable=1 to /boot/loader.conf; reboot once after that automatic change so the boot-time setting can take effect.

Once the service script and configuration are in place, enable Sylve at boot:

Terminal window
sysrc sylve_enable=YES

Start it immediately unless you still need to reboot for loader settings:

Terminal window
service sylve start

Open https://<your-server-ip>:8181 and sign in with the administrator credentials from config.json.

PortScopePurposeConfiguration
Public listeners
8181/tcpPublicHTTPS API and web UIPrimary browser and API endpoint.port
8182/tcpPublicHTTP API and web UIInsecure on untrusted networks; intended for controlled reverse-proxy setups.httpPort
Cluster transport
8180/tcpInternalRaftCluster membership and replicated control-plane state.Not configurable
8183/tcpInternalCluster SSHSecure channel for node-to-node operations.Not configurable
8184/tcpInternalCluster HTTPSNode control-plane traffic, including cluster joins.Not configurable
Peer discovery
7246/udpOptionalBitTorrent DHTPeer discovery for magnet downloads when DHT is enabled.btt.dht.port