Nextcloud 35 v LXC kontejneru na Proxmoxu: Debian 13, PHP-FPM 8.4, MariaDB a Redis krok za krokem

Nextcloud 35 jsem nainstaloval do samostatného LXC kontejneru na Proxmoxu s Debianem 13, Apachem, PHP-FPM 8.4, MariaDB a Redisem. Data uživatelů jsou na vlastním disku a instalaci jsem dokončil z příkazové řádky, takže instalační stránka nikdy nebyla veřejně dostupná. Popíšu postup, ladění podle stránky Přehled a chybu, kvůli které prohlížeč ukazoval zdrojový kód PHP.

Výchozí stav a požadavky

Proxmox s weby už běžel (viz Webový server v Proxmox LXC). Nextcloud 35 vyžaduje alespoň Debian 13, MariaDB 10.11 a PHP 8.3, PHP 8.2 už nepodporuje. Debian 13 s PHP 8.4 a MariaDB 11.8 tedy odpovídá, a jde o stejný software, jaký používám u webů.

Kontejner a datový disk

Schéma: Nextcloud 35 v LXC kontejneru na Proxmoxu s Apache, PHP-FPM 8.4, MariaDB, Redisem a APCu, datovým diskem na druhém SSD a klienty pro Windows a Android

Kontejner jsem vytvořil přes Create CT ze šablony Debian 13:

NastaveníHodnota
Typunprivileged, nesting zapnutý
Systémový disk16 GB na NVMe
CPU / RAM / swap2 jádra / 4 GB / 512 MB
Síťstatická IPv4 jen pro odchozí spojení, statická veřejná IPv6
Spustit po vytvořeníne, nejdřív přidat datový disk

Datový disk jsem přidal v Resources → Add → Mount Point: 100 GB na druhém SSD, cesta /mnt/ncdata a zapnutá volba Backup, aby se data zahrnula do záloh kontejneru. Mount point jde později zvětšit, zmenšit ne.

Před instalací jsem udělal apt full-upgrade, nastavil časové pásmo a první snapshot čistého systému.

Instalace softwaru

apt install -y apache2 mariadb-server redis-server php-fpm php-mysql php-gd php-curl php-mbstring php-intl php-xml php-zip php-bcmath php-gmp php-apcu php-redis php-imagick php-cli certbot python3-certbot-apache unzip wget sudo
a2enmod proxy_fcgi setenvif rewrite headers env dir mime ssl
a2enconf php8.4-fpm
systemctl restart apache2

Databázi jsem vytvořil s kódováním utf8mb4 a samostatným uživatelem, který má práva jen na ni:

mariadb -e "CREATE DATABASE NAZEV_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mariadb -e "CREATE USER 'UZIVATEL_DB'@'localhost' IDENTIFIED BY 'HESLO_DB';"
mariadb -e "GRANT ALL PRIVILEGES ON NAZEV_DB.* TO 'UZIVATEL_DB'@'localhost'; FLUSH PRIVILEGES;"

Stažení a instalace Nextcloudu

Archiv jsem stáhl z oficiálního serveru a ověřil kontrolním součtem:

wget https://download.nextcloud.com/server/releases/latest.zip
wget https://download.nextcloud.com/server/releases/latest.zip.sha256
sha256sum -c latest.zip.sha256

Důležitý je řádek latest.zip: OK. Hlášení latest.metadata FAILED je neškodné: kontrolní soubor obsahuje i řádek pro soubor, který jsem nestahoval.

Po rozbalení do /var/www/nextcloud patří soubory uživateli www-data. Datová složka na samostatném disku má práva 750. Virtuální host Apache míří na /var/www/nextcloud a má AllowOverride All kvůli souboru .htaccess Nextcloudu.

Instalaci jsem spustil z příkazové řádky. Webový instalátor tak nikdy nebyl dostupný z internetu a nikdo cizí nemohl založit administrátorský účet dřív než já. Hesla se zadávají interaktivně, takže nezůstanou v historii příkazů:

sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
  --database=mysql --database-name=NAZEV_DB --database-user=UZIVATEL_DB \
  --admin-user=VAS_UZIVATEL --data-dir=/mnt/ncdata/data

Základní konfigurace

Další nastavení jsem provedl příkazem occ. Kvůli Cloudflare a HTTPS je důležité, aby Nextcloud generoval odkazy s https:

occ config:system:set trusted_domains 1 --value=cloud.VASE_DOMENA
occ config:system:set overwrite.cli.url --value=https://cloud.VASE_DOMENA
occ config:system:set overwriteprotocol --value=https
occ config:system:set default_phone_region --value=CZ
occ config:system:set memcache.local --value='\OC\Memcache\APCu'
occ config:system:set memcache.distributed --value='\OC\Memcache\Redis'
occ config:system:set memcache.locking --value='\OC\Memcache\Redis'

Aby occ s APCu nehlásil chyby, je potřeba povolit APCu i pro příkazovou řádku (apc.enable_cli=1).

PHP a PHP-FPM

Místo úprav velkého php.ini jsem vytvořil vlastní soubor /etc/php/8.4/fpm/conf.d/90-nextcloud.ini, který aktualizace PHP nepřepíše:

memory_limit = 512M
upload_max_filesize = 2G
post_max_size = 2G
max_execution_time = 3600
output_buffering = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 20000
opcache.save_comments = 1

Výchozí počet procesů PHP-FPM (5) je pro synchronizační klienty několika lidí málo. Nastavil jsem pm.max_children = 20 a zapnul env[PATH], které Nextcloud potřebuje pro některé nástroje.

Úlohy na pozadí

Nextcloud potřebuje každých 5 minut spouštět údržbu. Místo výchozího AJAXu jsem nastavil systémový cron pro uživatele www-data a náročnější údržbu jsem přesunul na noc:

echo "*/5 * * * * php -f /var/www/nextcloud/cron.php" | crontab -u www-data -
occ background:cron
occ config:system:set maintenance_window_start --type=integer --value=1

Hodnota okna údržby je v UTC, takže 1 znamená 3:00 našeho času.

Past: prohlížeč zobrazil zdrojový kód PHP

Po nastavení HTTPS jsem místo přihlašovací stránky viděl v prohlížeči text souboru index.php. Apache posílal soubory PHP jako obyčejný text, protože se při instalaci nespustil příkaz a2enconf php8.4-fpm. Bez něj Apache neví, že má PHP předávat do PHP-FPM.

a2enconf php8.4-fpm
systemctl reload apache2

Únik dat nehrozil. index.php je veřejný kód Nextcloudu a konfigurační soubor s hesly chrání samostatné pravidlo. I tak je dobré po instalaci vždy otevřít web a ověřit, že se PHP opravdu zpracovává.

Bezpečnostní a konfigurační upozornění

Stránka Nastavení správy → Přehled po instalaci ukázala několik upozornění. Takhle jsem je vyřešil:

UpozorněníŘešení
Migrace mimetypůocc maintenance:repair --include-expensive
Nastavení databázeocc db:add-missing-indices, add-missing-columns, add-missing-primary-keys
Chybí hlavička HSTSv HTTPS virtuálním hostu Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
Malý InnoDB logvlastní soubor v /etc/mysql/mariadb.conf.d/: innodb_log_file_size = 256M, innodb_buffer_pool_size = 512M
Chybí podpora SVG v Imagickbalíček libmagickcore-7.q16-10-extra
Identifikátor serveru, AppAPIserverid nastaven, nepotřebné AppAPI vypnuto

Upozornění na pomalé dotazy (slow query log) jsem nechal být. Jde jen o rady pro ladění výkonu, rodinný cloud je nepotřebuje.

Odesílání e-mailů

Pro obnovu hesla a upozornění používá Nextcloud SMTP Gmailu s vlastním heslem pro aplikace. Heslo jde kdykoli zrušit, aniž by to ovlivnilo weby. Nastavení je v Nastavení správy → Základní nastavení → E-mailový server: smtp.gmail.com, port 587, STARTTLS, odesílatel info@VASE_DOMENA nastavený v Gmailu jako alias.

Klienti pro Windows a Android

Klienta pro Windows lze nainstalovat jedním příkazem winget install Nextcloud.NextcloudDesktop. Zvolil jsem režim virtuálních souborů: v Průzkumníku je vidět vše, ale soubor se stáhne až při otevření. Dvě věci je dobré vědět předem:

  • Smazání v počítači smaže soubor i v cloudu, a to i u nestaženého souboru. Pojistkou je koš a verze souborů na serveru.
  • Kdo chce jen ušetřit místo na disku, použije volbu Uvolnit místo. Soubor zůstane v cloudu.

Okno klienta s nastavením není prohlížeč souborů. Soubory se otevírají v Průzkumníku, kde má Nextcloud vlastní položku v levém panelu. Na Androidu jsem nainstaloval oficiální aplikaci. Přihlášení přes ni popisuji v článku Nextcloud za Cloudflare a CGNAT.

Shrnutí

  • Nextcloud 35 běží v samostatném LXC kontejneru s datovým diskem na druhém SSD.
  • Instalace přes occ nenechává veřejně dostupný instalátor.
  • APCu a Redis jako cache, systémový cron a vlastní soubor s nastavením PHP.
  • Po instalaci vždy ověřit, že Apache opravdu zpracovává PHP (a2enconf php8.4-fpm).
  • Stránka Přehled je dobrý kontrolní seznam: všechna závažná upozornění šla vyřešit několika příkazy.

Článek je součástí série Privátní cloud Nextcloud na domácím Proxmoxu.