Skip to main content

A simple utility to make creating and managing APT repositories on S3

Project description

pydeb-s3

PyPI version License Python versions GitHub stars

pydeb-s3 is a Python port of deb-s3, a simple utility to make creating and managing APT repositories on S3.

Most existing guides on using S3 to host an APT repository have you using something like reprepro to generate the repository file structure, and then s3cmd to sync the files to S3.

The annoying thing about this process is it requires you to maintain a local copy of the file tree for regenerating and syncing the next time. Personally, my process is to use one-off virtual machines with Vagrant, script out the build process, and then would prefer to just upload the final .deb from my Mac.

With pydeb-s3, there is no need for this. pydeb-s3 features:

  • Downloads the existing package manifest and parses it.
  • Updates it with the new package, replacing the existing entry if already there or adding a new one if not.
  • Uploads the package itself, the Packages manifest, and the Packages.gz manifest. It will skip the uploading if the package is already there.
  • Updates the Release file with the new hashes and file sizes.

Updated Features

pydeb-s3 has been rewritten in Python with modern tooling and additional capabilities:

  • Parses .deb files using the official python-debian library
  • Updates package manifests, replacing existing entries or adding new ones
  • Uploads packages, Packages manifest, and compressed manifests (.gz, .bz2, .xz)
  • Updates Release file with new hashes and file sizes
  • GPG signing of Release files for secure APT repositories
  • S3-compatible storage support (AWS S3, Google Cloud Storage, MinIO, etc.)
  • Concurrent operation locking to prevent conflicting uploads
  • Dry-run mode for clean/verify operations
  • Configurable timestamps with --timestamps/--no-timestamps flag, auto-detects TTY for clean interactive output
  • Modern CLI with Typer, featuring help text and shell completion

Installation

Install via pip:

$ pip install pydeb-s3

For isolated installation, use pipx:

$ pipx install pydeb-s3

Quick Start

Upload a package to S3:

$ pydeb-s3 upload --bucket my-bucket my-deb-package-1.0.0_amd64.deb

For S3-compatible endpoints (e.g., Google Cloud Storage, MinIO):

$ pydeb-s3 upload --bucket my-bucket \
    --endpoint https://storage.googleapis.com \
    --checksum-when-required \
    --visibility nil \
    my-deb-package-1.0.0_amd64.deb

Usage

pydeb-s3 provides the following commands:

$ pydeb-s3 --help
Usage: pydeb-s3 [OPTIONS] COMMAND [ARGS]...

  Easily create and manage an APT repository on S3

Options:
  --quiet                         Only show errors
  --debug                         Enable debug output
  --timestamps / --no-timestamps  Enable/disable timestamps (auto-detects TTY
                                  by default)
  --install-completion            Install completion for the current shell.
  --show-completion               Show completion for the current shell, to
                                  copy it or customize the installation.
  --help                          Show this message and exit.

Commands:
  upload   Upload the given files to a S3 bucket as an APT repository.
  list     List packages in given codename, component, and optionally architecture.
  show     Show information about a package.
  exists   Check if a package exists in the repository.
  copy     Copy a package to another codename and component.
  delete   Remove a package from the repository.
  verify   Verify that the files in the package manifests exist.
  clean    Remove orphaned package files.

For detailed options per command, run pydeb-s3 <command> --help.

Output Control

pydeb-s3 provides control over log output:

  • Timestamps: Use --timestamps to enable or --no-timestamps to disable timestamp prefixes
  • Auto-detection: By default, timestamps are automatically disabled when output is a terminal (TTY) for cleaner interactive use, and enabled when output is piped or redirected for logging purposes
  • Log format: When timestamps are enabled, loguru's default format is used (includes timestamp with milliseconds, level, and source location)

Common Command Examples

List packages

$ pydeb-s3 list --bucket my-bucket --codename stable

Show package info

$ pydeb-s3 show mypackage --bucket my-bucket --version 1.0.0

Check if package exists

$ pydeb-s3 exists mypackage --bucket my-bucket --version 1.0.0

Copy package to another codename

$ pydeb-s3 copy mypackage --bucket my-bucket --to-codename jammy --to-component main

Verify repository integrity

$ pydeb-s3 verify --bucket my-bucket --fix-manifests

Clean orphaned packages (dry-run first!)

$ pydeb-s3 clean --bucket my-bucket --dry-run
$ pydeb-s3 clean --bucket my-bucket  # Actually remove orphans

Configuration

AWS Credentials

pydeb-s3 uses standard boto3 credential resolution:

  1. Command-line options: --access-key-id, --secret-access-key, --session-token
  2. Environment variables: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION
  3. AWS config file: ~/.aws/credentials and ~/.aws/config

S3 Bucket

The --bucket option is required for all commands. Use --prefix to add a path prefix to all S3 objects.

Visibility / ACL

Control uploaded file permissions with --visibility:

  • public (default): public-read ACL
  • private: private ACL
  • authenticated: authenticated-read ACL
  • nil: No ACL (for S3-compatible storage that doesn't support ACLs)

GPG Signing

Sign Release files with --sign <KEY_ID>. You can specify multiple keys if needed (though repeatable --sign is limited by Typer version constraints).

Development

pydeb-s3 uses hatch for packaging and dependency management.

License

MIT License - see LICENSE file for details.

Credits

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

pydeb_s3-0.6.0.tar.gz (24.5 kB view details)

Uploaded Source

Built Distribution

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

pydeb_s3-0.6.0-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

Details for the file pydeb_s3-0.6.0.tar.gz.

File metadata

  • Download URL: pydeb_s3-0.6.0.tar.gz
  • Upload date:
  • Size: 24.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.13.13 HTTPX/0.28.1

File hashes

Hashes for pydeb_s3-0.6.0.tar.gz
Algorithm Hash digest
SHA256 32ef5c9bc2f631e82de78c7bd141564d240e1cdda5a5c547d14f1cbc006bd0ce
MD5 e92ac8368a019051a3b46c7a4dd86196
BLAKE2b-256 ccadbc8cf22b8a69250f9686b0fa37c22bcec1877ae6b58faf2611528d89b53f

See more details on using hashes here.

File details

Details for the file pydeb_s3-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: pydeb_s3-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.13.13 HTTPX/0.28.1

File hashes

Hashes for pydeb_s3-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dfe634ab92902cdd994bbaf8b0085e8641c60026936ed8a30c819c4e551ba4dd
MD5 5bf596f1ece22d77ead48868562ada4d
BLAKE2b-256 418b1eb52cb96784d0aefbabb3d7a08a676574c063c5ca39d36ab764534c5138

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