This instance of NextCloud will be installed directly on the server. If you wish to use Docker or Snap instead, see the previous post [Link].

If you don’t have Apache + PHP + MySQL running, follow these steps before starting with NextCloud:

sudo apt update && sudo apt upgrade -y
sudo apt install apache2 -y
sudo systemctl start mysql && sudo systemctl enable mysql
sudo systemctl start apache2 && sudo systemctl enable apache2
sudo apt install php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl} -y
sudo apt install mysql-server -y
sudo systemctl start mysql && sudo systemctl enable mysql

Configuring Apache VHost

sudo nano /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews
  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>
sudo a2enmod rewrite headers env dir mime
sudo systemctl restart apache2

Installing NextCloud

wget https://download.nextcloud.com/server/releases/nextcloud-29.0.3.zip
sudo apt install unzip -y
sudo rm -rf /var/www/html
sudo unzip nextcloud-29.0.3.zip -d /var/www/
sudo mv /var/www/nextcloud /var/www/html
sudo chown -R www-data:www-data /var/www/html/
sudo apt install php8.3-mysql php8.3-zip php8.3-dom php8.3-xml php8.3-gd -y

Get the latest release at [Link].

MySQL Configuration

Create the database, user, and privileges, then flush:

sudo mysql
CREATE DATABASE nextcloud_db;
CREATE USER nextcloud_user@localhost IDENTIFIED BY 'nextcloud_password';
GRANT ALL PRIVILEGES ON nextcloud_db.* TO nextcloud_user@localhost;
FLUSH PRIVILEGES;
EXIT;

UI Installation

Navigate to http://example.com and complete the setup through the web UI.

Create the admin account, then enter your database credentials.

Feel free to install plugins to test them in a sandbox, but avoid using them in production (publicly reachable) whenever possible.

Done!


BONUS

OwnCloud is another open source alternative to NextCloud. Try it out and see which one suits your needs:

sudo apt install docker.io -y
sudo docker run --name OwnCloud --restart=unless-stopped -v /opt/OwnCloudData:/mnt/data/ -d -e OWNCLOUD_DOMAIN=owncloud.example.com:8080 -p80:8080 owncloud/server