Tired of Google scanning your files? Nextcloud gives you complete control over your data with a self-hosted platform that rivals Google Drive, Dropbox, and OneDrive — all running on your own infrastructure.
Why Self-Host Nextcloud?
Cloud storage services are convenient, but they come with hidden costs: privacy concerns, subscription fees, storage limits, and the risk of service shutdowns. Nextcloud eliminates all of that.
What you get:
- Unlimited storage — limited only by your disk space
- End-to-end encryption — your data, your keys
- File sync & share — across all devices, just like Dropbox
- Collaborative editing — built-in OnlyOffice/Collabora support
- Calendar & contacts — replace Google Calendar too
- App ecosystem — 400+ apps for everything from notes to video calls
- No vendor lock-in — open source, forever free
Prerequisites
- A VPS or dedicated server with at least 2GB RAM (4GB recommended)
- Docker and Docker Compose installed
- A domain name pointed to your server (optional but recommended)
- 20+ minutes of your time
Step 1: Create the Docker Compose File
Create a directory for your Nextcloud installation:
mkdir -p ~/nextcloud && cd ~/nextcloud
Create a docker-compose.yml file:
version: '3.8'
services:
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: always
ports:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
- ./config:/var/www/html/config
- ./custom_apps:/var/www/html/custom_apps
- ./themes:/var/www/html/themes
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=secure_password_here
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=admin_password_here
- NEXTCLOUD_TRUSTED_DOMAINS=your-domain.com localhost
- OVERWRITEPROTOCOL=https
- OVERWRITEHOST=your-domain.com
depends_on:
- db
- redis
networks:
- nextcloud_network
db:
image: mariadb:10.11
container_name: nextcloud_db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root_password_here
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=secure_password_here
networks:
- nextcloud_network
redis:
image: redis:alpine
container_name: nextcloud_redis
restart: always
networks:
- nextcloud_network
volumes:
nextcloud_data:
db_data:
networks:
nextcloud_network:
driver: bridge
Step 2: Launch Nextcloud
Start the stack with a single command:
docker-compose up -d
Wait about 30 seconds for the containers to initialize. Check the logs to confirm everything is running:
docker-compose logs -f nextcloud
You should see output indicating the installation is complete.
Step 3: Access Your Nextcloud Instance
Open your browser and navigate to:
http://your-server-ip:8080
Log in with the admin credentials you set in the Docker Compose file. You'll be greeted by the Nextcloud dashboard — your private cloud is now live.
Step 4: Secure with HTTPS (Production Setup)
For production use, you'll want HTTPS. The easiest approach is to put Nextcloud behind a reverse proxy like Traefik or use Caddy:
# Caddyfile example
nextcloud.yourdomain.com {
reverse_proxy localhost:8080
}
Or with Traefik, add these labels to your Nextcloud service:
labels:
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host('nextcloud.yourdomain.com')"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
Step 5: Essential Post-Install Configuration
Enable Background Jobs
Switch from AJAX to cron for better performance:
docker exec -u www-data nextcloud php cron.php
Then add a system cron job:
*/5 * * * * docker exec -u www-data nextcloud php cron.php
Install Recommended Apps
From the Nextcloud web interface, go to Apps and install:
- OnlyOffice or Collabora — for document editing
- Calendar — sync with your devices
- Contacts — replace Google Contacts
- Deck — kanban project management
- Talk — video conferencing and chat
Configure External Storage (Optional)
Mount S3-compatible storage, SMB shares, or local folders:
docker exec -u www-data nextcloud php occ app:install files_external
docker exec -u www-data nextcloud php occ files_external:create /s3 amazons3::accesskey -c bucket=mybucket -c key=YOUR_KEY -c secret=YOUR_SECRET -c hostname=minio.yourdomain.com
Verification
Confirm everything is working:
# Check container status
docker-compose ps
# Verify database connection
docker exec nextcloud_db mysql -u nextcloud -p nextcloud -e "SHOW TABLES;"
# Check Nextcloud system status
docker exec -u www-data nextcloud php occ status
You should see all containers running and Nextcloud reporting a healthy status.
Performance Tips
Enable Redis for File Locking
Redis is already in our compose file. Verify it's configured:
docker exec -u www-data nextcloud php occ config:system:set redis host --value=redis
docker exec -u www-data nextcloud php occ config:system:set redis port --value=6379
docker exec -u www-data nextcloud php occ config:system:set memcache.locking --value=\OC\Memcache\Redis
Optimize Database
docker exec nextcloud_db mysql -u root -p -e "
ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
"
Add Memory Caching
docker exec -u www-data nextcloud php occ config:system:set memcache.local --value=\OC\Memcache\APCu
Backup Strategy
Your data lives in two places: the database and the data volume. Back up both:
#!/bin/bash
BACKUP_DIR="/backups/nextcloud/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# Backup database
docker exec nextcloud_db mysqldump -u nextcloud -p'password' nextcloud > $BACKUP_DIR/db.sql
# Backup data volume
docker run --rm -v nextcloud_nextcloud_data:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/data.tar.gz -C /data .
echo "Backup complete: $BACKUP_DIR"
Next Steps
Now that your private cloud is running, consider these related guides:
- Self-Host MinIO — add S3-compatible storage as external storage
- Self-Host WireGuard — secure remote access to your Nextcloud
- Self-Host Traefik — advanced reverse proxy with automatic HTTPS
- Self-Host Borgmatic — automated encrypted backups for your data
Final Thoughts
Nextcloud is the gold standard for self-hosted cloud storage. With this setup, you own your data completely — no third-party scanning, no subscription fees, no storage limits. The initial setup takes 20 minutes, but the peace of mind lasts forever.
Start small, explore the app ecosystem, and gradually replace more Google services with your own infrastructure. Your privacy is worth it.