Skip to content

Auth, Headers and Outbound Proxy

Container Registry Authentication

The container_registry_single and container_registry_any modes support enabling client authentication, requiring visitors to supply a username and password (HTTP Basic Auth).

Configuration Example

yaml
sites:
  - host: docker.example.com
    mode: container_registry_single
    self_url: https://docker.example.com
    settings:
      auth:
        enabled: true
        users:
          - name: alice
            password: secret123
        users_file: /etc/pavonis/users.yml
        users_file_reload_interval: 60s

users (inline) and users_file (external file) can be used together; users from both sources are merged and all are valid.

Hot-Reload of User Files

users_file points to an external YAML file in the same format as the inline users list:

yaml
# users.yml
users:
  - name: alice
    password: secret123
  - name: bob
    password: password456

Pavonis reloads this file periodically according to users_file_reload_intervalno restart required to apply user list changes.

Forwarding Upstream Credentials

If you need to pass credentials to the upstream registry after authentication, use $ in the username to separate the Pavonis username from the upstream username:

pavonis_user$upstream_user

The client logs in to Pavonis as pavonis_user; Pavonis forwards requests to the upstream using upstream_user's identity.

See ContainerRegistryAuthConfig for full details.

Header Management

Automatic Cleanup

Before forwarding a request to an upstream, Pavonis automatically removes headers that could expose proxy chain information:

  • Reverse proxy headers: Via, X-Forwarded-For, etc.
  • Cloudflare-injected headers: CF-Connecting-IP, CF-Ray, CF-Visitor and all other CF-* headers

This prevents upstreams from detecting the presence of Pavonis.

Custom Modification

In addition to automatic cleanup, you can explicitly configure add, modify or delete operations for any request or response header:

yaml
request:
  header:
    modify:
      X-Custom-Token: 'my-token'      # add or overwrite request header
    delete:
      - 'X-Internal-Header'           # delete specific request header

response:
  header:
    modify:
      Access-Control-Allow-Origin: '*'
    delete:
      - 'X-Powered-By'

See RequestConfig and ResponseConfig for full details.

Outbound Proxy

A single HTTP outbound proxy can be specified for all upstream requests. Both http:// and socks5:// protocols are supported:

yaml
request:
  proxy: http://127.0.0.1:7890

All upstream requests forwarded by Pavonis will go through this proxy, making it suitable for deployments in network-restricted environments.

See RequestConfig for full details.