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 Test Coverage

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

Under the hood? Just good old rsync โ€” no magic, just sharp automation.

  • Simple config. Sharp execution. Safe data.
  • Use them one by one, or sync them all 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. Sync โ€” Run Fetch and Backup together in one go
  4. Init โ€” Generate an initial config file (fnb.toml)
  5. 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 pip install -e .

Requirements: Python 3.12 or higher is required.


๐Ÿงฐ 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

# Run Fetch โ†’ Backup in one go
fnb sync TARGET_LABEL

# Check version
fnb version

# Logging and Verbosity Control
# Adjust log level for detailed output
fnb fetch TARGET_LABEL --log-level DEBUG
fnb sync TARGET_LABEL --verbose      # Same as --log-level DEBUG
fnb backup TARGET_LABEL --quiet      # Same as --log-level WARNING

# Log files are automatically saved to:
# macOS: ~/Library/Logs/fnb/fnb.log
# Linux: ~/.local/share/fnb/fnb.log

๐Ÿ”ง Configuration

fnb uses TOML configuration files with sections for fetch and backup 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

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
  4. ./config/*.toml โ€” Split configuration for development/operations

๐Ÿ“Š Logging

fnb includes built-in structured logging powered by loguru. All operations are logged with configurable verbosity levels.

Log Levels

  • DEBUG โ€” Detailed debugging information, command traces, and internal state
  • INFO โ€” General operational information, task progress, success/failure messages (default)
  • WARNING โ€” Important notices, non-critical issues, fallback actions
  • ERROR โ€” Error conditions, operation failures, critical issues

Log Output

Console Output (stderr)

  • Colored, structured format with timestamps
  • User-facing messages on stdout (status, progress)
  • Internal logging on stderr (debug, technical details)

Log Files (automatic)

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

File Log Management

  • Rotation: Automatic rotation when files reach 10MB
  • Retention: Keeps logs for 7 days
  • Compression: Old logs compressed with gzip
  • Disable: Set FNB_DISABLE_FILE_LOGGING=1 to disable file logging

Command Examples

# Default INFO level logging
fnb sync logs

# Verbose debugging output
fnb fetch logs --verbose
fnb sync logs --log-level DEBUG

# Quiet mode (warnings and errors only)
fnb backup logs --quiet
fnb fetch logs --log-level WARNING

# Custom log level
fnb sync logs --log-level ERROR

๐Ÿ” Authentication

SSH password input can be automated using pexpect. You can also define connection settings in a .env file if needed. Run fnb init env to create the initial .env file.


๐Ÿ†• What's New in v0.13.0

๐Ÿ›ก๏ธ Reliability Fixes

  • Failures are no longer silently swallowed - fetch/backup/sync now exit with code 1 on rsync failure instead of always reporting success
  • sync stops before backup if fetch fails - prevents an incomplete local copy from overwriting or deleting good data on the backup target
  • --config auto-detection unified - fetch and backup now discover the config file the same way status and sync already did
  • .env template fixed - fnb init env now generates FNB_PASSWORD_* (was RFB_PASSWORD_*, which the code never read)

โšก Faster CI

  • Pipeline cut from ~183s to ~43s - verification jobs now run in parallel instead of sequential stages

๐Ÿ› ๏ธ Development Workflow Improvements (v0.12.3)

  • Restructured Task File - Reorganized task definitions following standardized pattern for better organization and clarity
  • Enhanced Task Management - New convenience tasks: env:setup, env:clean, status, log, push, push:tags, push:release
  • Improved Type Safety - Fixed type checking issues in options.py for stricter type compliance
  • Dependency Updates - Updated 68 packages to latest versions

๐Ÿ“š Expanded Documentation (v0.12.3)

  • Release Note Templates - New docs:release task for structured release documentation
  • Version Management - Simplified with bump:auto, bump:patch, bump:minor, bump:major commands
  • Release Notes Structure - vX.Y.Z release notes in docs/releases/ with comprehensive information

๐Ÿ“– ReadTheDocs Documentation Platform Integration (v0.11.2)

  • Versioned Documentation - Automatic documentation builds for each Git tag
  • Multi-format Output - HTML, EPUB, and HTMLZip formats available
  • Version Selector - Easy switching between documentation versions
  • Public Documentation - Professional documentation hosting at https://fnb.readthedocs.io/

๐Ÿ”ง Enhanced Documentation Infrastructure (v0.11.2)

  • Automated Builds - Documentation automatically builds on tag push
  • Material Theme Support - Full mkdocs-material compatibility with ReadTheDocs
  • Stable URLs - Each version accessible at predictable URLs
  • Search Integration - Full-text search across all versions

๐Ÿงช Development

  • Python 3.12+ โ€” Version requirement
  • uv โ€” Package management
  • Typer โ€” CLI framework
  • Pydantic โ€” Configuration validation
  • pexpect โ€” SSH automation
  • python-dotenv โ€” Environment variable support
  • pytest โ€” Testing framework (80% coverage)
  • mkdocs-material โ€” Documentation with i18n support
  • pre-commit โ€” Run checks before each commit
  • ruff โ€” Fast Python linter and formatter
  • commitizen โ€” Conventional commit tagging and changelog automation
  • renovate โ€” Automated dependency management

Release Management

This project uses automated semantic versioning with structured release workflow:

Complete Release Workflow

Option 1: Automated Full Release (v0.12.3)

task release:full  # test โ†’ format โ†’ bump โ†’ release

Option 2: Step-by-Step Release (New in v0.12.3)

# Step 1: Verify changes and run tests
task test:ci           # Run all tests and checks

# Step 2: Preview and execute version bump
task bump:check        # Preview version changes
task bump:patch        # Bump patch version (or bump:minor/bump:major)

# Step 3: Create release notes from template
task docs:release -- X.Y.Z  # Create vX.Y.Z.md from template
# Edit docs/releases/vX.Y.Z.md with detailed release information

# Step 4: Commit release notes
git add docs/releases/vX.Y.Z.md mkdocs.yml
git commit -m "docs: add vX.Y.Z release notes"

# Step 5: Push release to GitLab with notes file
task push:release -- X.Y.Z  # Creates GitLab release with release notes

# Step 6: Verify TestPyPI deployment (automatic on tag push)
VERSION=X.Y.Z task verify:testpypi

# Step 7: Production PyPI deployment (when ready)
task publish:prod

Release Timeline

  1. Code Changes โ†’ Commit with conventional commit format
  2. Version Bump โ†’ task version:bump creates tag and updates files
  3. Tag Push โ†’ task release pushes tags and creates GitLab release
  4. TestPyPI Deploy โ†’ Automatic CI deployment on tag push
  5. Release Notes โ†’ Manual creation of detailed release documentation
  6. Documentation โ†’ Update navigation and release index
  7. PyPI Deploy โ†’ Manual production deployment when ready

Current Version: v0.13.0 - View Release

CI/CD Pipeline

GitLab CI/CD pipeline provides automated testing, building, and deployment. Verification jobs (test, code-quality, docs-quality, build-package) run in parallel rather than in sequential stages, cutting typical pipeline time from ~183s to ~43s.

Stages:

  • renovate: Automated dependency management (optional)
  • test: Unit tests, code quality, Renovate-specific tests (each job syncs only the dependencies it needs)
  • docs-quality: Documentation build validation โ€” skipped on MRs that don't touch docs-related files
  • build: Package building with uv build (no virtual environment needed)
  • deploy-test: TestPyPI deployment (automatic on tag push) ๐Ÿš€
  • deploy-prod: PyPI deployment (manual approval for safety)

Automated Workflows:

# Deployment (v0.10.0)
tag push โ†’ [Auto TestPyPI] โ†’ Local Verification โ†’ [Manual PyPI]

# Dependency Management (v0.11.0)
Monday 6am JST โ†’ [Renovate Scan] โ†’ [Auto MR] โ†’ [Enhanced Testing]

Optional CI Variables:

# GitLab Settings โ†’ CI/CD โ†’ Variables
TESTPYPI_API_TOKEN  # TestPyPI API token for testing releases
PYPI_API_TOKEN      # PyPI API token for production releases
RENOVATE_TOKEN      # GitLab token for automated dependency updates (new in v0.11.0)

Local CI Simulation:

# Run tests as they run in CI (unit tests only)
task test:ci

# Run unit tests only (fast feedback)
task test:unit

# Run integration tests only
task test:integration

# Run all tests
task test

# Verify TestPyPI deployment
VERSION=0.12.3 task verify:testpypi

# Dependency management tasks (new in v0.11.0)
task deps:update    # Update all dependencies
task deps:test      # Test with updated dependencies
task deps:security  # Check for security vulnerabilities

Test Structure

Tests are organized into two directories for optimal development workflow:

  • tests/unit/: 9 files, 124 tests - Fast unit tests (1.65s)
  • tests/integration/: 1 file, 23 tests - Comprehensive workflow tests (3.25s)

Both directory-based and marker-based execution are supported:

# Directory-based (recommended)
task test:unit          # tests/unit/ only
task test:integration   # tests/integration/ only

# Marker-based (backward compatibility)
pytest -m "not integration"  # unit tests
pytest -m "integration"      # integration tests

Test Coverage

Current test coverage is 80% with comprehensive error handling and integration testing:

  • Unit Tests: 124 tests covering all modules
  • Integration Tests: 23 tests covering complete workflows
  • Test Execution: ~0.61s for unit tests, full test suite in <5s

See CLAUDE.md for detailed test structure and module-level coverage information.

๐Ÿชช License

MIT

๐Ÿ› ๏ธ Contributing

This project is maintained in two repositories:

  • ๐Ÿ› ๏ธ Development, Issues, Merge Requests: GitLab
  • ๐ŸŒ Public Mirror and Discussions: GitHub
  • ๐Ÿ“ฆ PyPI Package: fnb
  • ๐Ÿ“– Documentation: ReadTheDocs with versioned documentation
  • ๐Ÿ“– Legacy Docs: GitLab Pages (maintained for reference)

Please use GitLab for development contributions, bug reports, and feature requests. For documentation viewing and community discussions, feel free to visit the GitHub mirror.

Development Workflow

See CLAUDE.md for detailed development guidelines including:

  • Testing and coverage requirements (80%+)
  • Version management and release workflow
  • GitLab integration best practices

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.13.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.13.0-py3-none-any.whl (36.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for fnb-0.13.0.tar.gz
Algorithm Hash digest
SHA256 c8f3bb5a22a41fec779adaf305f4dc283b3639274b40155d93b54e60956a6a74
MD5 17146ae536b8b12c9501529ffb60a64a
BLAKE2b-256 f16b950871997227dff44892043ac932c2c1bab68cd65c161aeb2568487b7b5f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fnb-0.13.0-py3-none-any.whl
  • Upload date:
  • Size: 36.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for fnb-0.13.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d0d29258fc0aa854bbeeaf845bfd2c539f20c484e4007f4a0c79d5798c576314
MD5 5efe9cb63ffc2d3d407e530f16b3fcaa
BLAKE2b-256 62e7c374d2aef67d80097650615039961d52cfedaf3a6b5682fc9b94edef16b5

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