I'd first recommend that you think about what you need.
What do you need? Do you want a safe space to back up your photos & videos from your phone? Or maybe a way to stream your movies, series and/or music in a cheap way?
Once you figure out what you want to host, you can look into which program can fulfill your needs. Check out the awesome-selfhosted list for a HUGE amount of services you could host.
I’d first recommend that you think about what you need.
This is the absolutely correct option. I've set up way too many things without a use case and lost interest shortly after. If you have a real world use case for your project, even if it's just for yourself, you'll have the incentive to keep it going. If you're just setting things up for the sake of it the hobby loses it's appeal pretty quickly. Of course you'll learn a thing or two on the way but without a real world use case the things you set up will either become a burden to keep up with or they're eventually just deleted.
Personally, tinkering with things that are just removed after a while gave me skills which landed me on my current job, but it's affected myself enough that I don't enjoy setting things up just for the sake of it anymore. Of course time plays a part on this, I've been doing this long enough that when I started a basic LAMP server was a pretty neat thing to have around, so take this with a grain of oldtimer salt, but my experience is that setting up things that are actually useful on a long term is way more rewarding than spinning up something which gets deleted in a month and it'll keep the spark going on for much longer.
I think maintainability has a lot to do with it as well, and what you consider maintainable. I see a lot of interesting setups on here but some of the bigger ones I'm iffy about because authentication or some other critical, lower level protocol is outsourced. To some that sounds great and is easily maintained, but I don't personally consider those super maintainable or sustainable for my setups. I prefer to take the greybeard method and do it all myself. As such, when time comes to do maintenance yeah I have more burden on myself but it's a burden that I explicitly put on myself and that I enjoy.
Pi-hole was really simple to set up. It was absolutely worth it and I've got it running on an old netbook. Very easy on resources.
Syncthing is also nice if you have files that you want easily shared between devices. I use it for sharing work files that I want synced between multiple devices. When I edit something it gets shared to all of my devices and it's always up to date everywhere.
What ever you want? I would start by creating a virtual environment out of the gate if you have some hardware. Find yourself a minipc and then install Proxmox. From there you can create a single VM to play with. I would start by installing Nextcloud AIO in a Debian VM once you have an environment to play in.
(Side note: Make sure to follow good practices. Feel free to ask if you want more information)
(Side note: Make sure to follow good practices. Feel free to ask if you want more information)
Not OP, but I'd like some more information about following good practices, please, especially in terms of "the best way" to make services available outside my lan (forwarding ports vs. a reverse proxy vs. a tunnel vs. a vpn -- assuming some of those terms aren't the same thing and I'm too much of a noob to realize).
You really should not directly expose services to the public internet. That opens up high levels of risk and anything you do expose needs to be monitored and isolated from everything else.
I would start by creating a separate subnet for your homelab. You should setup firewall rules to disallow traffic to pass between them. For exposing services to your internal lan you should set up basic port forwards.
For remote access you should setup a VPN. Wireguard is going to have the best performance and you can either host it at home or use a mesh VPN solution like netbird or Tailscale.
If you must expose something to the internet be very careful. You should follow least privilege always and restrict access to everything the exposed service doesn't need. Lastly you should assume that you system will be compromised so make sure you have backups.
For me I don't have a static IP so I created a VPS in Linode and then setup Wireguard with a reverse proxy to route traffic into my homelab. This approach is better than exposing your home IP in my option as it moves your Internet activity and hosted services to different IPs. Its not totally unheard of to have a shady website scan your IP for open services that can be exploited.
Another though: you also could set up a honeypot to see attacks in real time. There are tools to do this and it would show you what your up against.
I chose Nextcloud as my first project because I had an interest in the project for a while. I did an old fashioned install which I later rebuilt with docker. I learned a lot doing it manually twice first. I echo the others. Find a project you like, preferably with its own community so you can ask for help when you inevitably mess something up.
if IM was your need, check snikket.org although I can't remember how well they support OTP encryption... of course it's subjective how many layers one need, I'd be happy with just self-host and TLS, that's how far I'd go for me and my relatives for day-to-day privacy.
I chose Navidrome, with which you can stream music from your hard drive. It has very easy setup and it feels just great to stream your own music. I use Tailscale to connect the server to my phone and Ampery as an iOS app.