Definitely install fail2ban and use certificates for ssh authentication.
Also, use cloudflare and consider using an email delivery service like jetmail instead of sending mail directly from the instance.
You could then block any incoming traffic that doesn't come for port the ssh port or from cloud flare for port 443.
In my opinion, folks should avoid Cloudflare at all costs. They're free speech maximalists with a history of defending NAZI's and other terrible people. They only discontinue service to white nationalists when the media attention gets too hot. Then they turn around and let them back in once things have died down.
Also, speaking as a screen reader user, if they think your IP address is suspicious (maybe because you're using Tor or a VPN), they present an inaccessible captcha and don't offer work-arounds. Then because the entire website is blocked behind the captcha, screen reader users can't even get in contact with you to let you know what's happening.
Cloudflare is a major player in the infrastructure of the internet. The should remain neutral and provide their service to anyone operating within the law.
To further this, I use a mail relay that accepts connections on SMTP and then forwards outbound email via a service like AWS or sendgrid via their API.You can run a forwarder in a container.
I was using CF initially for proxying, but noticed some weirdness with federation. I would only get updates from Beehaw, but lemmy.world and other servers' updates wouldn't come through. As soon as I dropped the proxy and restarted the server, my instance got flooded by updates. I'm really not sure where to start debugging, so I've kept it off for now
Disable all inbound ports in the firewall except for those you absolutely need (like port 80/TCP, port 443/TCP, sshport/TCP, DENY all other inbound)
Use the principle of least privilege. Don't run your docker containers or web server as the root user. Make a new user, give it only the permissions needed in order to run the service definitely not sudo group. Set a strong password for those users, and disable remote/SSH logins for them
For SSH, use public key authentication, disable password login afterward
Instead of fail2ban, I like and would recommend Crowdsec. Needs some fiddling for Lemmy though, due to rate limits and federation