DEV Community

疏影
疏影

Posted on

What I Learned Self-Hosting My Cloud for Two Years


Two years of self-hosted cloud storage

I've been running my own Nextcloud + MinIO + ScsDriver stack since early 2024. Here's what I learned, what surprised me, and what I'd do differently.

What worked

The base stack

  • Hetzner AX41-NVMe: $30/month, plenty of CPU/RAM/disk
  • Nextcloud 27+ on Docker: stable, well-documented, lots of plugins
  • MinIO for raw object storage: S3-compatible, single binary
  • ScsDriver on every client: $5.5 lifetime, drive-letter mount, local cache
  • BorgBackup → Backblaze B2: weekly encrypted backups

This ran for 24 months with maybe 3 hours of unplanned maintenance per quarter.

The mount workflow

Mounting Nextcloud + MinIO as drive letters changed how I work. I edit video from N:\Projects\ in Premiere, photos from N:\Photos\ in Lightroom. I don't think about whether files are local or remote anymore.

The local cache layer in ScsDriver is the unsung hero. Editing 4K video over WAN feels native because the cache absorbs the latency.

What surprised me

Storage fills up faster than I expected

I thought 4TB would be plenty. I was wrong. After two years:

  • Personal photos / videos: 1.2 TB
  • Work projects: 800 GB
  • Backups of my laptops: 2.1 TB
  • Misc: 200 GB
  • Total: 4.3 TB

I'm now at 4.3TB on a 4TB disk. Time to add storage or clean up.

Network egress is real

When friends or clients download large files, that's egress. I have unmetered bandwidth on Hetzner but I still feel guilty about it. In practice, egress is fine — I haven't hit a bill shock.

Updates matter

Nextcloud ships updates every 3 months. Skipping an update means I fall behind on security patches. I learned to:

  • Subscribe to the Nextcloud release notes
  • Update within 2 weeks of a release
  • Test the update on a staging instance first (took 2 hours to set up, saved many hours of stress)

Self-hosting takes 30 minutes a month

Not full-time, but 30 minutes. Restart a stuck container. Update Nextcloud. Check disk space. Renew a TLS cert. It's not much, but it's more than $0.

What I'd do differently

Use a bigger disk from day one

If I were starting over, I'd get 8TB instead of 4TB. Same $/TB, but I wouldn't be facing the "out of space" problem now.

Skip the cold backup tier for the first year

I set up BorgBackup to Backblaze B2 in month 1. In retrospect, I should have waited until month 6 when I had data I actually cared about. Saves $24/month for the first 6 months.

Set up monitoring from the start

I use UptimeRobot + a custom script that emails me when disk > 80% full. Setting these up took an hour, but they save me from "oh no, the disk is full" surprises.

Document the setup

I have a setup.md in a private git repo with the full step-by-step. If my server dies, I can rebuild from scratch in a day. Worth doing before you need it.

What I tell people considering self-hosting

  • For 2TB or less, don't self-host. Just pay for Dropbox / Google Drive. The cost is comparable and the operational burden is zero.
  • For 10TB+, self-host. The cost per TB is lower, and you have full control.
  • For 2-10TB, decide based on:
    • Are you comfortable being a sysadmin? (30 min/month minimum)
    • Do you need unlimited storage?
    • Do you want full control of your data?
    • Are you already running other services on a server?

If yes to all four, self-host. Otherwise, pay for cloud storage.

Verdict

Two years in, I'm happy with the self-host route. The combination of Hetzner + Nextcloud + MinIO + ScsDriver is the cheapest path to unlimited storage with full control. Total cost: $30/month + $5.5 one-time. Compared to $290/year for equivalent cloud storage, the self-host is more expensive for small libraries but cheaper for large ones.

For users in mainland China, ScsDriver is sold at CN ¥20 lifetime (separate pricing region).

Pricing recap (overseas, ScsDriver)

  • $1.5 monthly
  • $5.5 yearly
  • $5.5 lifetime (was $9.99)

For users in mainland China, the package is sold at CN ¥20 lifetime (separate pricing region).

Top comments (0)