Skip to main content

pfSentinel

CI GitHub Release License Python Views

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):

Windows (pfs.exe) | Linux (pfs)

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

Apache 2.0

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)

Source distribution for pfsentinel 0.2.0
File Size Uploaded
pfsentinel-0.2.0.tar.gz 335.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pfsentinel 0.2.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

This release

0.2.0 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page