My Microsoft 365 subscription was worth every penny—until my priorities changed. I replaced MS Word with Obsidian as my note-taking app, and suddenly I was stuck with a subscription I barely used, except for the 1TB of storage.
When I revived my old laptop, I decided to give self-hosting a chance to see if I could save $120/year from my subscription without using a NAS. After all, I had an external storage drive, a decently specced computer, and a weekend to experiment. It worked, though getting there made clear why most people stick with managed storage. For me, the trade-offs were worth it.
The hybrid cloud setup
Combining Nextcloud + Google D…
My Microsoft 365 subscription was worth every penny—until my priorities changed. I replaced MS Word with Obsidian as my note-taking app, and suddenly I was stuck with a subscription I barely used, except for the 1TB of storage.
When I revived my old laptop, I decided to give self-hosting a chance to see if I could save $120/year from my subscription without using a NAS. After all, I had an external storage drive, a decently specced computer, and a weekend to experiment. It worked, though getting there made clear why most people stick with managed storage. For me, the trade-offs were worth it.
The hybrid cloud setup
Combining Nextcloud + Google Drive
The idea was simple. To turn my secondary laptop with a terabyte of SSD storage into a private cloud server using Nextcloud and Docker. Then pair it with my secondary Gmail account’s 15GB of free storage for off-site backup. This way, I get local control over my files without losing the safety net of cloud backup.
With this setup, most of my files stay on my own hardware, where I have complete control. The important stuff, like work documents, family photos, and critical backups, gets an extra copy on Google Drive. This, at least in theory, should save me $120/year on my 1TB cloud storage subscription, and may be even more in the future.
Setting up Nextcloud in Docker
Getting your personal cloud running on Windows
To create your own private cloud server, you need two things: Nextcloud and Docker.
Nextcloud is an open-source, self-hosted platform that provides you with your own personal Dropbox or Google Drive—except it runs on your own hardware. However, running Nextcloud natively comes with the massive overhead of managing dependencies.
To simplify this process, we can use Docker. It makes the setup clean and portable by packaging all dependencies for Nextcloud in a single, isolated container. If something goes wrong, you can tear it down and start fresh without affecting your Windows installation.
So, first, we need to download and install Docker Desktop for Windows. During installation, enable the Use WSL 2-based engine option when prompted. Once Docker Desktop launches, you’ll see its icon in your system tray.
Next, open PowerShell and verify Docker is running with the command:
docker --version
Create a folder for your Nextcloud setup (I used J:\nextcloud). Inside, create a file named docker-compose.yml with this configuration:
version: "3.8"services: db: image: mariadb:10.11 restart: always environment: MYSQL_ROOT_PASSWORD: yourpassword MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloud MYSQL_PASSWORD: yourpassword volumes: - db:/var/lib/mysql app: image: nextcloud:latest restart: always ports: - "8080:80" depends_on: - db environment: MYSQL_HOST: db MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloud MYSQL_PASSWORD: yourpassword volumes: - nextcloud:/var/www/html - ./data:/var/www/html/datavolumes: db: nextcloud:
Replace “yourpassword” with something secure. Then, in PowerShell, navigate to your Nextcloud folder and run:
docker compose up -d
Docker will download the necessary components and start your server. This may take a few minutes, so grab a coffee.
After the installation is complete, it’s time to set up your Nextcloud server. Open your web browser and visit **http://localhost:8080 **to access the setup screen.
Here, you need to create your admin account. Next, expand Storage & Database and select MySQL/MariaDB.
Enter the database credentials from your Docker file:
- Database user: nextcloud
- Password: (what you set in the docker-compose.yml file)
- Database name: nextcloud
- Database host: db
Once done, click Install. When prompted, skip the recommended apps dialog—you’re setting up Nextcloud purely as a cloud server. With installation complete, you can now connect your devices (such as your phone or PC) to start syncing data.
Setting up sync on your devices
Connecting your phone and PC to Nextcloud
To access Nextcloud from other devices on your network, you need your server’s IP address. Open Command Prompt and run:
ipconfig
Look for a Wireless LAN adapter, Wi-Fi, and find your IPv4 address. Mine was 192.168.1.5, so my Nextcloud server is accessible at http://192.168.1.5:8080.
When you first try accessing Nextcloud from this IP address, you’ll likely see an “Access through untrusted domain” message. This is Nextcloud’s security feature preventing unauthorized access.
To fix this, enter your Nextcloud container:
docker exec -it nextcloud-app-1 bash
Install a text editor if needed:
apt update && apt install nano -y
Edit the configuration file:
nano /var/www/html/config/config.php
Find the trusted_domains section and add your IP address:
'trusted_domains' =>array ( 0 => 'localhost:8080', 1 => '192.168.1.5:8080',),
Save the file (Ctrl+O, Enter, Ctrl+X) and restart the container:
docker compose restart app
Now you can access Nextcloud from any device on your network using the IP address. Install the Nextcloud desktop client and mobile app (Android, iOS), then connect using http://192.168.1.5:8080 and your admin credentials. Once done, you can choose which files to sync, and they’ll automatically upload to the Nextcloud server on your laptop.
Setting up Duplicati with Google Drive for backup
Creating your safety net with automated backups
Duplicati handles the backup side of this hybrid setup. It’s a Windows app with a web interface that makes scheduling backups to Google Drive painless. Unlike command-line tools, Duplicati provides a visual interface for configuring everything, including encryption and retention policies.
Duplicati
OS Windows, Linux, macOS
Developer Duplicati
Duplicati is a free, open-source backup software that securely stores encrypted, compressed, incremental backups of files and folders to cloud services or local storage, offering advanced scheduling and automation features.
Download Duplicati from the official website and install it. Click the app icon in the system tray to launch its web interface. To create a new backup, click Add backup and then Configure a new backup.
Name your backup something like “NextcloudBackup” and set an encryption passphrase. Write the passphrase down somewhere safe because you’ll need it to restore files. For source folders, add C:\nextcloud\data (or wherever your Nextcloud data folder is).
The C:\nextcloud\data folder contains everything you sync, but you don’t need to back it all up. Since free Google Drive accounts only offer 15GB of storage, backing up the entire folder will fill up your space quickly. Instead, create a dedicated subfolder (for example, C:\NextcloudImportant) for your most important files and point Duplicati to that.
For the destination, choose Google Drive and click AuthID. Your browser will open for you to grant Duplicati access to your Google account. You’ll need to copy and paste the authentication code to verify your account. Next, set the schedule to daily or whatever works for you. I run mine at 2 AM when nobody’s using the server.
For added redundancy, I created a second backup job pointing to my external hard drive connected to the laptop. This gives me a full local backup copy that’s faster to restore from if needed. Simply create another backup configuration in Duplicati, but this time select “Local folder or drive” as the destination and point it to your external drive (like E:\NextcloudBackup).
Configure retention to keep 7 daily backups, 4 weekly backups, and 12 monthly backups for both destinations. This gives you a year’s worth of restore points without eating up all your Google Drive space. Remember, with Google Drive, you’re only backing up critical files here, not your entire media library.
For reliable backups, you should put Nextcloud in maintenance mode while Duplicati runs. You can automate this with a simple script that runs before and after the backup:
docker exec -u www-data nextcloud-app-1 php occ maintenance:mode --on# Duplicati runs backup heredocker exec -u www-data nextcloud-app-1 php occ maintenance:mode --off
Security and reliability improvements to consider
Making your self-hosted setup more robust
While the basic setup works, there are several improvements worth considering for better security and reliability.
Security hardening: The current setup uses HTTP instead of HTTPS, meaning all data transfers are unencrypted. Consider adding a reverse proxy like Nginx Proxy Manager or Caddy with SSL certificates. Also, move your database passwords to a separate .env file instead of hardcoding them in docker-compose.yml, and enable two-factor authentication in Nextcloud’s security settings.
Proper backup strategy: The Duplicati backup only covers the data folder, not the Docker volumes or database. For a complete backup, you’ll also need to export the MariaDB database using mysqldump and back up the Docker volumes. Test your restore process regularly because a backup you haven’t tested is just hope, not a plan.
Better container management: Add explicit container names to your docker-compose.yml file to avoid inconsistent auto-generated names. Set up a cron container for Nextcloud’s background jobs instead of relying on AJAX, which is unreliable for larger installations.
Network configuration: Configure your Windows Firewall to restrict access to the NextCloud port. If you need remote access, consider using a VPN solution like Tailscale or WireGuard instead of exposing your server directly to the internet through port forwarding.
Monitoring and maintenance: Set up basic monitoring to alert you when your server goes offline. Configure Windows Update to install updates during off-peak hours rather than random restarts. Add log rotation to prevent logs from consuming your disk space. Keep a UPS (Uninterruptible Power Supply) connected to handle brief power outages.
These improvements require additional time and technical know-how, but they can turn a weekend project into a production-ready system. Whether you implement them depends on how critical your data is and how much time you’re willing to invest in maintenance.
This setup is not without challenges
Understanding the trade-offs of DIY cloud storage
Unlike OneDrive or Google Drive, this setup lacks true anywhere access. Your files are only accessible when you’re on your home network or if you have configured remote access. Setting up Tailscale for secure remote connection adds another layer of complexity that paid services handle invisibly.
Your laptop needs to stay on or, at the very least, wake on demand. Every Windows update, power outage, or random crash means your cloud goes offline. Paid services utilize redundant servers and teams to maintain uptime; in contrast, you are responsible for managing everything.
There’s also the time investment. I spent a weekend setting this up (including testing custom domains), and I still spend an hour or two monthly on maintenance, which involves checking backups, updating Docker containers, and troubleshooting the occasional hiccup. For someone valuing their time at even minimum wage, those hours add up quickly against a $10/month cloud subscription.
Despite the trade-offs, this hybrid cloud setup works for me
This hybrid setup saves me $120 a year, but the real value came from understanding what cloud storage actually costs to run. The convenience we take for granted, including instant sync, universal access, and zero maintenance, requires significant infrastructure and expertise.
For me, the trade-offs work. I enjoy tinkering with technology; my files don’t require constant remote access, and I prefer knowing exactly where my data resides. The hybrid approach gives me control over most of my storage while keeping cloud backup for what actually matters.
I won’t pretend this replaces commercial cloud storage for everyone. But if you’re okay with occasional troubleshooting and don’t need everything synced everywhere, ditching paid storage for a hybrid setup might actually work for you, too.