Instalacja i konfiguracja Nextcloud na maszynie wirtualnej ProxmoX VE z Ubuntu 22.04

Opis oprogramowania Nextcloud

Nextcloud to oprogramowanie w architekturze klient-serwer do tworzenia i korzystania z usług hostingu plików i współpracy grupowej. Jest gotowy do pracy w domach, małych firmach i dużych przedsiębiorstwach z kompleksowymi opcjami wsparcia. Jest to wolne i otwarte oprogramowanie, każdy może je zainstalować i używać na swoich własnych serwerach. Stworzenie własnej chmury danych nigdy nie było takie proste i bezpieczne.

Przygotowanie maszyny wirtualnej Proxmox dla Nextcloud

Maszyna wirtualna na potrzeby systemu Ubuntu 22.04 z oprogramowanie Nextcloud ma następujące parametry: 2 vCPU / 2 GB RAM (średnio 700-800 MB zajęte)/ pierwszy dysk 16 GB HDD  na system (3,9 GB bez swapa zajęte) /drugi dysk 512 GB na partycję /var.

Instalacja Ubuntu 22.04 w maszynie wirtualnej Proxmox VE

Proces instalacji Ubuntu 22.04 w maszynie wirtualnej Proxmox VE został opisany na stronie Instalacja Ubuntu 22.04 w maszynie wirtualnej Proxmox VE – IT Admin (vblog.ovh)

Wstępna konfiguracja systemu Ubuntu 22.04

Proces przygotowania systemu Ubuntu do pracy pomiędzy zakończeniem pracy instalatora Ubuntu a instalacją właściwego oprogramowania np. Nextcloud opisany jest na stronie Konfiguracja i konserwacja systemu Linux Ubuntu – IT Admin (vblog.ovh)

Instalacja i konfiguracja oprogramowania potrzebnego do uruchomienia serwera Nextcloud

Instalacja pakietów oprogramowania Apache + PHP

sudo apt install -y php-cli php-fpm php-json php-intl php-imagick php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath apache2 libapache2-mod-php php-gmp php-bcmath
sudo apt-get install libmagickcore-6.q16-6-extra php-imagick imagemagick

Konfiguracja PHP

sudo nano /etc/php/8.1/apache2/php.ini
# lub jeśli instalowaliśmy php-fpm to:
sudo nano /etc/php/8.1/fpm/php.ini

date.timezone = Europe/Warsaw
memory_limit = 512M
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 600

# włączenie konfiguracji php-fpm w apache
sudo a2enconf php8.1-fpm

Konfiguracja Apache 2

# usuwamy niepotrzebną konfigurację domyślną Apache 2
sudo rm -rf /etc/apache2/sites-available/000-default.conf
sudo rm -rf /etc/apache2/sites-available/default-ssl.conf
sudo rm -rf /etc/apache2/sites-enabled/000-default.conf

# tworzymy nową konfigurację http z rewrite na https
sudo nano /etc/apache2/sites-available/cloud.netapps.ovh.conf

<VirtualHost *:80>
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =www.cloud.netapps.ovh [OR]
        RewriteCond %{SERVER_NAME} =cloud.netapps.ovh
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
     ServerAdmin [email protected]
     DocumentRoot /var/www/html/cloud.netapps.ovh
     ServerName cloud.netapps.ovh
     ServerAlias www.cloud.netapps.ovh
     ErrorLog /var/log/apache2/cloud.netapps.ovh-error.log
     CustomLog /var/log/apache2/cloud.netapps.ovh-access.log combined

    <Directory /var/www/html/cloud.netapps.ovh/>
        Options FollowSymlinks MultiViews
        AllowOverride All
        Require all granted
        SetEnv HOME /var/www/html/cloud.netapps.ovh
        SetEnv HTTP_HOME /var/www/html/cloud.netapps.ovh
        <IfModule mod_dav.c>
          Dav off
         </IfModule>
    </Directory>
<IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>    

SSLEngine on
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off
SSLOptions +StrictRequire

SSLCertificateFile /etc/cert/cloud.netapps.ovh/fullchain.pem
SSLCertificateKeyFile /etc/cert/cloud.netapps.ovh/privkey.pem
Protocols h2 http/1.1

</VirtualHost>
</IfModule>

# dodajemy nową konfigurację vhost do Apache 2
sudo a2ensite cloud.netapps.ovh

# włączamy potrzebne moduły Apache 2
sudo a2enmod rewrite dir mime env headers ssl

# restartujemy usługę Apache 2
sudo systemctl restart apache2

Instalacja i konfiguracja MariaDB

sudo apt -y install mariadb-server

Przygotowanie bazy danych nextcloudatabase dla Nextcloud

sudo mysql -u root
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root';
FLUSH PRIVILEGES;
QUIT;

CREATE USER 'nextclouduser'@'localhost' identified by 'haslouser';
CREATE DATABASE nextcloudatabase;
GRANT ALL PRIVILEGES ON nextcloudatabase.* TO 'nextclouduser'@'localhost'; FLUSH PRIVILEGES;
QUIT;

Instalacja oprogramowania Nextcloud

cd /var/www/html/
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
tar -xvf latest.tar.bz2
mv nextcloud cloud.netapps.ovh
sudo chown -R www-data:www-data /var/www/html/cloud.netapps.ovh/
rm /var/www/html/latest.tar.bz2

# przygotowanie katalogu na składowanie plików Nextcloud użytkowników
mkdir -p /var/datastore

Wchodzimy przez przeglądarkę na adres naszego serwera Nextcloud i podajemy nazwę admistatora oraz hasło. Następnie możemy już tworzyć zwykłych użytkowników Nextcloud.

Zaawansowana konfiguracja Nextcloud

Dostosowanie konfiguracji Nextcloud przez edycję config.php. Wszystkie możliwe opcje są opisane na stronie https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html. W poniższym przykładzie włączona jest konfiguracja powiadamiania emailem o wybranych zdarzeniach w Nextcloud oraz PHP opcache (APCU).

sudo nano /var/www/html/cloud.netapps.ovh/config/config.php

<?php
$CONFIG = array (
  'instanceid' => 'sdsdsdsdsadwe212',
  'passwordsalt' => 'asdsadewewqe222121221',
  'secret' => 'eTJkuKj1h7owwwwwswgiTKmq8nQE6z61212121',
  'trusted_domains' =>
  array (
    0 => 'cloud.netapps.ovh',
    1 => '192.168.8.29',
  ),
  'datadirectory' => '/var/datastore',
  'dbtype' => 'mysql',
  'version' => '26.0.3.2',
  'overwrite.cli.url' => 'https://cloud.netapps.ovh',
  'htaccess.RewriteBase' => '/',
  'dbname' => 'nextcloudatabase',
  'dbhost' => 'localhost',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextclouduser',
  'dbpassword' => 'haslouseranc',
  'installed' => true,
  'log_type' => 'owncloud',
  'logfile' => '/var/log/nextcloud.log',
  'loglevel' => '2',
  'log_rotate_size' => '104857600',
  'logtimezone' => 'Europe/Warsaw',
  'auth.bruteforce.protection.enabled' => false,
  'app_install_overwrite' =>
  array (
    0 => 'files_ebookreader',
    1 => 'admin_notifications',
    2 => 'files_trackdownloads',
    3 => 'mindmap_app',
    4 => 'discoursesso',
  ),
  'mail_smtpmode' => 'smtp',
  'mail_sendmailmode' => 'smtp',
  'mail_smtphost' => 'ssl0.ovh.net',
  'mail_smtpport' => '465',
  'mail_smtpsecure' => 'ssl',
  'mail_smtpauth' => 1,
  'mail_smtpauthtype' => 'LOGIN',
  'mail_smtpname' => '[email protected]',
  'mail_smtppassword' => 'haslodopoczty,',
  'mail_from_address' => 'sysnotify',
  'mail_domain' => 'wp.pl',
  'mail_smtpdebug' => true,
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'default_phone_region' => 'GB',
  'force_locale' => 'pl_PL',
  'defaultapp' => 'dashboard,files',
  'knowledgebaseenabled' => false,
  'auto_logout' => false,
  'maintenance' => false,
  'theme' => '',
);
# zmiana w /var/www/html/cloud.netapps.ovh/config/config.php (Pretty links bez index.php w adresie)
'htaccess.RewriteBase' => '/',
# wymaga wykonania polecenia
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ maintenance:update:htaccess

Udostępnienia katalogu NextCloud przez Sambę w sieci wewnętrznej

Może zaistnieć potrzeba wrzucania do katalogu wybranego użytkownika Nextcloud bezpośrednio plików przez sieć lokalną np. przez protokół SMB

sudo apt install samba
sudo systemctl enable --now smbd
sudo ufw allow samba
sudo useradd -d /var/datastore/zibitest/files -s /sbin/nologin nextcloud
sudo smbpasswd -a nextcloud
sudo systemctl enable --now smbd
mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

Poniżej przykładowa konfiguracja udostępnienia plików usera zibitest przez użytkownika samby o nazwie nextcloud

sudo nano /etc/samba/smb.conf 

[global]
   workgroup = WORKGROUP
   server string = %h server (Samba, Ubuntu)
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes

[Nextcloud]
    path = /var/datastore/zibitest/files
    browseable = yes
    read only = no

    create mask = 644
    force create mode = 644
    security mask = 644
    force security mode = 644

    #force create mode = 0644
    force directory mode = 0755
    directory mask = 0755
    directory security mask = 0755
    force directory security mode = 0755

    force user = www-data
    valid users = nextcloud @sadmin

Należy pamiętać aby tak wrzucone z zewnątrz pliki dodać do bazy danych Nextcloud poleceniem

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ files:scan zibitest
sudo chown -R www-data:www-data /var/datastore/zibitest/files/

lub korzystając z usługi cron cyklicznie jak w przykładzie na stronie https://itadmin.vblog.ovh/instalacja-i-konfiguracja-nextcloud-na-maszynie-wirtualnej-proxmox-ve-z-ubuntu-22-04/#Nextcloud_cron_czyli_automatyczne_wykonywanie_roznych_zadan_w_tle

Nextcloud cron czyli automatyczne wykonywanie różnych zadań w tle

W cronie użytkownika root dodajemy następujące wpisy modyfikując je pod swoją konfigurację

crontab -e

*/5  *  *  *  * sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/cron.php
*/15  *  *  *  *  sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ files:scan zibitest 2>&1
*/5  *  *  *  * /usr/bin/chown -R www-data:www-data /var/datastore/zibitest/files/ > /dev/null 2>&1

Wtedy w menu Basic settings administratora Nextcloud należy pamiętać aby wybrać opcję Cron dla pozycji Background jobs.

Więcej ciekawych informacji o zadaniach w tle w Nextcloud można znaleźć na stronie https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html

Instalacja i aktualizacja certyfikatu SSL Let’s Encrypt dla Nextcloud

W moim przypadku generowanie i dystrybucja certyfikatu SSL Let’s Encrypt odbywa się centralnie przez kontener LXC z certbotem, Stamtąd pliki certyfikatu pobierane są na poszczególne serwery i usługi np. Nextcloud.  Dodatkowe informacje na temat odnowienia certyfikatu SSL Let’s Encrypt dla serwera Nextcloud znajdują się na stronie Let’s Encrypt wildcard dystrybucja certyfikatu SSL w sieci wewnętrznej – IT Admin (vblog.ovh)

Aktualizacja Nextcloud z linii komend

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/updater/updater.phar

Should the "occ upgrade" command be executed? [Y/n] n
Keep maintenance mode active? [y/N] y

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ upgrade

#aktualizacja aplikacji dodatkowych
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ app:update --all
richdocumentscode new version available: 23.5.5
richdocumentscode updated
spreed new version available: 16.0.4
spreed updated
quicknotes new version available: 0.8.10
quicknotes updated

# dodanie brakujących indeksów po aktualizacji Nextcloud
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ db:add-missing-indices

# wyłączenie trybu maintenance Nextcloud
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ maintenance:mode --off

# w razie problemów z aktulizacją np. Upgrade stuck at “Step 4 is currently in process
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ maintenance:repair

Konfiguracja powiadomień emailowych Nextcloud

W tym przypadku zamiast Postfixa, którego przykład konfiguracji dla OVH przedstawiono na stronie https://itadmin.vblog.ovh/proxmox-ve-powiadamianie-emailowe-przez-postfix-na-zewnetrzny-serwer-poczty/ wybrałem rozwiązanie o nazwie ssmtp.

sudo apt install mailutils
sudo apt-get install ssmtp
sudo apt-get install bsd-mailx

sudo nano /etc/ssmtp/ssmtp.conf

[email protected]
mailhub=smtp.office365.com:587
[email protected]
AuthPass=sadsadsa123
UseTLS=YES
UseSTARTTLS=YES
hostname=wp.com.pl
rewriteDomain=wp.com.pl
AuthMethod=LOGIN
FromLineOverride=YES
Debug=YES

sudo nano /etc/ssmtp/revaliases
root:[email protected]:smtp.office365.com:587

# w razie problemów z polem od
sudo chfn -f 'Powiadomienia Nextcloud' root

# test działania emaila z linii komend
echo "Hello, World" | mail -s "Email Test" [email protected]

Jako administrator Nextcloud możemy w menu Basic settings ustawiać czy chcemy być powiadamiani o nowościach Nextcloud czy też poprzez menu Notifications dla wszystkich użytkownikó o ważnych zmianach dotyczących naszych plików czy też dostępu.


Rozwiązywanie najczęstszych problemów z Nextcloud

Nie działające Pretty links

# po zmianach w pliku /var/www/html/cloud.netapps.ovh/config/config.php
sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ maintenance:update:htaccess

Problem z brakującymi indeksami po aktualizacji occ db:add-missing-indices

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ db:add-missing-indices

Problem z bigint po aktualizacji Nextcloud

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ db:convert-filecache-bigint

Nie działający prawidłowo PHP cache opcache.interned_strings_buffer

sudo nano /etc/php/8.1/fpm/php.ini
opcache.interned_strings_buffer=16

Zablokowany dostęp do pliku w Nextcloud

You can’t access files because they are locked and you find such errors in your logfile:

{"reqId":"0DijSqEkfOg2iyh9VD8J","remoteAddr":"xx.xx.xx.xx","app":"webdav","message":"Exception: {\"Message\":\"HTTP\\\/1.1 423 \\\"path\\\/file.extension\\\" is locked\",\"Exception\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\Exception\\\\FileLocked\",\"Code\":0,\"Trace\":\"#0

Manually disable locking state:

put Nextcloud in maintenance mode: edit config/config.php and change this line:
'maintenance' => true,
Empty table oc_file_locks: Use tools such as phpmyadmin or connect directly to your database and run (the default table prefix is oc_, this prefix can be different or even empty):
DELETE FROM oc_file_locks WHERE 1
disable maintenance mode (undo first step).

Usunięcie z kosza plików wszystkich użytkowników Nextcloud

sudo -u www-data /usr/bin/php --define apc.enable_cli=1 /var/www/html/cloud.netapps.ovh/occ trashbin:cleanup --all-users