A simple utility to make creating and managing APT repositories on S3
Project description
pydeb-s3
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
.debfiles using the officialpython-debianlibrary - 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-timestampsflag, 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
--timestampsto enable or--no-timestampsto 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:
- Command-line options:
--access-key-id,--secret-access-key,--session-token - Environment variables:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_DEFAULT_REGION - AWS config file:
~/.aws/credentialsand~/.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 ACLprivate: private ACLauthenticated: authenticated-read ACLnil: 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
- Original deb-s3 by Ken Robertson
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32ef5c9bc2f631e82de78c7bd141564d240e1cdda5a5c547d14f1cbc006bd0ce
|
|
| MD5 |
e92ac8368a019051a3b46c7a4dd86196
|
|
| BLAKE2b-256 |
ccadbc8cf22b8a69250f9686b0fa37c22bcec1877ae6b58faf2611528d89b53f
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfe634ab92902cdd994bbaf8b0085e8641c60026936ed8a30c819c4e551ba4dd
|
|
| MD5 |
5bf596f1ece22d77ead48868562ada4d
|
|
| BLAKE2b-256 |
418b1eb52cb96784d0aefbabb3d7a08a676574c063c5ca39d36ab764534c5138
|