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

Kontejner jsem vytvořil přes Create CT ze šablony Debian 13:
| Nastavení | Hodnota |
|---|---|
| Typ | unprivileged, nesting zapnutý |
| Systémový disk | 16 GB na NVMe |
| CPU / RAM / swap | 2 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 apache2Databá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.sha256Dů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/dataZá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 = 1Vý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=1Hodnota 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áze | occ db:add-missing-indices, add-missing-columns, add-missing-primary-keys |
| Chybí hlavička HSTS | v HTTPS virtuálním hostu Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" |
| Malý InnoDB log | vlastní soubor v /etc/mysql/mariadb.conf.d/: innodb_log_file_size = 256M, innodb_buffer_pool_size = 512M |
| Chybí podpora SVG v Imagick | balíček libmagickcore-7.q16-10-extra |
| Identifikátor serveru, AppAPI | serverid 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
occnenechá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.