Skip to main content

Fetch'n'Backup - Simple two-step backup tool with rsync

Project description

fnb — Fetch'n'Backup

PyPI version Python 3.12+ License: MIT

fnb is a simple backup tool, powered by rsync. It gives you three handy commands: fetch (to pull from remote), backup (to save to somewhere safe), and upload (to push to remote).

Under the hood? Just good old rsync — no magic, just sharp automation.

  • Simple config. Sharp execution. Safe data.
  • Run fetch, backup, or upload on their own, or sync fetch + backup in one go.

🚀 Features

  1. Fetch — Retrieve data from a remote server to your local machine
  2. Backup — Save local data to external storage
  3. Upload — Push local data to a remote server
  4. Sync — Run Fetch and Backup together in one go
  5. Init — Generate an initial config file (fnb.toml)
  6. Structured Logging — Built-in logging with configurable verbosity levels and file output

⚙️ Installation

From PyPI (Recommended)

pip install fnb
# または
uv pip install fnb

From Source

git clone https://gitlab.com/qumasan/fnb.git
cd fnb
uv sync --all-groups
uv run fnb --help

Requirements: Python 3.12 or higher is required.

See the full Installation Guide for more options, including running from source without installing.


🧰 Quick Start

# Initialize configuration files (fnb.toml and .env files)
fnb init

# Check the current config
fnb status

# Fetch: remote -> local
fnb fetch TARGET_LABEL

# Backup: local -> external
fnb backup TARGET_LABEL

# Upload: local -> remote
fnb upload TARGET_LABEL

# Run Fetch → Backup in one go
fnb sync TARGET_LABEL

# Check version
fnb version

🔧 Configuration

fnb uses TOML configuration files with sections for fetch, backup, and upload operations:

[fetch.SECTION_NAME]
label = "TARGET_LABEL"
summary = "Fetch data from remote server"
host = "user@remote-host"
source = "~/path/to/source/"
target = "./local/backup/path/"
options = ["-auvz", "--delete", '--rsync-path="~/.local/bin/rsync"']
enabled = true

[backup.SECTION_NAME]
label = "TARGET_LABEL"
summary = "Backup data to cloud storage"
host = "none"          # Local operation
source = "./local/backup/path/"  # Output from fetch
target = "./cloud/backup/path/"
options = ["-auvz", "--delete"]
enabled = true

[upload.SECTION_NAME]
label = "TARGET_LABEL"
summary = "Upload data to remote server"
host = "user@remote-host"          # host describes the target here, not the source
source = "./local/backup/path/"
target = "~/path/to/destination/"
options = ["-auvz", "--delete"]
enabled = true

Configuration File Priority (highest to lowest)

  1. ./fnb.toml — Project-local configuration
  2. ~/.config/fnb/config.toml — Global user configuration (XDG standard)
  3. C:\Users\username\AppData\Local\fnb\config.toml — Windows global configuration

📊 Logging

fnb includes built-in structured logging powered by loguru. All CLI commands support --log-level, --verbose (same as --log-level DEBUG), and --quiet (same as --log-level WARNING).

fnb fetch TARGET_LABEL --verbose
fnb backup TARGET_LABEL --quiet
fnb upload TARGET_LABEL --quiet
fnb sync TARGET_LABEL --log-level DEBUG

User-facing messages go to stdout; debug/technical logs go to stderr and are also saved to a rotating log file:

  • macOS: ~/Library/Logs/fnb/fnb.log
  • Linux: ~/.local/share/fnb/fnb.log
  • Windows: %APPDATA%\qumasan\fnb\Logs\fnb.log

Set FNB_DISABLE_FILE_LOGGING=1 to disable file logging.


🔐 Authentication

SSH password input can be automated using pexpect. You can also define connection settings (e.g. FNB_PASSWORD_*, FNB_TIMEOUT) in a .env file if needed. Run fnb init env to create the initial .env file.

On macOS, fnb also checks the Keychain for a fnb-{host} password item before falling back to FNB_PASSWORD_DEFAULT, so you can avoid storing passwords in plain text:

security add-generic-password -s "fnb-user@remote-host" -a "user@remote-host" -w "your-password"

On any platform, fnb can also read a GPG-encrypted password file from ~/.config/fnb/passwords/{host}.gpg (or default.gpg):

mkdir -p ~/.config/fnb/passwords
echo -n "your-password" | gpg --symmetric -o ~/.config/fnb/passwords/user_remote_host.gpg

See the Security Guide for details and other authentication options (SSH keys, dotenvx encryption).


🪪 License

MIT


🔗 Links

  • 🛠️ Development, Issues, Merge Requests: GitLab — please use GitLab for development contributions, bug reports, and feature requests
  • 🌏 Public Mirror and Discussions: GitHub
  • 📦 PyPI Package: fnb
  • 📖 Documentation: ReadTheDocs — installation, configuration, Contributor Guide, and Maintainer Guide
  • 📝 Release Notes: docs/releases/

See CLAUDE.md for detailed development guidelines (testing, linting, release workflow).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fnb-0.18.0.tar.gz (1.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fnb-0.18.0-py3-none-any.whl (43.4 kB view details)

Uploaded Python 3

File details

Details for the file fnb-0.18.0.tar.gz.

File metadata

  • Download URL: fnb-0.18.0.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fnb-0.18.0.tar.gz
Algorithm Hash digest
SHA256 70f5d10efcb9115b00f5aa977a6fa00220c4129ea06118b85bc9d5e0b51a09fa
MD5 447982e2e7eb1ba1d8bb5803083c7871
BLAKE2b-256 b1c84ce15d70d8a7fdb22138ea290d490ba0008431c0fc7d46539d5fd85a5368

See more details on using hashes here.

File details

Details for the file fnb-0.18.0-py3-none-any.whl.

File metadata

  • Download URL: fnb-0.18.0-py3-none-any.whl
  • Upload date:
  • Size: 43.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fnb-0.18.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8d90919fcf54111da8cc1713ad86bcd0cfd9410d40c276108d5b8b23e6572e2f
MD5 6b9037c6e9ab6db28876824b51481613
BLAKE2b-256 4edd1d560996620ee4a35128201ca2872f29bb916bf2e3cf5bef2b29a4a2af4d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page