I set up a Darkpan recently. It was intended only to provide some internal modules, making them available for installation using standard CPAN tooling. I didn't need presentation, so my webserver is just minimal Mojolicious::Lite app that serves the tarballs in a CPAN-style file hierarchy as static content. To build the Darkpan I used CPAN::Mirror::Tiny. It works just fine.
This solution doesn't provide a web GUI, just the barebones file structure needed by CPAN tools like cpan and cpanm. The latter is what our consumers mostly use, via Carton.
We build our distributions into a Darkpan prototype on a build server, and then rsync the files that got modified with new versions over to a mirror that has both Beta and Production level Darkpan mirrors on it. We don't delete old versions; we keep them around so that consumers can pin to a version, and so that consumers can roll back as needed.