Caching reverse proxy responses to a local directory? (nginx `proxy_store` equivalent)

1. The problem I’m having:

I am currently attempting to migrate from nginx to Caddy, and I’m trying to migrate a personal Pacman package proxy cache along with my other stuff. A similar config to what I had can be found here.

Unfortunately, however, I can’t seem to find a Caddy equivalent to nginx’s proxy_store directive. This is the part that effectively makes the whole thing work; it saves every archive file it receives from the reverse proxy upstream to a local directory preserving the original name/location, and it returns the local copy on every subsequent request to avoid downloading from upstream every time.

Is there a way I can replicate this setup, with or without plugins? I noticed the existence of GitHub - caddyserver/cache-handler: Distributed HTTP caching module for Caddy · GitHub, but it didn’t seem to be able to cache to a regular file.

2. Error messages and/or full log output:

N/A

3. Caddy version:

v2.11.2

4. How I installed and ran Caddy:

a. System environment:

Quadlet (Podman) on Fedora 43 (x86_64) (an external machine on the local network)

b. Command:

# systemctl start caddy

c. Service/unit/compose file:

[Unit]
Description=Caddy reverse proxy
After=network-online.target nss-lookup.target
Wants=network-online.target

[Container]
Image=docker.io/caddy:alpine
AutoUpdate=registry
ContainerName=caddy
PublishPort=80:80
PublishPort=443:443
PublishPort=443:443/udp
Network=podman
ReloadCmd=caddy reload --config /etc/caddy/Caddyfile
Volume=/etc/caddy:/etc/caddy:z
Volume=/var/containers/caddy/config:/config:z
Volume=/var/containers/caddy/data:/data:z
Volume=/var/log/caddy:/var/log/caddy:z
Volume=/var/www:/var/www:z

NoNewPrivileges=true
DropCapability=ALL
AddCapability=NET_ADMIN NET_BIND_SERVICE

Memory=1g
PodmanArgs=--memory-reservation=512m --cpu-shares=1024

[Service]
Restart=always
RestartSec=5s

[Install]
WantedBy=default.target

d. My complete Caddy config:

Admittedly untested, as the described issue is a blocker:

(repo) {
  reverse_proxy {
    dynamic a geo.mirror.pkgbuild.com 443 {
      versions ipv6
    }

    # todo: figure out how to cache response to /var/www/paccache
    # with the same directory layout, and preferably toggle
    # based on a snippet arg

    transport http {
      tls
    }
  }
}

http:// {
  root /var/www/paccache

  @db path_regexp \.(db|sig|files)$
  @tar path_regexp \.tar\.(xz|zst)$

  handle @db {
    # always proxy db/sig files, never cache
    import repo
  }

  handle {
    file_server browse
  }

  handle_errors {
    handle @tar {
      # the intent here is to search for local .tar files first,
      # and then proxy/cache from upstream if none are found
      import repo store
    }
  }
}

5. Links to relevant resources:

Update: I have worked around this for the time being by reverse proxying a custom Deno script. I’m still very much interested in being able to do this directly from Caddy, however!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.