Local PyPI Server with caching and upload support
Project description
PyPihub - Local PyPI Server
PyPihub is a simple local PyPI server with caching and package upload capabilities. This server allows you to host your Python packages locally, cache packages from the official PyPI, and supports package uploads via twine.
This version uses Flask. If you install via pip, use: pip install pypihub[flask]
Key Features
- Multi-platform: Supports any platform (Linux, Windows, Mac, etc.)
- Local Package Hosting: Host your own Python packages locally
- PyPI Caching: Automatic caching of packages from official PyPI for faster access
- Twine Support: Upload packages using
twinewith authentication - Web Interface: Simple web interface for browsing packages
- Flexible Configuration: Configuration via INI files, environment variables, or command arguments
Installation
Requirements
pip install flask beautifulsoup4 requests pydebugger configset rich rich-argparse pathlib
Download and Setup
git clone <repository-url>
cd pypihub
Or you can install with pip:
$ pip install pypihub[flask]
Configuration
1. Configuration File (pypihub.ini)
Create a pypihub.ini as an alternative config file, or it will be created automatically in the same directory as pypihub.py:
[dirs]
base = /path/to/base/directory
local_pkg = /path/to/local/packages
cache = /path/to/cache
[urls]
pypi_simple = https://pypi.org/simple
[server]
host = 0.0.0.0
port = 5000
[auths]
users = pypihub,pypihub;user2,pass2
2. Settings File (settings.py)
Alternatively, create a settings.py file (see example below):
BASE_DIR = "/path/to/base"
LOCAL_PKG_DIR = "/path/to/packages"
CACHE_DIR = "/path/to/cache"
PYPI_SIMPLE_URL = "https://pypi.org/simple"
HOST = "0.0.0.0"
PORT = 5000
AUTHS = [("pypihub", "pypihub"), ("user2", "pass2")]
CONFIGFILE = "pypihub.ini"
3. Environment Variables
export BASE_DIR="/path/to/base"
export LOCAL_PKG_DIR="/path/to/packages"
export CACHE_DIR="/path/to/cache"
export PYPI_SIMPLE_URL="https://pypi.org/simple"
export HOST="0.0.0.0"
export PORT="5000"
export CONFIGFILE="pypihub.ini"
Usage
Running the Server
# Using default settings
python pypihub.py
# With custom configuration
# Option: '-c /path/to/config.ini'
python pypihub.py -c /path/to/config.ini -H 127.0.0.1 -P 8080
# Verbose mode
python pypihub.py -v
# Show help
python pypihub.py -h
Command Line Arguments
-c, --config Path to configuration file
-b, --base-dir Base directory for server
-l, --local-pkg-dir Directory for local packages
-C, --cache-dir Directory for cached packages
-p, --pypi-simple-url PyPI simple index URL
-H, --host Host to run server on
-P, --port Port to run server on
-V, --version Show PyPihub version
-v, --verbose Enable verbose output
Package Upload
Using Twine
- Configure ~/.pypirc:
[distutils]
index-servers = pypihub
[pypihub]
repository = http://localhost:5000/
username = pypihub
password = pypihub
- Upload package:
# Build package first
python setup.py sdist bdist_wheel
# Upload to pypihub
twine upload --repository pypihub dist/*
Manual Upload via HTTP
curl -X POST \
-u pypihub:pypihub \
-F "file=@package-1.0.0-py3-none-any.whl" \
http://localhost:5000/upload/package-name/
Installing Packages from PyPihub
Configure pip
Add to ~/.pip/pip.conf (Linux/Mac) or %APPDATA%\pip\pip.ini (Windows):
[global]
extra-index-url = http://localhost:5000/simple/
trusted-host = localhost
Install Package
# Install from pypihub (with fallback to PyPI)
pip install package-name
# Install only from pypihub
pip install --index-url http://localhost:5000/simple/ package-name
# Install with extra index
pip install --extra-index-url http://localhost:5000/simple/ package-name
API Endpoints
Web Interface
GET /- Main page with list of local packages
Package Management
POST /upload/<package>/- Upload package (with auth)POST /upload/- Upload package via twine (with auth)GET /packages/<package>/<filename>- Serve local package filesGET /cache/<package>/<filename>- Serve cached package files
Package Index
GET /simple/<package>/- Simple index for specific package
Directory Structure
pypihub/
├── pypihub.py # Main application
├── pypihub.ini # Configuration file (optional)
├── settings.py # Settings file (optional)
├── packages/ # Local packages directory
│ └── package-name/
│ ├── package-1.0.0.tar.gz
│ └── package-1.0.0-py3-none-any.whl
├── cache/ # Cached packages from PyPI
│ └── requests/
│ └── requests-2.28.1-py3-none-any.whl
└── logs/ # Log files (if configured)
Authentication
Default credentials:
- Username:
pypihub - Password:
pypihub
Change the default credentials before using in production.
To change credentials, edit configuration in settings.py, pypihub.ini, or environment variables.
Logging
PyPihub uses custom logging with levels:
- EMERGENCY
- CRITICAL
- ERROR
- WARNING
- NOTICE
- INFO
- DEBUG
Set verbose mode with -v for debug logging.
Troubleshooting
Package not found
- Ensure package exists in local directory or is available on PyPI
- Check
PYPI_SIMPLE_URLconfiguration
Upload failed
- Check authentication credentials
- Ensure
LOCAL_PKG_DIRdirectory is writable - Check if file already exists (409 error)
Cache not working
- Ensure
CACHE_DIRdirectory is writable - Check internet connection for downloading from PyPI
Port already in use
- Change port with
-Pparameter or configuration - Check processes using port:
lsof -i :5000
Development
Dependencies
- Flask - Web framework
- BeautifulSoup4 - HTML parsing
- Requests - HTTP client
- Rich - Console output formatting
- ConfigSet - Configuration management
- PyDebugger - Debug utilities
Contributing
- Fork repository
- Create feature branch
- Commit changes
- Push to branch
- Create Pull Request
- Describe your changes in the Pull Request.
License
PyPihub is released under the GNU Lesser General Public License v3.0 (LGPL-3.0).
You should have received a copy of the GNU Lesser General Public License along with this program.
If not, see https://www.gnu.org/licenses/.
For commercial licensing options, please contact: cumulus13@gmail.com
Support
For issues and questions, please create/open an issue in the repository or contact cumulus13@gmail.com.
PyPihub - Simplifying local Python package management
Warning: Do not expose this server to the public internet without proper authentication and security measures.
Author
Project details
Release history Release notifications | RSS feed
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 pypihub-0.18.tar.gz.
File metadata
- Download URL: pypihub-0.18.tar.gz
- Upload date:
- Size: 19.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63419960bd4bb75725b912d3ba95cd7297bcc5cfcb87fc22d95833e7c01e99f4
|
|
| MD5 |
9b1292427dfbe11755dbe6e1fc6ba8b2
|
|
| BLAKE2b-256 |
8651906fd5d6b40ae71b8acb235c61b960fe441263bc6ae33654ea8dfcef59bf
|
File details
Details for the file pypihub-0.18-py3-none-any.whl.
File metadata
- Download URL: pypihub-0.18-py3-none-any.whl
- Upload date:
- Size: 16.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af8ec3659b1724584f5eced0ac4e8b34c57882bf0cdfdd354f4167de8b2dcf2b
|
|
| MD5 |
33bc2293cdda415b4f1b3bf97247340b
|
|
| BLAKE2b-256 |
4df54dd496986f8119f2b952f7268cd5a44c27b74063629ff8c1168b3bd7eb78
|