The Complete Guide to Self-Hosting Your Own Cloud Services
Cloud storage and online services have become essential parts of our daily lives, but relying on Google Drive, Dropbox, iCloud, or Microsoft OneDrive means trusting someone else with your files. Your data lives on their servers, gets scanned by their algorithms, and can disappear if they decide to discontinue a service or terminate your account.
Self-hosting flips that model. You run your own cloud services on hardware you control — a spare computer, a Raspberry Pi, or a cheap VPS — and you decide who has access to your data. It sounds technical, but modern self-hosting tools have made it more accessible than ever. This guide walks you through everything you need to know, from choosing hardware to picking the right software and keeping everything secure.
What Self-Hosting Actually Means
At its simplest, self-hosting means running applications on your own server instead of using a third-party service. Instead of uploading files to Google Drive, you run Nextcloud on a machine in your home. Instead of paying for Netflix, you stream your own media library with Jellyfin. Instead of using LastPass or 1Password, you host Bitwarden (or its lightweight variant Vaultwarden).
The benefits go beyond privacy:
- Data ownership — Your files live on hardware you control. No one else can decide to delete them, scan them, or lock you out.
- No subscription fees — Most self-hosted software is free and open source. Your only costs are hardware, electricity, and internet bandwidth.
- Unlimited storage — Add a hard drive when you need more space, not a more expensive subscription tier.
- Full customisation — Want to add a feature? With open source software, you can modify it or install plugins that extend its functionality.
- Learning experience — Running your own servers teaches you Linux, networking, security, and system administration — valuable skills in any tech career.
The trade-offs are real too: you handle your own backups, security updates, and troubleshooting. If your internet goes down, your self-hosted services go with it (unless you run them on a remote VPS). But for most people, the benefits far outweigh the costs.
What You Need to Get Started
You don’t need a data centre in your basement. Most self-hosted services run comfortably on modest hardware.
Hardware Options
| Hardware | Best For | Estimated Cost | Power Draw |
|---|---|---|---|
| Raspberry Pi 4/5 (4–8 GB RAM) | Light services: Pi-hole, Home Assistant, Bitwarden, file sync | $50–100 | 5–15W |
| Old laptop/desktop (8+ GB RAM) | Medium services: Nextcloud, Jellyfin, Immich | $0 (you already own it) | 30–100W |
| Intel NUC / Mini PC (16+ GB RAM) | Multiple services, media transcoding | $200–500 | 15–45W |
| VPS (Virtual Private Server) | Always-on services, no home internet dependency | $5–20/month | N/A |
A Raspberry Pi 5 with 8 GB of RAM can run Nextcloud, Pi-hole, Bitwarden, and Uptime Kuma simultaneously without breaking a sweat. For media streaming with Jellyfin or photo management with Immich, an old laptop or NUC with hardware transcoding support (Intel Quick Sync) is a better choice.
Network Requirements
- Static IP or dynamic DNS — Most home ISPs don’t give you a static IP. Services like DuckDNS or No-IP give you a domain name that updates automatically when your IP changes.
- Port forwarding — You’ll need to forward ports on your router (typically 80 and 443 for web traffic, plus service-specific ports).
- A domain name — A domain costs $10–15/year and makes everything easier. You can use a free subdomain from DuckDNS, but a real domain lets you set up proper TLS certificates with Let’s Encrypt.
- Good upload speed — For remote access to your files, you need upload bandwidth. 10 Mbps is enough for documents and photos; 50 Mbps+ is better for streaming media remotely.
Software Foundation
Most self-hosted services run on Ubuntu Server or Debian. Both are well-supported, stable, and have massive communities. Once the OS is installed, you have two main approaches for installing applications:
- Docker (via Portainer or docker-compose) — The most popular method. Each service runs in its own container with dependencies bundled. Easy to install, update, and remove without affecting other services.
- Manual installation — Install software directly on the OS. More control, more maintenance, and more potential for conflicts between services.
For beginners, Docker is strongly recommended. It isolates each service, makes updates trivial (one command), and lets you experiment without breaking your system.
Choosing Your Cloud Platform
For most people, the self-hosting journey starts with file sync and sharing — replacing Google Drive or Dropbox. Three major platforms dominate this space:
Nextcloud — The Swiss Army Knife
Nextcloud is the most popular self-hosted cloud platform, and for good reason. It started as a fork of ownCloud in 2016 and has since grown into a full productivity suite. Beyond file sync, it offers:
- Nextcloud Talk — Built-in video conferencing (Zoom/Slack alternative)
- Nextcloud Office — Collaborative document editing via Collabora or OnlyOffice
- Calendar and Contacts — Sync with your phone, desktop, and email client
- Deck — Kanban boards for project management
- Hundreds of apps — Email, notes, bookmarks, maps, and more
Nextcloud runs well on a Raspberry Pi 5, though performance improves significantly with an SSD and at least 4 GB of RAM. For teams or families, Nextcloud’s sharing features — password-protected links, expiration dates, and granular permissions — make it easy to collaborate.
ownCloud — The Enterprise Choice
ownCloud (now ownCloud Infinite Scale) took a different path after the fork. Version 10 is the classic file sync platform, while the newer Infinite Scale (OCIS) is a complete rewrite in Go. ownCloud focuses on being a lean, fast file sync platform rather than a full productivity suite. It’s particularly strong in enterprise environments where compliance and file governance matter more than collaboration features.
Which should you choose? If you want a Google Workspace replacement with everything included, pick Nextcloud. If you need a high-performance file sync platform with strong access control and don’t need the extras, try ownCloud. Read our full Nextcloud vs ownCloud comparison.
Seafile — The Speed Demon
Seafile takes a different approach. Instead of storing files as individual items on the filesystem, it stores them in a block-based format that makes sync dramatically faster — especially for large files and directories with many small files. Seafile’s sync client is widely considered the fastest among self-hosted options. It also supports client-side encryption, so even the server administrator can’t read your files.
The trade-off is a less polished web interface and a smaller app ecosystem compared to Nextcloud. For pure file sync performance, Seafile is unmatched.
Essential Self-Hosted Services to Add
Once you have your cloud platform running, here are the services that turn a basic file server into a complete self-hosted ecosystem:
Media Streaming — Jellyfin
Jellyfin is a free, open source media server that organises your movies, TV shows, music, and photos into a Netflix-style library. It streams to any device — phone, tablet, smart TV, gaming console — and supports hardware-accelerated transcoding if your server has a compatible GPU. Unlike Plex, Jellyfin has no paid tier, no tracking, and no licensing restrictions.
Password Management — Vaultwarden
Vaultwarden is a lightweight, compatible reimplementation of the Bitwarden server written in Rust. It uses significantly less memory (128 MB vs 2 GB for the official Bitwarden server) while being fully compatible with all Bitwarden clients — desktop, mobile, browser extensions, and CLI. Combined with Bitwarden‘s official clients, it gives you self-hosted password management that syncs everywhere.
Photo Management — Immich
Immich has quickly become the go-to self-hosted alternative to Google Photos. It offers automatic backup from your phone, facial recognition, object tagging, album creation, and a timeline view that looks and feels like Google Photos. It’s under active development (now past version 1.0) and improves with every release. For a more stable but less feature-rich option, PhotoPrism is a solid alternative.
Backup and Sync — Syncthing
Syncthing takes a peer-to-peer approach to file sync. Instead of a central server, devices sync directly with each other whenever they’re on the same network. It’s perfect for keeping a folder in sync between your laptop, desktop, and phone without a cloud middleman. No registration, no central server, no data limits.
Monitoring — Uptime Kuma
Once you have multiple services running, you need to know when they go down. Uptime Kuma monitors your services and sends notifications via email, Telegram, Discord, or dozens of other channels when something breaks. It has a clean dashboard, supports HTTP, TCP, ping, and DNS checks, and takes about 30 seconds to install.
Ad Blocking — Pi-hole
Pi-hole is a network-wide ad blocker that runs on your server and filters DNS queries from every device on your network. Install it once, configure your router to use it as the DNS server, and ads disappear from every phone, laptop, and smart TV in your house. It also blocks tracking domains, improving both privacy and page load times.
Installation: Docker Compose Method
The fastest way to get a self-hosted cloud running is with Docker and docker-compose. Here’s a working setup for Nextcloud with a PostgreSQL database and Redis cache:
# Install Docker on Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Create a directory for your services
mkdir -p ~/selfhosted/nextcloud
cd ~/selfhosted/nextcloud
# Create docker-compose.yml
cat <<'EOF' > docker-compose.yml
version: '3.8'
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: change-this-password
volumes:
- db_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
app:
image: nextcloud:stable
ports:
- "8080:80"
environment:
POSTGRES_HOST: db
REDIS_HOST: redis
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: change-this-too
volumes:
- nextcloud_data:/var/www/html
depends_on:
- db
- redis
restart: unless-stopped
volumes:
db_data:
nextcloud_data:
EOF
# Start everything
docker compose up -d
After a few minutes, Nextcloud will be available at http://your-server-ip:8080. The same pattern works for almost every service in this guide — Jellyfin, Immich, Vaultwarden, and Uptime Kuma all provide docker-compose templates on their websites.
Securing Your Services with a Reverse Proxy
Running services on random ports works for testing, but for real use you want everything behind a reverse proxy that handles TLS certificates and routes traffic by domain name.
Caddy is the easiest option — it automatically provisions and renews Let’s Encrypt certificates. Create a Caddyfile:
cloud.yourdomain.com {
reverse_proxy nextcloud:80
}
photos.yourdomain.com {
reverse_proxy immich:8080
}
media.yourdomain.com {
reverse_proxy jellyfin:8096
}
With Caddy, you get HTTPS on every service with zero configuration. For more advanced setups, Traefik offers automatic service discovery when used with Docker.
Security Best Practices
Self-hosting puts you in charge of security. Here are the essentials:
- Use HTTPS everywhere — Let’s Encrypt provides free TLS certificates. Never expose a service over plain HTTP. Caddy and Traefik automate this.
- Enable a firewall — Ubuntu’s
ufwmakes this straightforward:sudo ufw allow ssh sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enableVerify with
sudo ufw status. Only these ports should be open — block everything else. - Install Fail2ban — Fail2ban monitors login attempts and bans IPs after repeated failures. Essential for any internet-facing service.
- Regular updates — Set up unattended-upgrades for OS security patches. For Docker services, use
watchtoweror manually run:docker compose pull && docker compose up -d - Use strong passwords — Every service gets a unique, complex password. A self-hosted Bitwarden instance makes this manageable.
- Two-factor authentication — Nextcloud, Bitwarden, and most modern self-hosted apps support TOTP two-factor authentication. Enable it.
- Regular backups — Back up your configuration files, Docker volumes, and databases. Test your backups by restoring them to a fresh system.
Backup Strategy
Putting all your data on one server creates a single point of failure. A solid backup plan has three tiers:
- Local backups — Use
borgbackupor rclone to back up Docker volumes and databases to an external USB drive connected to your server. Run this daily. - Remote backups — Back up critical data (documents, photos, password database) to a different location. This could be a friend’s server, a cheap VPS, or an encrypted cloud storage provider via rclone.
- Configuration backups — Keep your docker-compose files and configuration in a Gitea repository. If your server dies, you can recreate the entire setup from these files.
Nextcloud has built-in backup and restore functionality. For Docker-based services, backing up the volume directories is usually sufficient:
# Example backup of Docker volumes to external drive
sudo rsync -av /var/lib/docker/volumes/ /mnt/backup_drive/volumes/
# Backup PostgreSQL database
docker exec nextcloud-db-1 pg_dump -U nextcloud nextcloud > /mnt/backup/nextcloud_db.sql
Taking the Next Step
Self-hosting is a journey, not a destination. Start with one service — Nextcloud for file sync is the most common entry point — and add more as you get comfortable. The communities around these projects are welcoming and helpful; if you get stuck, someone has almost certainly solved your problem before.
Already using some of these tools? You might also find these guides useful:
- Nextcloud vs ownCloud — Which Self-Hosted Cloud Is Better?
- Best Self-Hosted Alternatives to Google Services
- Getting started with Portainer for Docker management
And if you haven’t explored the full directory yet, browse all tools to discover more self-hosted software for every need.
PHP Warning: fopen(/tmp/twif-metrics.json): Failed to open stream: Permission denied in /var/www/html/wp-content/mu-plugins/prometheus-metrics.php on line 271
Warning: fopen(/tmp/twif-metrics.json): Failed to open stream: Permission denied in /var/www/html/wp-content/mu-plugins/prometheus-metrics.php on line 271