Skip to content

Private PyPI Registry (CI/CD Setup)

Private PyPI Registry (DevPI) — Usage Guide

Section titled “Private PyPI Registry (DevPI) — Usage Guide”

Registry URL: https://pypi.registry.hochguertel.work Auth: Authentik OIDC (browser) + Authentik API tokens (CLI) Container: registry-pypi

DevPI Registry Auth Architecture

  • Browser login: Authentik OIDC — native DevPI plugin redirects to Authentik
  • CLI/CI login: Authentik API token as password — plugin validates against Authentik API
  • Indexes: root/pypi (public mirror) + root/dev (private uploads, bases: root/pypi)
IndexPurposeUpload
root/pypiPublic PyPI mirrorRead-only
root/devPrivate packages:developers, :admins
Terminal window
# From private index (includes both private + public)
pip install --index-url https://pypi.registry.hochguertel.work/root/dev/+simple/ <package>
uv pip install --index-url https://pypi.registry.hochguertel.work/root/dev/+simple/ <package>
Terminal window
uv build
uv publish \
--publish-url https://pypi.registry.hochguertel.work/root/dev/ \
--username infra \
--password <api-token>
~/.pypirc
[hochguertel]
repository = https://pypi.registry.hochguertel.work/root/dev/
username = infra
password = <api-token>
Terminal window
twine upload --repository hochguertel dist/*
- name: Publish to DevPI
run: |
uv build
uv publish \
--publish-url "${{ secrets.DEVPI_URL }}/" \
--username infra \
--password "${{ secrets.DEVPI_TOKEN }}"
AspectDevPI (PyPI)Verdaccio (npm)Docker Registry
AuthAuthentik API token (Basic)htpasswd (Basic)JWT (RS256) via auth-bridge
UI authAuthentik OIDC (native)Authentik OIDCAuthentik SSO forward-auth
ACLGroup-basedScope-basedGroup-based
Push tooluv publish / twinenpm publishpodman push

The complete guide with troubleshooting, token management, operations, and twine/devpi client setup is in the registries repo: /opt/services/registries/docs/pypi-registry-guide.md