pfSentinel
Automated backup and monitoring tool for pfSense firewalls. Built for homelabs.
pfSentinel connects to your pfSense devices over SSH or HTTPS and backs up configuration files, RRD data, package configs, DHCP leases, certificates, logs, ZFS snapshots, and full filesystem archives. It includes change detection, compression, scheduled backups, and notifications via Telegram, Slack, or Windows toast.
A Word From the Developer
I was looking for a feature-rich, modern pfSense backup tool and only found projects that were no longer maintained. Since pfSense backups are part of my own homelab backup infrastructure, I decided to build pfSentinel and share it with the pfSense community.
If you have a request or an idea, I'd love to hear it, please open a feature request. You can also reach me on LinkedIn or through my website.
Features
- Full config backup via SSH (SFTP) or HTTPS with CSRF-aware login
- Extended backup targets -- RRD graphs, package configs, DHCP leases, alias files, certificates, system logs
- ZFS snapshots with incremental send (pfSense 2.5+)
- Filesystem archives (tar.gz) as a non-ZFS fallback
- Change detection -- only saves when config sections actually change
- SHA-256 verification for every backup file
- Scheduled backups via Windows Task Scheduler, systemd user timers or cron
- Notifications -- Telegram, Slack, Windows toast
- SSH key authentication -- no password required
- Strict SSH host key checking -- confirm the pfSense key once (
pfs device trust-key); a changed key is refused - Credential security -- passwords in the OS keyring (or an AES-256-GCM encrypted store on headless systems), never in config files
- Self-update -- check for and install new releases from GitHub
- Cross-platform -- Windows and Linux (macOS best effort)
- Reproducible CI -- lint, tests, security audit and build defined with Dagger, so the same pipeline runs on your machine and in GitHub Actions; hash-verified lockfiles and SHA-pinned Actions
Quick Start
Download a pre-built binary (no Python required):
Or install from PyPI (Python 3.13+), same command on Linux and Windows:
pipx install pfsentinel
Plain pip install pfsentinel also works in a virtualenv or on Windows; on Ubuntu 23.04+ and Debian 12+ the system Python blocks it, so use pipx there.
Then:
pfs setup # guided first-time wizard
pfs device add # add your pfSense device
pfs backup run # run your first backup
See the Installation Guide for all installation methods.
Documentation
| Document | Description |
|---|---|
| Online manual | Every command, recipes, and a copy-paste version for AI assistants (pfs docs) |
| Installation Guide | pip, pre-built binary, and from-source installation |
| Usage Guide | CLI reference, configuration, scheduling, notifications |
| Extended Backups | RRD, packages, DHCP, certs, logs, ZFS, archives |
| Security Policy | Vulnerability reporting, design decisions, credential storage |
| Contributing | Development setup, code style, pull requests |
| CI with Dagger | Run the CI pipeline locally |
| Roadmap | Path to 1.0 and what is planned |
| Changelog | Version history |
What Gets Backed Up
| Target | Method | Description |
|---|---|---|
| XML Config | SSH / HTTPS | Full pfSense configuration (config.xml) |
| RRD Data | SSH | Traffic and performance graphs |
| Package Configs | SSH | Installed package settings |
| DHCP Leases | SSH | Active DHCP lease table |
| Alias Files | SSH | URL tables and external alias files |
| Certificates | SSH | SSL/TLS certs from the filesystem |
| System Logs | SSH | Filter log, system log, custom log files |
| ZFS Snapshot | SSH | Full or incremental ZFS snapshot stream |
| Filesystem Archive | SSH | Tar archive of critical directories |
Third-Party Credits
pfSentinel is built on these open-source libraries:
| Library | License | Purpose |
|---|---|---|
| Typer | MIT | CLI framework |
| Rich | MIT | Terminal formatting |
| Pydantic | MIT | Data validation |
| Paramiko | LGPL-2.1 | SSH/SFTP connections |
| cryptography | Apache-2.0 / BSD-3-Clause | SSH key handling |
| Requests | Apache-2.0 | HTTP client |
| Packaging | Apache-2.0 / BSD-2-Clause | Version parsing |
Paramiko is the only runtime dependency with a copyleft license (LGPL-2.1). When installed via pip, users can freely replace it. For binary releases, pfSentinel uses --onedir bundling so Paramiko remains replaceable. See docs/LICENSE_AUDIT.md for the full dependency license audit.
Contributing
Contributions are welcome! Please read the Contributing Guide before submitting a pull request.
If you find a bug or have a feature request, open an issue.
Support
pfSentinel is free and open source. If it saves you time or you'd like to support continued development, you can sponsor on GitHub or buy me a coffee. Thank you!
License
Release files for pfsentinel 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pfsentinel-0.2.0.tar.gz | 335.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pfsentinel-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 440.1 kB
Release files / pfsentinel-0.2.0.tar.gz
| Download URL | pfsentinel-0.2.0.tar.gz |
|---|---|
| Size | 335.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee183771b925972d6c7c8f87555d1ff17462080f160d3509ac6300c8f05b6c49
|
|
BLAKE2b-256 checksum How to use checksums |
2ced6b9c74ecaa08c4dc1fbba542a69f3ba41d06bef264026524b3bbfc1d7371
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / pfsentinel-0.2.0-py3-none-any.whl
| Download URL | pfsentinel-0.2.0-py3-none-any.whl |
|---|---|
| Size | 104.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2746696cbc57b9f00b21ac93d87ad366ee76e98479bea94f140ecea63cec696b
|
|
BLAKE2b-256 checksum How to use checksums |
f9744f521ab45d080fb398098f7de81e9cc37b4c7562eb021547d4b04bdf8d4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log