Skip to main content
  1. Posts/

Building Your Personal Cloud Storage with OwnCloud on Raspberry Pi

·10 mins· ·
Raspberry Pi Owncloud Self-Hosted Cloud Storage Server Privacy Linux Tutorial
Milav Dabgar
Author
Milav Dabgar
Experienced lecturer in the electrical and electronic manufacturing industry. Skilled in Embedded Systems, Image Processing, Data Science, MATLAB, Python, STM32. Strong education professional with a Master’s degree in Communication Systems Engineering from L.D. College of Engineering - Ahmedabad.
Table of Contents

Take control of your digital life by setting up your own cloud storage solution with OwnCloud running on a Raspberry Pi. This comprehensive guide will walk you through creating a self-hosted alternative to commercial services like Dropbox, Google Drive, or OneDrive, giving you complete control over your data.

Why OwnCloud?
#

OwnCloud stands out as an excellent self-hosted cloud solution for several reasons:

  • Complete data ownership: Your files remain on your hardware under your control
  • Enhanced privacy: No third-party companies analyzing your data
  • Cost-effective: No monthly subscription fees after initial setup
  • Customizable storage: Expand capacity by simply connecting larger drives
  • Versatile file access: Sync across all your devices with desktop and mobile apps
  • Powerful sharing features: Share files and folders with custom permissions
  • Rich ecosystem: Extend functionality with plugins for calendars, contacts, and more

Prerequisites
#

  • Raspberry Pi 4 (4GB+ RAM recommended) or Raspberry Pi 5
  • Raspberry Pi OS (64-bit recommended for better performance)
  • External storage device (SSD recommended over HDD for performance)
  • Static IP on your local network or dynamic DNS for remote access
  • Basic familiarity with Linux command line

Step 1: Update Your System
#

Begin with a fresh update to ensure your system has the latest security patches:

sudo apt update && sudo apt full-upgrade -y
sudo reboot

Step 2: Install Web Server and PHP
#

Install Apache, MariaDB (MySQL), and PHP with the required extensions:

sudo apt install -y apache2 mariadb-server libapache2-mod-php
sudo apt install -y php-gd php-json php-mysql php-curl php-mbstring
sudo apt install -y php-intl php-imagick php-xml php-zip php-bcmath

Start and enable Apache and MariaDB to run at boot:

sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mariadb
sudo systemctl enable mariadb

Step 3: Configure PHP for Optimal Performance
#

Enhance PHP performance for OwnCloud by creating a custom configuration:

sudo nano /etc/php/$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')/apache2/conf.d/99-owncloud.ini

Add these optimized settings:

memory_limit = 512M
upload_max_filesize = 1024M
post_max_size = 1024M
max_execution_time = 300
max_input_time = 300
date.timezone = Europe/London  # Change to your timezone
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000

Restart Apache to apply the changes:

sudo systemctl restart apache2

Step 4: Configure MariaDB Database
#

Secure your MariaDB installation:

sudo mysql_secure_installation

Follow the prompts to set a root password and secure your installation (typically answering “Y” to all questions).

Create a dedicated database for OwnCloud:

sudo mysql -u root -p

Once logged in, create the database and user with appropriate permissions:

CREATE DATABASE owncloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'ownclouduser'@'localhost' IDENTIFIED BY 'your-secure-password';
GRANT ALL PRIVILEGES ON owncloud.* TO 'ownclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Step 5: Download and Install OwnCloud
#

Download the latest version of OwnCloud:

cd /tmp
wget https://download.owncloud.org/community/owncloud-complete-latest.tar.bz2

Extract and move to the web directory:

sudo tar -xjf owncloud-complete-latest.tar.bz2
sudo mv owncloud /var/www/
sudo chown -R www-data:www-data /var/www/owncloud/

Step 6: Configure Apache for OwnCloud
#

Create a dedicated Apache configuration file for OwnCloud:

sudo nano /etc/apache2/sites-available/owncloud.conf

Add the following content for optimal security and performance:

Alias /owncloud "/var/www/owncloud/"

<Directory /var/www/owncloud/>
  Options +FollowSymlinks
  AllowOverride All

  <IfModule mod_dav.c>
    Dav off
  </IfModule>

  SetEnv HOME /var/www/owncloud
  SetEnv HTTP_HOME /var/www/owncloud
  
  # Modern security headers
  <IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "no-referrer"
  </IfModule>
</Directory>

# Enable HTTP/2 for better performance
<IfModule mod_http2.c>
    Protocols h2 h2c http/1.1
</IfModule>

Enable the configuration and required Apache modules:

sudo ln -s /etc/apache2/sites-available/owncloud.conf /etc/apache2/sites-enabled/owncloud.conf
sudo a2enmod headers env dir mime rewrite ssl http2
sudo systemctl restart apache2

Step 7: Set Up External Storage
#

Mount Your External Drive
#

First, identify your drive:

lsblk

Create a dedicated mount point:

sudo mkdir -p /mnt/owncloud-data

For various filesystem types, install necessary support:

# For NTFS formatted drives
sudo apt install ntfs-3g -y

# For exFAT formatted drives
sudo apt install exfat-fuse exfat-utils -y

Find your drive’s UUID for reliable mounting:

sudo blkid

Set up automatic mounting by editing fstab:

sudo nano /etc/fstab

Add a line based on your drive’s filesystem:

# For ext4 filesystem (recommended for Linux)
UUID=your-uuid-here /mnt/owncloud-data ext4 defaults,noatime 0 0

# For NTFS filesystem
UUID=your-uuid-here /mnt/owncloud-data ntfs-3g defaults,permissions,uid=www-data,gid=www-data,noatime 0 0

# For exFAT filesystem
UUID=your-uuid-here /mnt/owncloud-data exfat defaults,uid=www-data,gid=www-data,noatime 0 0

Mount the drive and verify:

sudo mount -a
df -h | grep owncloud-data

Set the correct permissions:

sudo chown -R www-data:www-data /mnt/owncloud-data
sudo chmod -R 770 /mnt/owncloud-data

Step 8: Complete the OwnCloud Web Setup
#

Open your web browser and navigate to http://your-pi-ip/owncloud or if you’re accessing it locally on the Pi itself, use http://localhost/owncloud.

Create your admin account and configure the database connection:

  • Admin username: Choose a strong username
  • Admin password: Use a secure password (12+ characters with mixed case, numbers, symbols)
  • Data folder: /mnt/owncloud-data (for better performance on external storage)
  • Database type: MySQL/MariaDB
  • Database user: ownclouduser
  • Database password: your-secure-password (from Step 4)
  • Database name: owncloud
  • Database host: localhost

Click “Finish setup” to complete the installation.

Step 9: Essential Post-Installation Configuration
#

Configure Trusted Domains
#

Edit the OwnCloud configuration file to specify allowed domain names:

sudo nano /var/www/owncloud/config/config.php

Find the trusted_domains array and add your Pi’s IP address and any domain names:

'trusted_domains' => 
array (
  0 => 'localhost',
  1 => 'your-pi-ip',  // e.g., 192.168.1.100
  2 => 'your-domain.com',
  3 => 'cloud.yourdomain.com',
),

Set Up Background Jobs
#

For optimal performance, configure a system cron job:

sudo crontab -u www-data -e

Add this line to run OwnCloud maintenance tasks every 15 minutes:

*/15 * * * * php -f /var/www/owncloud/cron.php > /dev/null 2>&1

In the OwnCloud admin settings (Settings → Admin → General), change the background jobs method to “Cron”.

Step 10: Enable HTTPS (Essential for Security)
#

For secure remote access, set up HTTPS with Let’s Encrypt certificates:

sudo apt install certbot python3-certbot-apache -y

If you have a domain name pointing to your Raspberry Pi:

sudo certbot --apache -d your-domain.com

Follow the prompts to complete the setup and choose to redirect HTTP traffic to HTTPS.

For local network use only, you can create a self-signed certificate:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/owncloud-selfsigned.key -out /etc/ssl/certs/owncloud-selfsigned.crt

Then configure Apache to use it:

sudo nano /etc/apache2/sites-available/owncloud-ssl.conf

Add a configuration similar to your existing one but with SSL settings, then enable it:

sudo a2ensite owncloud-ssl.conf
sudo systemctl restart apache2

Step 11: Accessing Your OwnCloud from Anywhere
#

You can now access your OwnCloud through multiple methods:

  • Web browser: Navigate to https://your-domain.com/owncloud or https://your-pi-ip/owncloud
  • Desktop sync client:
    • Download from owncloud.com/download
    • Install on Windows, macOS, or Linux
    • Connect using your server URL and login credentials
    • Select folders to sync
  • Mobile apps:
    • Available for Android (Google Play Store) and iOS (App Store)
    • Enable automatic photo uploads
    • Access documents on the go

Step 12: Performance Optimization
#

Memory Cache for Faster Access
#

Install Redis for efficient caching:

sudo apt install redis-server php-redis -y
sudo systemctl enable redis-server

Edit the OwnCloud config to use Redis:

sudo nano /var/www/owncloud/config/config.php

Add these lines before the closing );:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
     'host' => 'localhost',
     'port' => 6379,
],

Restart Apache:

sudo systemctl restart apache2

File System Cache
#

For better performance with large files:

sudo nano /var/www/owncloud/config/config.php

Add:

'filelocking.enabled' => true,
'filesystem_check_changes' => 1,

Database Optimization
#

Run these commands periodically to optimize database performance:

sudo -u www-data php /var/www/owncloud/occ db:convert-filecache-bigint
sudo -u www-data php /var/www/owncloud/occ db:add-missing-indices

Step 13: Automated Maintenance
#

Automated Backups
#

Create a comprehensive backup script:

sudo nano /home/pi/owncloud-backup.sh

Add this enhanced content:

#!/bin/bash
# OwnCloud backup script with retention

# Configuration
BACKUP_DIR="/path/to/backup"
RETENTION_DAYS=14
DATE=$(date +"%Y-%m-%d")
BACKUP_NAME="owncloud_$DATE"
FULL_BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"

# Create backup directory
mkdir -p $FULL_BACKUP_PATH

# Log start time
echo "Backup started at $(date)" > $FULL_BACKUP_PATH/backup.log

# Put OwnCloud in maintenance mode
echo "Enabling maintenance mode..." >> $FULL_BACKUP_PATH/backup.log
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on

# Backup database
echo "Backing up database..." >> $FULL_BACKUP_PATH/backup.log
sudo mysqldump --single-transaction -u root -p'your-database-password' owncloud > $FULL_BACKUP_PATH/owncloud-db.sql

# Backup config and data
echo "Backing up config files..." >> $FULL_BACKUP_PATH/backup.log
sudo cp -r /var/www/owncloud/config $FULL_BACKUP_PATH/
echo "Backing up data files..." >> $FULL_BACKUP_PATH/backup.log
sudo rsync -avz --info=progress2 /mnt/owncloud-data/ $FULL_BACKUP_PATH/data/

# Exit maintenance mode
echo "Disabling maintenance mode..." >> $FULL_BACKUP_PATH/backup.log
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off

# Compress the backup
echo "Compressing backup..." >> $FULL_BACKUP_PATH/backup.log
tar -czf $BACKUP_DIR/$BACKUP_NAME.tar.gz -C $BACKUP_DIR $BACKUP_NAME
rm -rf $FULL_BACKUP_PATH

# Remove old backups
echo "Cleaning up old backups..." >> $BACKUP_DIR/cleanup.log
find $BACKUP_DIR -name "owncloud_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete

echo "Backup completed: $BACKUP_DIR/$BACKUP_NAME.tar.gz" | tee -a $BACKUP_DIR/backup_history.log

Make it executable:

chmod +x /home/pi/owncloud-backup.sh

Add to crontab for weekly backups:

crontab -e

Add:

0 2 * * 0 /home/pi/owncloud-backup.sh

Automatic Updates Check
#

Create a script to check for OwnCloud updates:

sudo nano /home/pi/check-owncloud-updates.sh

Add:

#!/bin/bash
# Check for OwnCloud updates and notify

UPDATE_INFO=$(sudo -u www-data php /var/www/owncloud/occ update:check)

if [[ $UPDATE_INFO == *"Update to"* ]]; then
  echo "OwnCloud update available: $UPDATE_INFO" | mail -s "OwnCloud Update Available" your-email@example.com
fi

Schedule it to run weekly:

0 8 * * 1 /home/pi/check-owncloud-updates.sh

Security Hardening
#

Fail2Ban Integration
#

Install Fail2Ban to protect from brute force attacks:

sudo apt install fail2ban -y
sudo nano /etc/fail2ban/filter.d/owncloud.conf

Create the filter configuration:

[Definition]
failregex = ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":".*","app":"core","method":".*","url":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)"}$
ignoreregex =

Configure the jail:

sudo nano /etc/fail2ban/jail.d/owncloud.conf

Add:

[owncloud]
enabled = true
port = 80,443
filter = owncloud
logpath = /var/www/owncloud/data/owncloud.log
maxretry = 3
bantime = 86400
findtime = 600

Restart Fail2Ban:

sudo systemctl restart fail2ban

Additional Security Measures
#

Create a more restrictive .htaccess file:

sudo nano /var/www/owncloud/.htaccess

Add these rules to the top:

# Disable directory listing
Options -Indexes

# Block access to sensitive files
<FilesMatch "^\.(?!well-known)|~$|^#.*#$|\.bak$|\.dist$|\.orig$|\.save$|config.php$">
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>

Advanced Features and Customization
#

Installing Additional Apps
#

OwnCloud offers a variety of apps to extend functionality:

  1. Log in to your OwnCloud web interface
  2. Click on your username in the top-right corner and select “Apps”
  3. Browse the “Available apps” section
  4. Click “Enable” on any apps you want to install

Popular apps include:

  • Calendar: Manage events and set reminders
  • Contacts: Store and sync your address book
  • Documents: Collaborative document editing
  • Music: Stream your music collection
  • Gallery: Enhanced photo viewing experience
  • Bookmarks: Sync browser bookmarks across devices

Enabling File Versioning
#

OwnCloud can keep track of file changes, allowing you to restore previous versions:

  1. Log in as admin
  2. Go to Settings → Admin → Additional
  3. Enable “Versions” and configure retention settings:
    • Maximum number of versions: 50 (adjust as needed)
    • Maximum age for versions: 180 days (adjust as needed)

External Storage Integration
#

Connect your OwnCloud to external storage services:

  1. Enable the “External storage support” app
  2. Go to Settings → Admin → Storage
  3. Configure external storage sources:
    • Local: Additional folders on your server
    • External: FTP, SFTP, WebDAV, Samba shares
    • Cloud: Amazon S3, Google Drive, Dropbox

Troubleshooting Common Issues
#

Permission Problems
#

If you encounter permission issues:

sudo chown -R www-data:www-data /var/www/owncloud
sudo chown -R www-data:www-data /mnt/owncloud-data
sudo find /var/www/owncloud/ -type d -exec chmod 750 {} \;
sudo find /var/www/owncloud/ -type f -exec chmod 640 {} \;

Connection Issues
#

If you can’t connect to OwnCloud:

  1. Check Apache status: sudo systemctl status apache2
  2. Review Apache error logs: sudo tail -f /var/log/apache2/error.log
  3. Check OwnCloud logs: sudo tail -f /var/www/owncloud/data/owncloud.log
  4. Verify firewall settings: sudo ufw status
  5. Ensure ports are open: sudo ufw allow 80/tcp and sudo ufw allow 443/tcp

File Upload Problems
#

If you can’t upload large files:

  1. Check PHP settings in your custom PHP ini file
  2. Verify Apache timeout settings
  3. Check OwnCloud’s config.php max filesize settings

Clearing File Locks
#

If files get stuck in a locked state:

sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on
sudo mysql -u root -p -e "DELETE FROM owncloud.oc_file_locks WHERE 1"
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off

Conclusion
#

You now have a fully functional, secure, and optimized private cloud solution running on your Raspberry Pi. OwnCloud provides a robust and feature-rich alternative to commercial cloud services, with complete control over your data and privacy.

This self-hosted solution offers several advantages:

  • No monthly fees: Just the one-time cost of the hardware
  • Unlimited expansion: Add larger drives as your needs grow
  • Complete privacy: Your data never leaves your control
  • Customization: Configure exactly how you want it to work
  • Learning opportunity: Gain valuable Linux and server management skills

Keep your OwnCloud installation updated regularly to get the latest features and security patches. With proper maintenance, your self-hosted cloud solution will provide reliable service for storing, syncing, and sharing your files across all your devices for years to come.

Additional Resources
#

Related

Complete Guide: Setting Up Nextcloud on Raspberry Pi
·10 mins
Raspberry Pi Nextcloud Self-Hosted Cloud Storage Server Privacy Linux Tutorial
Complete Raspberry Pi Setup Guide
·10 mins
Raspberry Pi Linux Server Networking Web-Server Remote Access VPN Dynamic DNS Configuration Tutorial
Arch Linux Minimal Installation with KDE Plasma
·4 mins
Linux Arch Kde Installation Tutorial
Download Udacity Courses for Free Using Udacimak
·9 mins
Udacity Online Learning Udacimak Download E-Learning Command Line Tutorial Offline Learning Nanodegree
Download Coursera Courses for Free Using coursera-dlp
·10 mins
Tutorials Coursera Online Learning Coursera-Dlp Download E-Learning Command Line Tutorial Offline Learning
Java Programming Language Book
199 mins
4343203 Study-Material Java Programming Language Book Tutorial