This is my third Nextcloud install on the homelab. The first ran on SQLite, got slow the moment it held real photos, and I let it rot. The second I hand-wired with separate containers and broke during an upgrade because I did not understand the occ upgrade dance. This one I think I will actually keep.
What changed was mostly attitude. I stopped trying to be clever and ran the official AIO image, then put the two things it genuinely cares about on solid ground: Postgres instead of SQLite, and a dedicated Redis for file locking and caching. The difference is night and day. The web UI stops feeling like wading through treacle, and concurrent uploads no longer trip over each other with transactional lock errors.
The bit I had skipped twice before was setting the right defaults so it stops nagging you in the admin overview. Once default_phone_region and a real cron job were in place, the warnings went quiet and I could finally tell the difference between "configured wrong" and "actually broken".
# proper background jobs, not AJAX cron
*/5 * * * * www-data php /var/www/html/cron.php
It is serving my photos, my documents, and a calendar I no longer have to hand to anyone else. Not exciting. That is the whole point: storage I own should be boring, and for the first time mine is.