A lot of my stuff is ad-hoc from my personal exploration and experience on Linux.
In regards to the wireguard specific stuff, this isn't a bad guide.
https://mikkel.hoegh.org/2019/11/01/home-vpn-server-wireguar...
The harder part with the VPN stuff is the following.
1) Setting up a clear route of forwarding traffic to the pihole. To do so, you would need to setup netplan/systemd-networkd so your pi gets a static private IP. (Not that easy if you are doing a full ipv6 route too.)
2) Setup a DDNS mechanism (as you most likely are getting a dynamic IP). My suggestion for this was to get a domain name (8 quid a year) and use cloudflare as a DDNS host. You also need to punch a UDP port through your router to forward to your pi.
3) Then setup the rest of the wireguard stuff.
4) Setup the pihole and ensure all interfaces are covered so your VPN has a DNS server.
Part 2 is the hardest bit as I kind of needed some custom scripting to ensure cloudflare had working routes to my networks. e.g. https://gist.github.com/Kedstar99/2d8ab0e9bec3a5629562b4ab01...
The above script obviously running as a systemd service that restarts automatically.
Obviously you can use something else like noip or some other DDNS solution.
https://www.freedesktop.org/software/systemd/man/systemd.net...
Then choose your firewall of choice to setup NAT and forwarding. I used firewalld, but not sure I'd recommend it. It's just the first solution I got working.
Once you have the base OS ready to go, it will take you less than 30 minutes if you know how to muck with your DHCP/firewall settings in your router.
https://github.com/pi-hole/pi-hole/#one-step-automated-insta...
Install Pi-Hole, then edit your DHCP server to hand out the Pi-Hole as the DNS server.
After installing Pi-hole, install this. Choose Wireguard, not OpenVPN. port-forward the Wireguard UDP port to your VPN server. use the "pivpn" command to create client configs and the "qr" subcommand to scan the config into your phone.
The community around WG has gotten much easier for noobs to get into, and the porcelain around the tool itself has made it quite easy to use, IMO.
By specifying the namespace in a systemd service file, I can let a service use a specific VPN.
Pihole pretty much installs itself (it even has a pre-made image). WireGuard will take reading, testing and failing.
I recommend doing these things one thing at a time, and doing the Pihole first.