Transfer performance
Direct slave data paths, pooled buffers, Linux sendfile support, TCP tuning, and TLS session resumption.
Open source / Version 1.3.0
Distributed FTP infrastructure built for fast transfers, race integrity, and hands-on site operations.
One control plane, many disks
WeaveFTPd separates authentication, policy, VFS, SITE commands, plugins, and race state from physical storage. In the default passthrough mode, encrypted data travels directly between the client and the selected slave.
Architecture
Choose direct passthrough for maximum throughput or proxy mode when storage nodes cannot be reached by clients.
Best throughput when slave passive ports are reachable. Secure FXP is supported with SSCN and PROT P.
Use when only the master is publicly reachable and storage nodes remain private.
Capabilities
Direct slave data paths, pooled buffers, Linux sendfile support, TCP tuning, and TLS session resumption.
SFV/CRC verification, X-DUPE handling, race stats, multi-disc naming, incomplete markers, and resilient retries.
TLS data channels, CA-backed master/slave mTLS, fail-closed slave authentication, ACLs, and IP masks.
Autonuke, pretime, release guard, requests, slowkick, spacekeeper, metadata, and dated directories.
Race announces, channel routing, FiSH encryption, TOP, requests, quota, free space, rules, and remote control.
Central VFS state across multiple roots, mounted archives, remerge controls, metadata snapshots, and routing policy.
Deploy
The guided Linux installer is the shortest path. Docker keeps master, sitebot, and slaves separated. Native Windows support lives on the separate windows beta branch and uses PowerShell plus pure-Go SQLite.
git clone https://github.com/WeaveFTPd/WeaveFTPd.git
cd WeaveFTPd
./setup.sh install
./weaveftpd
git clone https://github.com/WeaveFTPd/WeaveFTPd.git
cd WeaveFTPd/docker/deploy
./init.sh master
docker build --target daemon -t weaveftpd:latest ../..
docker build --target sitebot -t weaveftpd-sitebot:latest ../..
docker compose --env-file master.env \
-f master-sitebot.compose.yml up -d master sitebot
git clone https://github.com/WeaveFTPd/WeaveFTPd.git
cd WeaveFTPd
git switch windows
Set-ExecutionPolicy -Scope Process Bypass
.\setup.ps1 -Mode install -Config both
.\run-master.ps1
Operator guide / Version 1.3.0
The essential installation, security, networking, and maintenance guidance lives here. Use the wiki for the deeper plugin and command reference.
01 / Quick start
The guided installer creates missing configs, plugin files, certificates, and binaries while preserving existing live configuration.
git clone https://github.com/WeaveFTPd/WeaveFTPd.git
cd WeaveFTPd
./setup.sh install
./weaveftpd --config ./etc/config.yml
Before exposing the server: replace the example weaveftpd / weaveftpd login, set the public and passive addresses, and keep require_tls_control plus require_tls_data enabled.
Start from etc/config-example.yml. The master owns FTP control, authentication, ACLs, VFS state, SITE commands, routing, plugins, and race state.
Start from etc/config-slave-example.yml. A pure slave needs the daemon, its physical roots, client-facing TLS, and its connection to the master.
02 / Master and slave
FTP control always terminates on the master. The configured transfer mode decides whether payloads go directly to a slave or are relayed by the master.
Typical ports: the FTP control listener is configured with listen_port, slaves connect to master.control_port, and passthrough data uses each slave's pasv_port_min through pasv_port_max.
03 / Security and NAT
Every slave needs either its own mTLS identity or a source mask registered for that exact slave name. A global allowlist alone is not authentication.
Issue one certificate per slave. Its certificate Common Name must exactly equal slave.name, and the master certificate SAN must match slave.master_host.
./setup.sh certs "My Site"
./setup.sh slavecert SLAVE1
Leave the master/slave client-certificate settings empty and register the connecting public IP or CIDR before starting the slave.
SITE SLAVE SLAVE1 ADDMASK 203.0.113.20/32
Behind NAT: set slave.bind_ip to the public address, slave.local_bind_ip to the machine's LAN address, and forward the slave passive range to that LAN address.
Verification matters: a source-mask setup keeps the slave control link encrypted, but does not verify the master certificate. Use mTLS for both identities. Active/SSCN PROT P FXP data connections also use a legacy compatibility client that encrypts traffic without certificate-authenticating the data peer.
04 / Sitebot and FIFO
The daemon writes JSON-line events and the sitebot turns them into routed IRC output. Both processes must point to the exact same event_fifo path.
/app/etc directory.IRC TLS verification defaults to certificate checking. Use strict for a public CA or custom plus tls_ca_cert for a private CA. insecure keeps TLS encryption but accepts any server certificate, so use it only as an explicit legacy fallback.
05 / Docker and Windows
The deploy pack builds local images; no public container registry is required. It uses host networking for PASV/CPSV addresses, passive ranges, and FXP peer checks.
Run master and sitebot on the master host. Add the optional local-slave profile there, or initialize slave.compose.yml on another machine.
Switch to the separate windows branch. Its PowerShell setup can download Go when missing, generates certificates without OpenSSL, uses pure-Go SQLite on Windows, and creates console runner scripts.
Windows uses an append-only event file instead of a POSIX FIFO. Native services are intentionally outside the current setup scope.
06 / Config and updates
etc/config.ymletc/permissions.ymletc/users/sitebot/etc/config.ymlplugins/*/config.yml./setup.sh update
./setup.sh install
./setup.sh build
update uses git pull --ff-only. Commit, stash, or back up local tracked edits first. The installer adds missing config pieces without replacing existing active configs.
Reload or restart: use SITE REHASH for supported policy/config changes. Binary updates, listener ports, TLS paths, mode, control port, and FIFO changes require process restarts. Configure recurring scans under slaves[].remerge.jobs[]; removed legacy background/slave remerge keys are ignored.
07 / Commands and plugins
WeaveFTPd includes the core site workflows directly, while daemon and sitebot plugins add policy, metadata, automation, announces, and IRC commands.
Community project
Bug reports, deployment feedback, feature requests, and focused pull requests are welcome.