[{"data":1,"prerenderedAt":251},["ShallowReactive",2],{"seo-verification":3,"blog-hosting-nextcloud-on-your-own-vps-ma-en":6,"promo-bar-likely":250},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-hosting-nextcloud-on-your-own-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":183,"ctaBody":184,"ctaButton":185,"ctaUrl":186,"relatedPosts":187},71,"hosting-nextcloud-on-your-own-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","alojar-nextcloud-en-su-propio-vps","Self-Host Nextcloud on VPS: NC 35, PHP 8.3 and MariaDB 11 Guide","Host Nextcloud on a VPS: Docker Compose, Redis, MariaDB backup, uploads over 40 GB behind Cloudflare and an alternative to Office 2021.",20,1,false,"2026-04-10T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":34},"nextcloud","Nextcloud is one of the most widely deployed self-hosted applications — and one of the most misconfigured. Between instances running without Redis, without forced TLS, the May 2026 update patching two critical 2FA bypass vulnerabilities, and now the NC 34.0.0-specific regressions — recommended apps missing at first launch, a duplicated PostgreSQL constraint that can spike CPU — every release brings its own pitfalls. Nextcloud 35 (Hub 26 Summer, released September 15, 2026) adds two major constraints: PHP 8.3 is now the minimum requirement (PHP 8.2 is abandoned), and MariaDB 11 removes the mysqldump binary. This guide takes you from a complete installation to security verification, covering NC 34.0.2 fixes, the NC 35 upgrade path, and the 5 most common mistakes.",[37,41,44,47,50,69,72,75,78,82,85,94,115,118,121,124,127,130,162,165,168,171,174,177,180],{"type":38,"title":39,"body":40},"h2","Security Alert — May 2026 2FA Bypass CVEs","In May 2026, two critical two-factor authentication bypass vulnerabilities were disclosed in Nextcloud:\n\n**CVE-2026-45690** (CVSS score 5.9, disclosed May 15, 2026): an attacker with a username and password can bypass 2FA verification using **HTTP Basic Auth** (basic authentication via the `Authorization: Basic base64(user:pass)` header). Nextcloud, in affected versions, accepted HTTP Basic Auth even when 2FA was enabled for the targeted account.\n\n**CVE-2026-45691** (CVSS score 5.9, disclosed May 13, 2026): same vulnerability class, exploitable via a **DAV Bearer token** — the WebDAV protocol used by desktop sync clients (Nextcloud Desktop, Nautilus, Finder).\n\nBoth CVEs are fixed in **Nextcloud 32.0.9** (branch 32) and **33.0.3** (branch 33). Branches 34.x and above are not affected. **Check if your instance is vulnerable** (see dedicated section below).",{"type":38,"title":42,"body":43},"NC 34.0.0 — Recommended Apps Missing on First Launch","Nextcloud 34.0.0 introduces a regression in the installation wizard: recommended apps (Notes, Calendar, Contacts) are **not offered** during initial setup. The suggested apps list stays empty, regardless of the installation profile selected.\n\n**Practical impact:** a fresh NC 34.0.0 instance lacks the basic productivity apps. Users expecting CalDAV calendar or CardDAV contact sync must install them manually from the admin interface.\n\n**Sources:** GitHub issues \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextcloud\u002Fserver\u002Fissues\u002F61313\">#61313\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextcloud\u002Fserver\u002Fissues\u002F61611\">#61611\u003C\u002Fa> — fixed in **34.0.2**.\n\n**Check if your apps are present:**\n\n```bash\ndocker compose exec -u www-data app php occ app:list | grep -E 'calendar|contacts|notes'\n```\n\nIf the command returns nothing, the apps are not installed. To add them manually:\n\n```bash\ndocker compose exec -u www-data app php occ app:install calendar\ndocker compose exec -u www-data app php occ app:install contacts\ndocker compose exec -u www-data app php occ app:install notes\n```",{"type":38,"title":45,"body":46},"NC 34.0.0 — Duplicated PostgreSQL Constraint and CPU Spike","On instances using **PostgreSQL** (instead of MariaDB\u002FMySQL), an interrupted Nextcloud 34.0.0 migration can leave a duplicated constraint on the `oc_filecache_extended` table. This duplicate goes unnoticed at startup but triggers a **CPU and RAM spike** during the next file scan (`files:scan`) or automatic maintenance.\n\n**Symptoms:** abnormally high CPU load on the Nextcloud container, a file scan that never completes, log errors like `duplicate key value violates unique constraint`.\n\n**Source:** GitHub issue \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextcloud\u002Fserver\u002Fissues\u002F61597\">#61597\u003C\u002Fa>.\n\n**Verification and fix:**\n\n```bash\ndocker compose exec -u www-data app php occ files:cleanup\ndocker compose exec -u www-data app php occ db:add-missing-indices\ndocker compose exec -u www-data app php occ db:add-missing-columns\n```\n\nIf errors persist, upgrade directly to **34.0.2** which contains the migration fix.",{"type":38,"title":48,"body":49},"Prerequisites and Sizing","Recommended configuration: VPS with **2 GB RAM** (4 GB for more than 5 active users), **SSD required** (many file and thumbnail operations), **20 GB minimum** storage plus data space, Ubuntu 22.04 or Debian 12, Docker Engine ≥ 24, a domain name with TLS certificate, ports 80 and 443 open.",{"type":51,"title":52,"steps":53},"steps","Installing Nextcloud with Docker Compose",[54,57,60,63,66],{"title":55,"body":56},"Step 1 — Create the project structure","Create `\u002Fopt\u002Fnextcloud\u002Fdocker-compose.yml` with MariaDB 10.11, Redis 7-alpine, and Nextcloud `nextcloud:34.0.4-apache`. Bind the app to `127.0.0.1:8080:80`. Set `depends_on: db` and `redis`.",{"title":58,"body":59},"Step 2 — Create the environment file","```bash\ncat > \u002Fopt\u002Fnextcloud\u002F.env \u003C\u003C 'EOF'\nMYSQL_ROOT_PASSWORD=strong_root_password\nMYSQL_PASSWORD=strong_nextcloud_password\nREDIS_PASSWORD=strong_redis_password\nNEXTCLOUD_ADMIN_USER=admin\nNEXTCLOUD_ADMIN_PASSWORD=strong_admin_password\nNEXTCLOUD_DOMAIN=cloud.yourdomain.com\nEOF\n```",{"title":61,"body":62},"Step 3 — Start the containers","```bash\ndocker compose up -d\ndocker compose logs -f app\n```\n\nFirst startup takes 2 to 4 minutes. Wait for `Nextcloud was successfully installed`.",{"title":64,"body":65},"Step 4 — Configure Nginx with TLS","Install Nginx and Certbot, create the Nextcloud site with `client_max_body_size 10G;` and proxy headers, then run `certbot --nginx -d cloud.yourdomain.com`.",{"title":67,"body":68},"Step 5 — Configure the trusted URL in Nextcloud","```bash\ndocker compose exec -u www-data app php occ config:system:set trusted_domains 0 \\\n  --value=cloud.yourdomain.com\ndocker compose exec -u www-data app php occ config:system:set overwrite.cli.url \\\n  --value=https:\u002F\u002Fcloud.yourdomain.com\n```",{"type":38,"title":70,"body":71},"Check if Your Instance is Vulnerable to the 2FA CVEs","**Check current version:**\n```bash\ndocker compose exec -u www-data app php occ status\n```\n\n**Vulnerable versions:** all Nextcloud 32.x \u003C 32.0.9 and 33.x \u003C 33.0.3. Branches 34.x and above are not affected by these CVEs.\n\n**Update to the patched version (branch 32 → 32.0.9, branch 33 → 33.0.3):**\n```bash\n# Branch 32:\nsed -i 's|nextcloud:[0-9.]*-apache|nextcloud:32.0.9-apache|g' docker-compose.yml\n# Branch 33:\n# sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:33.0.3-apache|g' docker-compose.yml\ndocker compose pull app && docker compose up -d app\ndocker compose exec -u www-data app php occ upgrade\n```",{"type":38,"title":73,"body":74},"Optimize Performance with Redis and OPcache","Nextcloud without Redis is a slow Nextcloud. Redis plays two critical roles: **session caching** (avoids disk reads\u002Fwrites on every authenticated request) and **distributed locking** (file locking) which prevents conflicts during simultaneous synchronizations.\n\nVerify Redis is connected:\n```bash\ndocker compose exec -u www-data app php occ config:system:get redis\n```\n\nIf nothing appears, add the Redis config to `config.php` manually.",{"type":38,"title":76,"body":77},"The 5 Most Common Mistakes","1. **Redis not configured** — slow interface, sync conflicts.\n2. **`overwrite.cli.url` pointing to `http:\u002F\u002F`** — insecure share links and emails.\n3. **`trusted_domains` misconfigured** — 'untrusted domain' access denied error.\n4. **Upload size limited to 2 MB** — add `client_max_body_size 10G` in Nginx.\n5. **Missed security updates** — configure update notifications and schedule regular updates.",{"type":79,"title":80,"body":81},"tip","Verify Redis Effectiveness with occ","```bash\ndocker compose exec -u www-data app php occ status\ndocker compose exec -u www-data app php occ check\ndocker compose exec -u www-data app php occ config:system:get redis\n```\n\nThe `occ check` command lists all detected configuration issues. It is the **first diagnostic** to run on any existing Nextcloud instance.",{"type":38,"title":83,"body":84},"Uploads over 40 GB behind Cloudflare: the lost assembly","Nextcloud does not send a large file in one piece: the client splits it into chunks, stored in a temporary folder, then asks the server to **assemble** them with a final `MOVE …\u002F.file` request.\n\nIssue \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextcloud\u002Fserver\u002Fissues\u002F65408\">nextcloud\u002Fserver #65408\u003C\u002Fa>, opened on October 12, 2026 against Nextcloud 35, shows what breaks: a file of about 43 GB dropped through a public share link, every chunk accepted (`201`), then an assembly of about 17 minutes. Cloudflare cuts a response that exceeds its read timeout (125 seconds by default according to its documentation, about 100 seconds measured by the reporter through Cloudflare Tunnel) and returns a `524`.\n\nThe public share entry point, `publicremote.php`, does not call `ignore_user_abort(true)`, unlike `remote.php`: PHP aborts the assembly when the connection closes, then the browser deletes the chunks with a `DELETE` request. Files of 4 to 5 GB still go through. As of October 22, 2026, the issue is open, with no published fix.",{"type":86,"title":87,"items":88},"ul","The limits to align, from the CDN down to PHP",[89,90,91,92,93],"**Cloudflare request body** — 100 MB per request on Free and Pro, 200 MB on Business, up to 5 GB on Enterprise; beyond that, a `413` response. Every chunk must stay below it.","**Chunk size** — `files.chunked_upload.max_size` defaults to 104857600 bytes (100 MiB), slightly more than 100 MB: go down to 50 MiB on Free or Pro.","**CDN timeout** — 125 seconds, raisable up to 6,000 seconds on Enterprise only: this is the limit the assembly exceeds.","**nginx** — `proxy_request_buffering off` passes the body on as it arrives instead of reading it in full; `proxy_read_timeout` defaults to 60 seconds.","**PHP** — the Nextcloud documentation suggests `max_execution_time` and `max_input_time` at 3600; `ignore_user_abort = On` lets the assembly finish after the proxy drops the connection.",{"type":51,"title":95,"steps":96},"Configure Nextcloud for very large uploads",[97,100,103,106,109,112],{"title":98,"body":99},"Move heavy uploads off the proxy","Cloudflare recommends a non-proxied subdomain (DNS-only) for requests running over 125 seconds. Create `upload.your-domain.com` as DNS-only, add it with `docker compose exec -u www-data app php occ config:system:set trusted_domains 1 --value=upload.your-domain.com`, then `certbot --nginx -d upload.your-domain.com`. This name exposes the server IP: reserve it for heavy transfers.",{"title":101,"body":102},"Reduce the chunks","`docker compose exec -u www-data app php occ config:system:set files.chunked_upload.max_size --type int --value 52428800` sets 50 MiB (value in bytes).",{"title":104,"body":105},"Adjust nginx","In `location \u002F`, add `proxy_request_buffering off;` and `proxy_send_timeout 3600s;`, keep `proxy_read_timeout 3600s;`, then `nginx -t && systemctl reload nginx`.",{"title":107,"body":108},"Adjust PHP","Create `\u002Fopt\u002Fnextcloud\u002Fphp-uploads.ini` with `ignore_user_abort = On`, `max_execution_time = 3600` and `max_input_time = 3600`, mount it in the `app` service: `- .\u002Fphp-uploads.ini:\u002Fusr\u002Flocal\u002Fetc\u002Fphp\u002Fconf.d\u002Fzz-uploads.ini:ro`, then `docker compose up -d app`.",{"title":110,"body":111},"Check and test","`docker compose exec app php -i | grep ignore_user_abort` must show `ignore_user_abort => On => On`. Then upload a file of several gigabytes through the subdomain and follow `docker compose logs -f app`.",{"title":113,"body":114},"Choose what goes through Cloudflare","The main domain can stay proxied, with only the heavy-transfer subdomain switched to DNS-only: see \u003Ca href=\"\u002Fen\u002Fblog\u002Fenable-disable-cloudflare-proxy-dns-record\">our guide to the Cloudflare proxy\u003C\u002Fa>.",{"type":38,"title":116,"body":117},"Troubleshooting large uploads: the real messages","**`Error 524: a timeout occurred`** — the response to the final `MOVE …\u002F.file` did not arrive within Cloudflare's timeout. Fix: the non-proxied subdomain.\n\n**`413 Request entity too large`** — a chunk exceeds the Cloudflare plan ceiling or `client_max_body_size`. Fix: reduce `files.chunked_upload.max_size`.\n\n**`Could not open file: web-file-upload-\u003Cid>\u002F75 … file doesn't seem to exist`** — reported in issue #65408: assembly was still running while the browser had deleted the chunks. The reporter blocks the `DELETE` request on `\u002Fpublic.php\u002Fdav\u002Fuploads\u002F`; the `UploadCleanup` job then purges abandoned chunks after 24 hours. With nginx, the equivalent is a `location ^~ \u002Fpublic.php\u002Fdav\u002Fuploads\u002F` block containing `if ($request_method = DELETE) { return 403; }` and the same `proxy_pass`. Unofficial workaround, to remove once a fix ships.\n\n**`504 Gateway Time-out` during the `MOVE`** — nginx gives up: the Nextcloud documentation cites `fastcgi_read_timeout` for PHP-FPM, here `proxy_read_timeout`.",{"type":38,"title":119,"body":120},"Nextcloud Backups — Data, Database and Config","Nextcloud stores data in three places — all three must be backed up:\n\n1. **MariaDB database**: file metadata, users, shares, installed apps.\n2. **`nextcloud` volume**: PHP code, installed apps, and `config\u002Fconfig.php`.\n3. **User files**: default in the Docker volume or in the path set by `datadirectory` in `config.php`.\n\n```bash\n# Enable maintenance mode\ndocker compose exec -u www-data app php occ maintenance:mode --on\n# Backup the database (MariaDB 10.x)\ndocker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud | gzip > \u002Fopt\u002Fnextcloud\u002Fbackups\u002Fdb-$(date +%Y%m%d).sql.gz\n# Disable maintenance mode\ndocker compose exec -u www-data app php occ maintenance:mode --off\n```\n\n**Note for MariaDB 11+:** replace `mysqldump` with `mariadb-dump` (see dedicated section below).",{"type":38,"title":122,"body":123},"Backup with MariaDB 11 — mariadb-dump replaces mysqldump","From **MariaDB 11.0**, the `mysqldump` and `mysql` binaries have been removed from the official Docker image. Only `mariadb-dump` and `mariadb` are available. Scripts still using `mysqldump` with a `mariadb:11.x` image will fail silently.\n\n**Check your MariaDB version:**\n\n```bash\ndocker compose exec db mariadb --version\n```\n\n**Backup script for MariaDB 11+:**\n\n```bash\n#!\u002Fbin\u002Fbash\nDATE=$(date +%Y%m%d)\nBACKUP_DIR=\u002Fopt\u002Fnextcloud\u002Fbackups\nmkdir -p $BACKUP_DIR\n\ndocker compose exec -u www-data app php occ maintenance:mode --on\n\n# mariadb-dump replaces mysqldump on MariaDB 11+\ndocker compose exec -T db \\\n  mariadb-dump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \\\n  | gzip > $BACKUP_DIR\u002Fdb-$DATE.sql.gz\n\nif gzip -t $BACKUP_DIR\u002Fdb-$DATE.sql.gz 2>\u002Fdev\u002Fnull; then\n  echo \"Backup OK: $BACKUP_DIR\u002Fdb-$DATE.sql.gz\"\nelse\n  echo \"ERROR: corrupted or empty archive\"\n  docker compose exec -u www-data app php occ maintenance:mode --off\n  exit 1\nfi\n\ndocker compose cp app:\u002Fvar\u002Fwww\u002Fhtml\u002Fconfig\u002Fconfig.php $BACKUP_DIR\u002Fconfig-$DATE.php\ndocker compose exec -u www-data app php occ maintenance:mode --off\n```\n\n**Restore:**\n\n```bash\ngunzip -c $BACKUP_DIR\u002Fdb-$DATE.sql.gz | \\\n  docker compose exec -T db mariadb -u nextcloud -p${MYSQL_PASSWORD} nextcloud\n```\n\n**Note:** if you stay on `mariadb:10.11` (EOL February 2028), both `mysqldump` and `mariadb-dump` work. The removal only affects MariaDB 11.0 and above.",{"type":38,"title":125,"body":126},"Next Steps — Go Further with Your Instance","Once Nextcloud is installed and secured:\n\n**Enable Talk (video conferencing):** install the Nextcloud Talk app from the admin interface. For meetings with more than 4–5 participants, a TURN server is required (Coturn on a dedicated VPS).\n\n**Enable OnlyOffice or Collabora Online:** these apps require their own Docker container and Nextcloud Office configuration.\n\n**Monitor your instance:** configure alerts in **Administration → Monitoring** to receive email notifications if Nextcloud detects configuration errors, security updates, or quota issues.",{"type":38,"title":128,"body":129},"Office 2021 End of Life: Enable Co-editing with Collabora Online or OnlyOffice","Microsoft Office 2021 reached **end of life on October 13, 2026**: no further security patches will be released. For teams co-editing `.docx`, `.xlsx`, and `.pptx` files inside Nextcloud, two open-source office suites cover this need directly from the web interface.\n\n**Collabora Online** is the online version of LibreOffice, distributed under the AGPL license. It integrates with Nextcloud via the *Nextcloud Office* app and runs in a separate container based on `collabora\u002Fcode:latest`, communicating with Nextcloud over WebSocket.\n\n**OnlyOffice Document Server** offers an interface closer to Microsoft Office — ribbon menus and toolbars familiar to Windows users. It is also AGPL-licensed and integrates via the *ONLYOFFICE* app from the Nextcloud App Store.\n\n**Install via the Nextcloud App Store:**\n\n```bash\n# Collabora Online\ndocker compose exec -u www-data app php occ app:install richdocuments\n\n# OnlyOffice\ndocker compose exec -u www-data app php occ app:install onlyoffice\n```\n\n**Separate Docker deployment — Collabora Online example:**\n\nAdd this service to your `docker-compose.yml`:\n\n```yaml\n  collabora:\n    image: collabora\u002Fcode:latest\n    restart: unless-stopped\n    environment:\n      domain: cloud\\.yourdomain\\.com\n      username: admin\n      password: ${COLLABORA_PASSWORD}\n      extra_params: --o:ssl.enable=false --o:ssl.termination=true\n    ports:\n      - '127.0.0.1:9980:9980'\n    cap_add:\n      - MKNOD\n```\n\nThen configure the Collabora server URL in Nextcloud (**Administration → Office → Collabora Online server URL**: `https:\u002F\u002Foffice.yourdomain.com`).\n\n**Memory footprint:** Collabora Online adds approximately **+300 MB RAM per active process** (one process per simultaneously open document). OnlyOffice is slightly heavier: **+400 MB per active instance**. On a 2 GB VPS, limit simultaneous use to 2–3 documents or upgrade to 4 GB.\n\n**Supported formats:** both apps read and write Microsoft Office formats (`.docx`, `.xlsx`, `.pptx`) as well as OpenDocument formats (`.odt`, `.ods`, `.odp`).",{"type":131,"title":132,"headers":133,"rows":137},"comparison","Collabora Online or OnlyOffice: Which to Choose?",[134,135,136],"Criterion","Collabora Online","OnlyOffice Docs",[138,142,146,150,154,158],[139,140,141],"User interface","Familiar LibreOffice — adaptation curve for Windows users","Ribbon identical to Microsoft Office — immediate adoption",[143,144,145],"Compatibility .docx\u002F.xlsx\u002F.pptx","Good; .odt\u002F.ods excellent","Very faithful to Microsoft originals",[147,148,149],"Estimated RAM","~300 MB\u002Factive process","~400 MB\u002Factive instance",[151,152,153],"SSO\u002FSAML Nextcloud","Native integration","Additional configuration required",[155,156,157],"Simultaneous connections","Depends on the edition (CODE or enterprise)","Limited (community edition)",[159,160,161],"Community","Very active LibreOffice, frequent updates","Solid, Microsoft-compatibility focused",{"type":79,"title":163,"body":164},"Which editor to choose?","For a mixed Linux\u002FWindows team working primarily with Microsoft Office files, OnlyOffice reduces adoption friction. For a team already on LibreOffice or with tight memory constraints, Collabora Online is the natural choice. Both apps are compatible with Nextcloud 35.",{"type":38,"title":166,"body":167},"Office 2021: what ends, and troubleshooting Collabora","According to Microsoft's lifecycle page, Office 2021 (Home and Business, Home and Student, Professional, Mac versions included) and Office LTSC 2021 for Windows no longer receive fixes since October 13, 2026; only Office LTSC 2021 for Mac moves to extended support.\n\nWhen enabling Collabora, **\"Could not establish connection to the Collabora Online server.\"** (**Administration → Office**) means Nextcloud cannot reach the declared URL. Test from the container: `docker compose exec app curl -sI https:\u002F\u002Foffice.your-domain.com\u002Fhosting\u002Fdiscovery`. To reconfigure and diagnose: `docker compose exec -u www-data app php occ richdocuments:activate-config --wopi-url=https:\u002F\u002Foffice.your-domain.com`; an answer of **`Failed to fetch discovery endpoint from …`** points to the network or TLS. The warning **\"You have not configured the allow-list for WOPI requests\"** goes away once the Collabora server IP is declared in the WOPI allow list. Detailed comparison: \u003Ca href=\"\u002Fen\u002Fblog\u002Foffice-2021-eol-collabora-online-or-onlyoffice-vps\">Collabora Online or OnlyOffice\u003C\u002Fa>.",{"type":38,"title":169,"body":170},"Update Nextcloud in Production","Always run updates with maintenance mode enabled:\n\n```bash\ndocker compose exec -u www-data app php occ maintenance:mode --on\n# MariaDB 10.x:\ndocker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \\\n  | gzip > \u002Fopt\u002Fnextcloud\u002Fbackups\u002Fpre-update-db.sql.gz\n# MariaDB 11+: use mariadb-dump instead\nsed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml\ndocker compose pull app && docker compose up -d app\ndocker compose exec -u www-data app php occ upgrade\ndocker compose exec -u www-data app php occ maintenance:mode --off\n```",{"type":38,"title":172,"body":173},"PHP 8.3: Migration and Nextcloud 35 Requirements","Nextcloud 35 makes **PHP 8.3 mandatory** — PHP 8.2 is no longer supported. This is documented in the official release notes and in the Nextcloud PHP compatibility matrix (GitHub wiki *Releases and PHP versions*). If you run a native installation or a Docker image locked to PHP 8.2, you must migrate PHP before upgrading to NC 35.\n\n**Check the PHP version used by your instance:**\n\n```bash\n# In Docker\ndocker compose exec app php --version\n\n# Native\nphp8.2 --version || php8.3 --version\n```\n\n**In Docker — the `nextcloud:35.x-apache` image already includes PHP 8.3+:** no manual PHP migration needed. Simply update the tag:\n\n```yaml\nimage: nextcloud:35.0.0-apache\n```\n\n**Required PHP extensions for Nextcloud 35:**\n\n| Extension | Role |\n|-----------|------|\n| `gd` or `imagick` | Thumbnail generation |\n| `redis` | Distributed cache and file locking |\n| `intl` | Internationalization |\n| `bcmath`, `gmp` | Cryptography |\n| `zip` | Archive handling |\n| `opcache` | PHP performance (required) |\n\n**Check for missing extensions:**\n\n```bash\ndocker compose exec -u www-data app php occ check\n```",{"type":38,"title":175,"body":176},"Nextcloud 35: Upgrade Path and Supported PHP Versions","Nextcloud 35.0.0 was released on **September 15, 2026** (Hub 26 Summer). It requires a **strict sequential upgrade path**, PHP 8.3 as minimum (PHP 8.2 is abandoned), and introduces changes for MariaDB 11 environments.\n\n**PHP 8.3 minimum — PHP 8.2 abandoned**\n\nNextcloud 35 officially supports PHP **8.3** (minimum required), **8.4**, and **8.5** (recommended). An instance running PHP 8.2 will not start after upgrading to NC 35. Always pin to an explicit Docker tag:\n\n```yaml\nimage: nextcloud:35.0.0-apache\n```\n\n**Mandatory sequential upgrade path: v33 → v34 → v35**\n\n```bash\n# Step 1: upgrade to NC 34\ndocker compose exec -u www-data app php occ maintenance:mode --on\nsed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml\ndocker compose pull app && docker compose up -d app\ndocker compose exec -u www-data app php occ upgrade\ndocker compose exec -u www-data app php occ maintenance:mode --off\n\n# Step 2: upgrade to NC 35\ndocker compose exec -u www-data app php occ maintenance:mode --on\nsed -i 's|nextcloud:[0-9.]*-apache|nextcloud:35.0.0-apache|g' docker-compose.yml\ndocker compose pull app && docker compose up -d app\ndocker compose exec -u www-data app php occ upgrade\ndocker compose exec -u www-data app php occ maintenance:mode --off\n```\n\nCheck the compatibility matrix at \u003Ca href=\"https:\u002F\u002Fapps.nextcloud.com\">apps.nextcloud.com\u003C\u002Fa> before each major version upgrade.",{"type":79,"title":178,"body":179},"Check App Compatibility Before Upgrading to Nextcloud 35","Before upgrading to NC 35, run the built-in platform compatibility check:\n\n```bash\ndocker exec -u www-data \u003Ccontainer_name> php occ app:check-platform-compatibility\n```\n\nIf an app returns a compatibility error, disable it before launching the upgrade:\n\n```bash\ndocker exec -u www-data \u003Ccontainer_name> php occ app:disable app_name\n```\n\nAfter the upgrade, always run `occ check`:\n\n```bash\ndocker compose exec -u www-data app php occ check\n```",{"type":79,"title":181,"body":182},"Recognize v7 — Debugging the Silent 'sh: exec: line 1' Error","The **Recognize** app (image and face recognition) can fail silently with:\n\n```\nClassifier process output: sh: exec: line 1: recognize\u002Fbin\u002Fnode: not found\n```\n\nThis error does not appear in the admin interface — only in container logs. The app appears installed and active, but no tags are generated.\n\n**Main causes:**\n- **CPU architecture mismatch**: the Node.js binary bundled in Recognize is compiled for `x86_64`. On ARM64 (Raspberry Pi, ARM VPS), it is not executable.\n- **Missing or non-executable binary**: incorrect permissions after a volume mount.\n\n**Diagnosis:**\n\n```bash\ndocker compose logs app | grep -i recognize\ndocker compose exec app sh -c \"ls -la \u002Fvar\u002Fwww\u002Fhtml\u002Fapps\u002Frecognize\u002Fbin\u002F\"\ndocker compose exec app uname -m\n```\n\n**Fix on x86_64:**\n\n```bash\ndocker compose exec -u www-data app php occ config:app:set recognize \\\n  tensorflow.gpu_enabled --value=false\ndocker compose exec -u www-data app php occ config:app:set recognize \\\n  node_binary --value=\"\"\ndocker compose exec -u www-data app php occ recognize:classify\n```\n\n**On ARM64:** enable WASM mode in app settings (Administration → Recognize → Use WASM backend).","A Reliable VPS for Your Nextcloud Instance","Nextcloud needs an SSD VPS with good bandwidth for smooth file synchronization. Our VPS Cloud plans start at 4 GB RAM with on-demand snapshots — exactly what a stress-free Nextcloud instance needs.","See our VPS plans","\u002Fvps-cloud",[188,210,226],{"id":189,"slug":190,"slugs":191,"title":195,"excerpt":196,"readTime":197,"views":198,"isPinned":19,"noindex":19,"publishedAt":199,"updatedAt":200,"category":201,"categories":206,"featuredImage":30,"bgImage":31,"posterImage":208,"relatedSolution":209},95,"nextcloud-vs-owncloud-which-private-cloud-to-host",{"fr":192,"en":190,"ar":193,"es":194},"nextcloud-vs-owncloud","nextcloud-مقابل-owncloud-أي-سحابة-خاصة-تستضيف","nextcloud-vs-owncloud-que-nube-privada-alojar","Nextcloud vs ownCloud: which private cloud to host?","Nextcloud or ownCloud for your private cloud on a VPS? Comparison of features, performance, prerequisites and Docker deployment guide.",4,0,"2026-03-17T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":202,"name":203,"slug":204,"color":205,"icon":204},5,"Comparison","comparatif","bg-info\u002F10 text-info",[207],{"id":202,"name":203,"slug":204,"color":205,"icon":204},"\u002Fblog\u002Fcovers\u002Fnextcloud-vs-owncloud-poster.svg",{"categorySlug":25,"appSlug":34},{"id":211,"slug":212,"slugs":213,"title":217,"excerpt":218,"readTime":219,"views":18,"isPinned":19,"noindex":19,"publishedAt":220,"updatedAt":221,"category":222,"categories":223,"featuredImage":30,"bgImage":31,"posterImage":225,"relatedSolution":30},126,"server-backups-jetbackup-explained",{"fr":214,"en":212,"ar":215,"es":216},"sauvegardes-serveur-jetbackup","نسخ-الخوادم-الاحتياطية-شرح-jetbackup","copias-seguridad-servidor-jetbackup","JetBackup on cPanel\u002FWHM: installation and restore","How to install JetBackup on WHM, set up S3 or SFTP destinations, schedule backups and restore an account, a database or an email independently.",9,"2026-02-18T00:00:00+00:00","2026-10-20T23:18:07+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[224],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fsauvegardes-serveur-jetbackup-poster.svg",{"id":227,"slug":228,"slugs":229,"title":233,"excerpt":234,"readTime":197,"views":235,"isPinned":19,"noindex":19,"publishedAt":236,"updatedAt":237,"category":238,"categories":244,"featuredImage":30,"bgImage":31,"posterImage":246,"relatedSolution":247},108,"securing-your-vps-with-crowdsec",{"fr":230,"en":228,"ar":231,"es":232},"securiser-vps-crowdsec","تأمين-خادمك-الافتراضي-vps-باستخدام-crowdsec","proteger-vps-con-crowdsec","Securing your VPS with CrowdSec","Deploy CrowdSec on your VPS to block attacks thanks to behavioral detection and a shared community blocklist.",2,"2026-03-04T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":239,"name":240,"slug":241,"color":242,"icon":243},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[245],{"id":239,"name":240,"slug":241,"color":242,"icon":243},"\u002Fblog\u002Fcovers\u002Fsecuriser-vps-crowdsec-poster.svg",{"categorySlug":248,"appSlug":249},"cybersecurity-bastion","crowdsec",true,1794270418918]