A Debian-first guide to building your own personal cloud using a free local build and a low-cost upgrade path. The goal here is simple: keep control of your files, understand the system you are using, and build something practical that can grow later.
A personal cloud is a self-hosted system that lets you store, sync, and access your files from multiple devices. Instead of depending completely on a third-party service, you run the storage platform yourself.
In this guide, the software platform is Nextcloud running on Debian. That gives you a web interface, user accounts, file uploads, mobile access, and room to expand later.
Why this matters:
• You control where the data lives.
• You are not fully dependent on someone else’s pricing, policies, or storage limits.
• You learn real Linux, networking, storage, and hardening skills while building something useful.
• It becomes the foundation for later projects like a NAS, remote access, backups, and monitoring.
This page uses one full free build and one low-cost upgrade path.
That means you will first build a working personal cloud on your local network. After that, you will see the most useful upgrades that make it more practical and more reliable.
This is intentional. It is better to build a clean working system first than to pile on complexity too early.
This guide intentionally starts with a local-network build. Do not rush to expose this to the public internet before the system works internally and you understand the basic hardening steps.
Why: A lot of self-hosting problems happen because people expose unstable systems before they understand how the pieces fit together.
For the free build:
• A Debian system you control
• A stable home network
• Storage for your files
• Basic comfort with the terminal
For the low-cost upgrade path:
• Everything above
• A domain name
• A plan for HTTPS and safer remote access
• Optional: separate storage, better backup target, or a reverse proxy
Why this matters: A personal cloud is not just one app. It is storage, networking, web serving, database management, and file protection all working together.
sudo apt update
sudo apt full-upgrade -y
What this does:
sudo apt update refreshes Debian’s package list so the system knows what versions are available.
sudo apt full-upgrade -y installs all available upgrades and automatically answers yes to the prompt.
Why this matters:
You do not want to build a new service on top of stale software. Starting with an updated system removes
a lot of avoidable problems.
What to expect:
You should see package lists download, then upgrades install if any are available. If it says everything is already current, that is fine.
sudo apt install -y apache2 mariadb-server libapache2-mod-php \
php php-gd php-curl php-zip php-xml php-mbstring php-intl \
php-imagick php-bcmath php-gmp php-mysql unzip wget bzip2
What this does:
Installs Apache, MariaDB, PHP, and the PHP modules Nextcloud commonly needs to run properly.
Why this matters:
Nextcloud is a web application. It needs:
• a web server to deliver the site
• PHP to run the application logic
• a database to store app data and configuration
What to expect:
Debian will download and install the packages. This may take a few minutes.
sudo systemctl enable apache2
sudo systemctl enable mariadb
What this does:
Configures both services to start automatically whenever the system boots.
Why this matters:
If you skip this, the cloud may stop working after a reboot until you start the services manually.
What to expect:
Usually just a short confirmation message. No dramatic output is normal.
sudo mysql_secure_installation
What this does:
Runs MariaDB’s basic hardening wizard and walks you through removing insecure defaults.
Why this matters:
Default database configurations are often more permissive than they should be for a real service.
What to expect:
You will be prompted through a series of questions. In general, removing anonymous users, removing the test database,
and disallowing remote root login are good choices.
sudo mysql
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
What this does:
Creates a dedicated database called nextcloud and a dedicated database user called nextclouduser.
Why this matters:
It is better to give the application its own database and account than to reuse broad database access.
This keeps things cleaner and safer.
What to expect:
MariaDB usually gives no dramatic output if the commands succeed. That is normal.
sudo mkdir -p /srv/nextcloud-data
sudo chown -R www-data:www-data /srv/nextcloud-data
sudo chmod 750 /srv/nextcloud-data
What this does:
mkdir -p creates the folder that will hold uploaded files.
chown -R www-data:www-data gives ownership to Apache’s web user.
chmod 750 sets permissions so the owner has full access, the group has limited access,
and everyone else gets nothing.
Why this matters:
You do not want user data mixed into the application folder. Keeping app files and user data separate
is cleaner, safer, and easier to back up later.
What to expect:
These commands usually produce no output if they work. That is normal.
Important note:
Make sure the drive holding /srv/nextcloud-data has enough free space before you start uploading files.
cd /tmp
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
tar -xjf latest.tar.bz2
sudo mv nextcloud /var/www/
What this does:
Downloads the latest Nextcloud archive, extracts it, and moves the application into Apache’s web directory area.
Why this matters:
This is the application itself. Without it, there is nothing for Apache to serve.
What to expect:
The archive downloads, extracts, and then the folder is moved into place.
sudo chown -R www-data:www-data /var/www/nextcloud
sudo find /var/www/nextcloud -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud -type f -exec chmod 640 {} \;
What this does:
The first command sets ownership of the application files to Apache’s web user.
The find commands then apply directory and file permissions across the app tree.
Why this matters:
Nextcloud needs correct ownership and permissions to function, and sloppy file permissions are never a good habit.
What to expect:
Usually no output on success.
sudo ls /etc/php/
What this does:
Lists the PHP version directories installed on your system.
Why this matters:
Debian versions vary. Hardcoding a path like /etc/php/8.2/ can break on systems using a different PHP version.
What to expect:
You should see something like 8.2 or another version number.
sudo nano /etc/php/VERSION/apache2/php.ini
Replace VERSION with the version you saw in the previous step.
Set or update these values:
memory_limit = 512M
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
sudo systemctl restart apache2
What this does:
Opens PHP’s main Apache config file, adjusts memory and upload settings, then restarts Apache so the changes take effect.
Why this matters:
Without sensible PHP limits, uploads can fail and larger operations may behave badly.
What to expect:
After restarting Apache, there should be no error output. If Apache fails to restart, there is probably a typo in the config file.
sudo nano /etc/apache2/sites-available/nextcloud.conf
Paste this:
<VirtualHost *:80>
ServerName your-ip
ServerAlias localhost
DocumentRoot /var/www/nextcloud
DirectoryIndex index.php index.html
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>
What this does:
Tells Apache where the Nextcloud files live, what to use as the main index files,
and what directory behavior to allow.
Why this matters:
Apache needs a site definition before it can properly serve the app.
sudo a2ensite nextcloud.conf
sudo a2enmod rewrite headers env dir mime
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
What this does:
a2ensite enables the Nextcloud site config.
a2enmod enables the Apache modules Nextcloud depends on.
a2dissite 000-default.conf disables Apache’s default site so it does not conflict with your new one.
systemctl reload apache2 reloads Apache without a full stop/start cycle.
Why this matters:
Nextcloud depends on URL rewriting and proper header handling, and the default site can interfere with a clean setup.
What to expect:
Apache should reload without errors.
sudo systemctl status apache2
What this does:
Shows whether Apache is running correctly.
Why this matters:
This gives you an immediate sanity check before you move on to browser testing.
What to expect:
You want to see it marked as active and running.
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
What this does:
Installs UFW, allows SSH for administration, allows HTTP for the local setup,
and pre-allows HTTPS for later expansion.
Why this matters:
Even internal systems should start with a basic firewall posture instead of being left wide open.
What to expect:
UFW may warn that enabling the firewall can disrupt existing SSH sessions. That is normal.
Since OpenSSH is being allowed first, your admin access should remain intact.
ip a
What this does:
Shows the network interfaces and their IP addresses.
Why this matters:
You need the local IP in order to reach the server from a browser on your network.
What to expect:
Look for your main network interface and find the inet address, usually something like
192.168.x.x.
Open:
http://YOUR-IP
Use these values during setup:
• Data folder: /srv/nextcloud-data
• Database user: nextclouduser
• Database password: the password you created earlier
• Database name: nextcloud
• Database host: localhost
What this does:
Completes the web-based Nextcloud installation and connects the app to the database and data directory.
Why this matters:
This is the step where the pieces you prepared get tied together into a working cloud platform.
If the page does not load:
• check Apache is running
• confirm the IP address is correct
• check your firewall rules
• make sure the server is actually on the same network you expect
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 1 --value=YOUR-IP
What this does:
Adds the IP address you are using to Nextcloud’s trusted domain list.
Why this matters:
Nextcloud blocks access from unknown domains and addresses for security reasons. If you access the service
using an address it does not trust, it will complain.
What to expect:
The command should return confirmation that the config value was set.
Keep the system updated
Run updates regularly:
sudo apt update
sudo apt full-upgrade -y
Why: Most real-world attacks target known vulnerabilities that already have patches.
Use strong credentials
Your Nextcloud admin account and database password should be strong and unique.
Why: Weak credentials are one of the easiest ways systems get compromised.
Do not expose this system publicly yet
Keep this build on your local network until you understand HTTPS, reverse proxies, and secure remote access.
Why: A working system is not the same as a secure system.
Restrict database access
The database should only be accessible locally.
Why: Exposing a database externally dramatically increases risk.
Back up your data and database
Back up both:
• /srv/nextcloud-data
• the MariaDB database
Why: Without backups, a failure or mistake can permanently destroy your data.
Monitor basic service status
sudo systemctl status apache2
sudo systemctl status mariadb
Why: Knowing when services fail is part of maintaining a secure system.
• Log in through the web interface
• Upload a small file
• Download the same file
• Reboot the server
• Confirm Apache, MariaDB, and the web app still come back properly
Why this matters: A successful install is not the same thing as a reliable service. Testing proves the build is actually usable.
• Add a real domain name
• Add HTTPS before public exposure
• Move data to a dedicated storage drive if needed
• Add backups immediately
• Put it behind a reverse proxy or a safer remote-access design later
Why this matters: The free local build is enough to learn and get value. The low-cost path is what turns it into a more polished and resilient service.
• A Debian NAS for larger storage
• A secure remote access server
• Centralized backups
• Monitoring and log visibility