NCP - Nextcloud Update 33.0.3 fails

The Basics

  • Nextcloud Server version (e.g., 29.x.x):

    • 33.0.2
  • Operating system and version (e.g., Ubuntu 24.04):

    • Debian GNU/Linux 12 (bookworm)
  • Web server and version (e.g, Apache 2.4.25):

    • Apache 2.4.67
  • Reverse proxy and version _(e.g. nginx 1.27.2)

    • nginx 1.22.1
  • PHP version (e.g, 8.3):

    • 8.3.31
  • Is this the first time you’ve seen this error? (Yes / No):

    • yes
  • When did this problem seem to first start?

    • NextcloudPi updated to version v1.57.1
  • Installation method (e.g. AlO, NCP, Bare Metal/Archive, etc.)

    • NCP

    Are you using CloudfIare, mod_security, or similar? (Yes / No)

    • no

Summary of the issue you are facing:

The (automatic daily) update to Nextcloud 33.0.3 fails again and again. Rollback is successful.

It doesn’t make a difference wether the update is started via /etc/cron.daily/ncp-autoupdate-nc or ncp-configUpdatesnc-update-nextcloud.

The only hints in the update log are:

 - Populating added database structures for workflows
  There are no commands defined in the "app_api:daemon" namespace.  
notify_push already installed
Abort

The full log of log of nc-update-nextcloud is posted below.

Steps to replicate it (hint: details matter!):

  1. run nc-update-nextcloud

Log entries

nc-update-nextcloud

/etc/cron.daily/ncp-autoupdate-nc:
Running as unit: ncp-update-nc.service
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0 100  340k  100  340k    0     0  1470k      0 --:--:-- --:--:-- --:--:-- 1475k
Current   Nextcloud version 33.0.2
Requested Nextcloud version latest
Selected  Nextcloud version 33.0.3
INFO: You have requested an update to the latest available version that can be performed directly, which is '33.0.3'. Updates can only performed to the next major version (or the latest minor version of the current major version). If you run ncp-update-nc again after this update completes, a new version might be available.
Download Nextcloud 33.0.3...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0   0 5784k    0 13862    0     0  52474      0  0:01:52 --:--:--  0:01:52 52507 100 5784k  100 5784k    0     0  8780k      0 --:--:-- --:--:-- --:--:-- 8777k
Back up current instance...
check free space...
Maintenance mode enabled
backup database...
backup files...
backup /var/www/nextcloud-bkp_20260517_1778992193.tar.gz generated
Maintenance mode disabled
Storing backup at '/var/www/nextcloud-bkp_20260517_1778992193-33.0.2.tar.gz'...
Install Nextcloud 33.0.3...
Fix permissions...
Upgrade...
Setting log level to debug
Turned on maintenance mode
Updating database schema
Updated database
Updating <text> ...
Updated <text> to 7.0.1
Starting code integrity check...
Finished code integrity check
Update successful
Turned off maintenance mode
Resetting log level
Adding additional mounts_user_path_root_index index to the oc_mounts table, this can take some time...
Removing mounts_user_root_path_index index from the oc_mounts table
oc_mounts table updated successfully.
Done.
Done.
All tables already up to date!
All tables already have the correct collation -> nothing to do
 - Repair MySQL collation
     - All tables already have the correct collation -> nothing to do
 - Clean tags and favorites
     - 0 tags of deleted users have been removed.
     - 0 tags for delete files have been removed.
     - 0 tag entries for deleted tags have been removed.
     - 0 tags with no entries have been removed.
 - Repair invalid shares
 - Move .step file of updater to backup location
 - Add move avatar background job
     - Repair step already executed
 - Add preview cleanup background jobs
 - Migrate oc_properties table to nextcloud schema
     - oc_properties table does not exist.
 - Migrate oauth2_clients table to nextcloud schema
     - Update the oauth2_access_tokens table schema.
     - Update the oauth2_clients table schema.
     - Delete clients (and their related access tokens) with the redirect_uri starting with oc:// or ending with *
 - Repair language codes
 - Add log rotate job
 - Clear frontend caches
     - Image cache cleared
     - JS cache cleared
 - Clear every generated avatar
 - Add preview background cleanup job
 - Queue a one-time job to cleanup old backups of the updater
 - Cleanup invalid photocache files for carddav
 - Add background job to cleanup login flow v2 tokens
 - Remove potentially over exposing share links
     - No need to remove link shares.
 - Clear access cache of projects
 - Reset generated avatar flag
 - Keep legacy encryption enabled
 - Check encryption key format
 - Remove old dashboard app config data
 - Add job to cleanup the bruteforce entries
 - Queue a one-time job to check for user uploaded certificates
 - Repair DAV shares
 - Add background job to set the lookup server share state for users
 - Add token cleanup job
 - Clean up abandoned apps
 - Add possibly missing system config
 - Add AI tasks cleanup jobs
 - Queue a job to generate metadata
 - Cache logo dimension to fix size in emails on Outlook
     - Logo dimensions are already known
 - Remove legacy ".ocdata" file
 - Add cleanup-deleted-users background job
 - Validate account properties and store phone numbers in a known format for search
     - Queued background to validate account properties.
 - Queue a job to move the preview
 - Migrate config keys
 - Remove shares of old group memberships
 - Remove broken DAV object properties
     - 0 broken object properties removed
 - Repair mime types
 - Handle outdated scheduling events
     - Cleaning up old scheduling events
 - Remove invalid object properties
     - 0 invalid object properties removed.
 - Cleanup share names with false conflicts
 - Upgrading Circles App
 - Fix component of birthday calendars
     - 7 birthday calendars updated.
 - Regenerating birthday calendars to use new icons and fix old birthday events without year
     - Repair step already executed
 - Fix broken values of calendar objects
    0 [>---------------------------]
 - Registering building of calendar search index as background job
     - Repair step already executed
 - Register building of social profile search index as background job
     - Repair step already executed
 - Disable system address book
     - Skipping repair step system address book has less then the threshold 5000 of contacts no need to disable
 - Registering background jobs to update cache for webcal calendars
     - Added 0 background jobs to update webcal calendars
 - Registering building of calendar reminder index as background job
     - Repair step already executed
 - Register a background job to update rooms and resources
 - Queue jobs to clean up orphan event and contact data
 - Remove activity entries of private events
     - Removed 0 activity entries
 - Clean up old calendar subscriptions from deleted users that were not cleaned-up
 0/1 [>---------------------------]   0%
 1/1 [============================] 100%
     - 0 calendar subscriptions without an user have been cleaned up
 - Fix the share type of guest shares when migrating from ownCloud
 - Copy the share password into the dedicated column
 - Set existing shares as accepted
 - Remove any playlist files mistakenly added to music_tracks table
 - Combine multi-disk albums and store disk numbers per track
 - Register Music background jobs and remove legacy registrations
 - Set creation and update dates for the library entities without one
 - Remove the unused News update job
     - Job does not exist, all good
 - Clean up meta table
 - Show a hint about the new editor to existing users
 - Set binary permissions
 - Update OAuth token expiration times
 - Repair Passwords Database Objects
     - Checking 0 tag revisions
    0 [----->----------------------]
     - Fixed 0 tag revisions
     - Checking 8 folder revisions
 0/8 [>---------------------------]   0%
 8/8 [============================] 100%
     - Fixed 0 folder revisions
     - Checking 1053 password revisions
    0/1053 [>---------------------------]   0%
   68/1053 [=>--------------------------]   6%
  106/1053 [==>-------------------------]  10%
  174/1053 [====>-----------------------]  16%
  211/1053 [=====>----------------------]  20%
  279/1053 [=======>--------------------]  26%
  316/1053 [========>-------------------]  30%
  384/1053 [==========>-----------------]  36%
  422/1053 [===========>----------------]  40%
  496/1053 [=============>--------------]  47%
  527/1053 [==============>-------------]  50%
  599/1053 [===============>------------]  56%
  632/1053 [================>-----------]  60%
  698/1053 [==================>---------]  66%
  738/1053 [===================>--------]  70%
  806/1053 [=====================>------]  76%
  843/1053 [======================>-----]  80%
  915/1053 [========================>---]  86%
  948/1053 [=========================>--]  90%
 1020/1053 [===========================>]  96%
 1053/1053 [============================] 100%
     - Fixed 0 password revisions
     - Checking 0 tag models
    0 [---------------------->-----]
     - Fixed 0 tag models
     - Checking 6 folder models
 0/6 [>---------------------------]   0%
 6/6 [============================] 100%
     - Fixed 0 folder models
     - Checking 814 password models
   0/814 [>---------------------------]   0%
  82/814 [==>-------------------------]  10%
 163/814 [=====>----------------------]  20%
 245/814 [========>-------------------]  30%
 326/814 [===========>----------------]  40%
 407/814 [==============>-------------]  50%
 489/814 [================>-----------]  60%
 570/814 [===================>--------]  70%
 652/814 [======================>-----]  80%
 733/814 [=========================>--]  90%
 814/814 [============================] 100%
     - Fixed 0 password models
     - Checking 0 password tag relations
    0 [-------------------->-------]
     - Fixed 0 password tag relations
     - Checking 30 shares
  0/30 [>---------------------------]   0%
 30/30 [============================] 100%
     - Fixed 0 shares
 - init metadata
 - Switches from default updater server to the customer one if a valid subscription is available
     - Repair step already executed
 - Migrate some config values to lazy loading
 - Send an admin notification if monthly report is disabled
 - Force-reset all Text document sessions
 - Initialize migration of background images from dashboard to theming app
 - Add background job to check for backup codes
 - Populating added database structures for workflows

                                                                    
  There are no commands defined in the "app_api:daemon" namespace.  
                                                                    

notify_push already installed
Abort
Clean up...
Rolling back to backup /var/www/nextcloud-bkp_20260517_1778992193-33.0.2.tar.gz...
check free space...
extracting backup file /var/www/nextcloud-bkp_20260517_1778992193-33.0.2.tar.gz...
restore files...
restore database...
No datadir found in backup
Maintenance mode disabled
Starting scan for user 1 out of 7 ([XXX])
Starting scan for user 2 out of 7 ([XXX])
Starting scan for user 3 out of 7 ([XXX])
Starting scan for user 4 out of 7 ([XXX])
Starting scan for user 5 out of 7 ([XXX])
Starting scan for user 6 out of 7 ([XXX])
Starting scan for user 7 out of 7 ([XXX])
+---------+-------+-----+---------+---------+--------+--------------+
| Folders | Files | New | Updated | Removed | Errors | Elapsed time |
+---------+-------+-----+---------+---------+--------+--------------+
| 2931    | 44829 | 0   | 0       | 0       | 0      | 00:00:42     |
+---------+-------+-----+---------+---------+--------+--------------+
Installing template 'php/opcache.ini.sh'...
System config value tempdirectory set to string /media/WD_500GB/tmp
System config value logfile set to string /media/WD_500GB/nextcloud.log
System config value trusted_domains => 11 set to string 92.116.144.106
System config value trusted_domains => 1 set to string 192.168.178.104
System config value trusted_domains => 14 set to string nextcloudpi
Updated data-fingerprint to d54d9c198d4448513c4a08e2e776d87a
Scanning AppData for files

+----------+---------+-------+--------------+
| Previews | Folders | Files | Elapsed time |
+----------+---------+-------+--------------+
| 97674    | 308     | 2964  | 01:45:42     |
+----------+---------+-------+--------------+
Cleanup...
Rollback successful. Nothing was updated
Nextcloud update failed (or was installed already).

Nextcloud

My nextcloud.log ist quite big, I put here the entries within the two hours /etc/cron.daily/ncp-autoupdate-nc ran last time.

Web Browser

I guess this is not relevant.

Web server / Reverse Proxy

I guess this is not relevant.

Configuration

Nextcloud

pi@nextcloudpi:~ $ sudo -u www-data php /var/www/nextcloud/occ config:list system
{
    "system": {
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "trusted_domains": {
            "1": "192.168.178.104",
            "4": "nextcloudpi.local",
            "5": "",
            "6": "nextcloudpi.lan",
            "2": "https:\/\/***REMOVED SENSITIVE VALUE***",
            "11": "92.116.144.106",
            "14": "nextcloudpi",
            "3": "nextcloudpi",
            "20": "***REMOVED SENSITIVE VALUE***",
            "21": "192.168.174.104",
            "22": "localhost"
        },
        "datadirectory": "***REMOVED SENSITIVE VALUE***",
        "dbtype": "mysql",
        "version": "33.0.2.2",
        "overwrite.cli.url": "https:\/\/nextcloudpi\/",
        "dbname": "***REMOVED SENSITIVE VALUE***",
        "dbhost": "***REMOVED SENSITIVE VALUE***",
        "dbport": "",
        "dbtableprefix": "oc_",
        "mysql.utf8mb4": true,
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "installed": true,
        "instanceid": "***REMOVED SENSITIVE VALUE***",
        "memcache.local": "\\OC\\Memcache\\Redis",
        "memcache.locking": "\\OC\\Memcache\\Redis",
        "redis": {
            "host": "***REMOVED SENSITIVE VALUE***",
            "port": 0,
            "timeout": 0,
            "password": "***REMOVED SENSITIVE VALUE***"
        },
        "tempdirectory": "\/media\/WD_500GB\/tmp",
        "mail_smtpmode": "smtp",
        "mail_smtpauthtype": "LOGIN",
        "mail_from_address": "***REMOVED SENSITIVE VALUE***",
        "mail_domain": "***REMOVED SENSITIVE VALUE***",
        "preview_max_x": "2048",
        "preview_max_y": "2048",
        "jpeg_quality": "60",
        "overwriteprotocol": "https",
        "loglevel": 0,
        "log_type": "file",
        "maintenance": false,
        "theme": "",
        "mail_sendmailmode": "smtp",
        "mail_smtpsecure": "ssl",
        "mail_smtpauth": 1,
        "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpport": "465",
        "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
        "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
        "updater.release.channel": "stable",
        "data-fingerprint": "7755e31e5f70539c95fb256f52495577",
        "logfile": "\/media\/WD_500GB\/nextcloud.log",
        "app_install_overwrite": [
            "admin_notifications",
            "news"
        ],
        "trusted_proxies": "***REMOVED SENSITIVE VALUE***",
        "htaccess.RewriteBase": "\/",
        "serverid": 435
    }
}

Apps

pi@nextcloudpi:~ $ sudo -u www-data php /var/www/nextcloud/occ app:list
Enabled:

activity: 6.0.0

admin_audit: 1.23.0

bruteforcesettings: 6.0.0

calendar: 6.4.0

circles: 33.0.0

cloud_federation_api: 1.17.0

comments: 1.23.0

contacts: 8.4.5

contactsinteraction: 1.14.1

dashboard: 7.13.0

dav: 1.36.0

federatedfilesharing: 1.23.0

federation: 1.23.0

files: 2.5.0

files_downloadlimit: 5.1.0

files_external: 1.25.1

files_pdfviewer: 6.0.0

files_reminders: 1.6.0

files_sharing: 1.25.2

files_trashbin: 1.23.0

files_versions: 1.26.0

firstrunwizard: 6.0.0

forms: 5.2.7

logreader: 6.0.0

lookup_server_connector: 1.21.0

music: 3.0.0

news: 28.3.0

nextcloud_announcements: 5.0.0

nextcloudpi: 0.0.2

notes: 5.0.0

notifications: 6.0.0

notify_push: 1.3.2

oauth2: 1.21.0

password_policy: 5.0.0

passwords: 2026.5.10

photos: 6.0.0

privacy: 5.0.0

profile: 1.2.0

provisioning_api: 1.23.0

quota_warning: 1.23.0

recommendations: 6.0.0

related_resources: 4.0.0

serverinfo: 5.0.0

settings: 1.16.0

sharebymail: 1.23.0

support: 5.0.0

survey_client: 5.0.0

systemtags: 1.23.0

tasks: 0.17.1

text: 7.0.0

theming: 2.8.0

twofactor_backupcodes: 1.22.0

twofactor_totp: 15.0.0

updatenotification: 1.23.0

user_status: 1.13.0

viewer: 6.0.0

weather_status: 1.13.0

webhook_listeners: 1.5.0

welcome: 2.0.0

workflowengine: 2.15.0
Disabled:

app_api: 33.0.0 (installed 32.0.0)

encryption: 2.21.0

suspicious_login: 11.0.0 (installed 4.1.0)

testing: 1.23.0

twofactor_nextcloud_notification: 7.0.0

user_ldap: 1.24.0

Thanks alot to those who try to help me!

Hi @marc_f,

I don’t use NCP myself, but after looking at the NCP source at v1.57.1 and your logs, I think I can trace the full chain.


The nextcloud.log is not the relevant log here.

The entries in your nextcloud.log during that time window are unrelated to the update failure:

  • The repeated NoteNotWritableException for note ID 243383 is an Android client repeatedly trying to delete a note that appears to be write-protected on the filesystem. Pre-existing, independent of the update.
  • The DisabledUserException / “Konto deaktiviert” entries are an iOS device (dataaccessd) trying to sync with a disabled user account. Also unrelated.

The actual update error does not appear in nextcloud.log at all.


The root cause appears to be a bug in bin/ncp-update-nc.d/update-nc.sh.

The update log shows this sequence after a successful occ upgrade:

  There are no commands defined in the "app_api:daemon" namespace.

notify_push already installed
Abort
Clean up...

Here is what actually happens, step by step:

Step 1 — app_api:daemon:list (line 222)

if $ncc app_api:daemon:list | grep 'No registered daemon configs.' > /dev/null 2>&1
then
  $ncc app:disable app_api
fi

Since app_api is disabled on your system, the app_api:daemon command namespace does not exist. The error is visible in the log. However, this does not cause the rollback — the failing command is inside an if condition, so bash’s ERR trap does not fire here.

Step 2 — is_app_enabled has a bug (library.sh)

function is_app_enabled()
{
  local app="$1"
  ncc app:list --output json | jq -r '.enabled | keys | .[]' | grep '^previewgenerator$' > /dev/null 2> /dev/null
}

The $app argument is accepted but never used. The function always checks whether previewgenerator is enabled, regardless of which app is passed.

Step 3 — The broken check causes the install block to be entered

The script calls:

if ! is_app_enabled notify_push; then
    ncc app:install notify_push
    ...
fi

The intent is: “if notify_push is NOT enabled, install it.” But because is_app_enabled always checks for previewgenerator instead, the actual question being answered is: “is previewgenerator enabled?”

previewgenerator is not in your enabled apps list → the function returns false → ! false = true → the install block is entered, even though notify_push is in fact already enabled and installed.

Step 4 — ncc app:install notify_push fails

notify_push is already installed. Nextcloud’s occ app:install exits with a non-zero status when the app is already present, outputting “notify_push already installed”. The script has trap rollback ERR active, so this non-zero exit triggers the rollback function, which prints “Abort\nClean up…”.


In short: The update fails because of a bug in is_app_enabled in library.sh — it always checks for previewgenerator instead of the app passed as argument. This causes a spurious attempt to reinstall notify_push, which fails and triggers the rollback.

This bug was introduced in PR #2100 (“Add support for NC 33 + fixes”), merged 2026-04-03, and is present in v1.57.0 and v1.57.1. That PR also migrated to the upstream previewgenerator — it looks like previewgenerator was temporarily hardcoded for testing during that work and never changed back to $app before the merge. Before PR #2100 the function correctly used $app. This is a regression worth reporting to the NCP maintainers at Issues · nextcloud/nextcloudpi · GitHub — you can reference this post as context.

I should note that I don’t run NCP myself — I derived all of this purely from reading the source code, so I may be wrong on some details. The NCP developers will be able to verify quickly.

As a workaround until it is fixed, you could try enabling previewgenerator before running the update (so the broken check passes), or manually patch library.sh on your NCP system to use $app instead of the hardcoded previewgenerator.


h.t.h.


ernolf

Hi @ernolf,

you are right. After installing previewgenerator the update to 33.0.3 was successful. In fact I uninstalled previewgenerator a few weeks ago. A daily cronjob alwalys ended up in failure - and I thought my installation doesn’t need previewgenerator.

Thank you very much!

marc_f