NC30 reports apps as installed even when you remove their files during an upgrade, preventing re-install

SEE EDITS BELOW


Nextcloud version: 30.0.0.14
Operating system and version: Rocky Linux 9.4
Apache version: Apache 2.4.57
PHP version: 8.3.9

The issue you are facing:

I performed a clean upgrade via the CLI from NC29.0.7 to NC30, replaced all files and reinstalled all ext apps from scratch. The upgrade didn’t report any issues, server is running, but none of the apps are appearing in the web consoles menu bar anymore, the only apps there are Dashboard, Files, Photos, Activities.

What’s more confusing is that they are also missing from occ app:list, but when I run occ app:install calendar for instance, it says calendar already installed. Ok, so I try occ app:enable calendar and that gets calendar already enabled.

In my syslog I’m seeing a number of errors like this one…

Sep 26 11:59:08 ########## Nextcloud[109346]: {"reqId":"QTR9qPsU3j3H8vDZD88A","level":3,"time":"2024-09-26T15:59:08+00:00","remoteAddr":"##########
","user":"admin","app":"no app in context","method":"PROPFIND","url":"/remote.php/dav/files/admin/","message":"{\"Exception\":\"OC\\\\AppFramework\\\\Utility\\\\QueryNotFoundx
Exception\",\"Message\":\"Could not resolve OCA\\\\Talk\\\\Share\\\\RoomShareProvider! Class \\\"OCA\\\\Talk\\\\Share\\\\RoomShareProvider\\\" does not exist\",\"Code\":0,\"Tx
race\":[{\"file\":\"/srv/apps/nextcloud/lib/private/AppFramework/Utility/SimpleContainer.php\",\"line\":124,\"function\":\"resolve\",\"class\":\"OC\\\\AppFramework\\\\Utilityx
\\\\SimpleContainer\",\"type\":\"->\",\"args\":[\"OCA\\\\Talk\\\\Share\\\\RoomShareProvider\"]},{\"file\":\"/srv/apps/nextcloud/lib/private/ServerContainer.php\",\"line\":155x
,\"function\":\"query\",\"class\":\"OC\\\\AppFramework\\\\Utility\\\\SimpleContainer\",\"type\":\"->\",\"args\":[\"OCA\\\\Talk\\\\Share\\\\RoomShareProvider\",true]},{\"file\x
":\"/srv/apps/nextcloud/lib/private/AppFramework/Utility/SimpleContainer.php\",\"line\":42,\"function\":\"query\",\"class\":\"OC\\\\ServerContainer\",\"type\":\"->\",\"args\"x
:[\"OCA\\\\Talk\\\\Share\\\\RoomShareProvider\"]},{\"file\":\"/srv/apps/nextcloud/lib/private/Share20/ProviderFactory.php\",\"line\":248,\"function\":\"get\",\"class\":\"OC\\x
\\AppFramework\\\\Utility\\\\SimpleContainer\",\"type\":\"->\",\"args\":[\"OCA\\\\Talk\\\\Share\\\\RoomShareProvider\"]},{\"file\":\"/srv/apps/nextcloud/lib/private/Share20/Px
roviderFactory.php\",\"line\":324,\"function\":\"getRoomShareProvider\",\"class\":\"OC\\\\Share20\\\\ProviderFactory\",\"type\":\"->\",\"args\":[]},{\"file\":\"/srv/apps/nextx
cloud/lib/private/Share20/Manager.php\",\"line\":1199,\"function\":\"getProviderForType\",\"class\":\"OC\\\\Share20\\\\ProviderFactory\",\"type\":\"->\",\"args\":[10]},{\"filx
e\":\"/srv/apps/nextcloud/apps/files_sharing/lib/MountProvider.php\",\"line\":48,\"function\":\"getSharedWith\",\"class\":\"OC\\\\Share20\\\\Manager\",\"type\":\"->\",\"args\x
":[\"admin\",10,null,-1]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Config/MountProviderCollection.php\",\"line\":72,\"function\":\"getMountsForUser\",\"class\":\"OCAx
\\\\Files_Sharing\\\\MountProvider\",\"type\":\"->\",\"args\":[[\"OC\\\\User\\\\User\"],[\"OC\\\\Files\\\\Storage\\\\StorageFactory\"]]},{\"file\":\"/srv/apps/nextcloud/lib/px
rivate/Files/Config/MountProviderCollection.php\",\"line\":129,\"function\":\"getMountsFromProvider\",\"class\":\"OC\\\\Files\\\\Config\\\\MountProviderCollection\",\"type\":x
\"->\",\"args\":[[\"OCA\\\\Files_Sharing\\\\MountProvider\"],[\"OC\\\\User\\\\User\"],[\"OC\\\\Files\\\\Storage\\\\StorageFactory\"]]},{\"file\":\"/srv/apps/nextcloud/lib/prix
vate/Files/SetupManager.php\",\"line\":203,\"function\":\"addMountForUser\",\"class\":\"OC\\\\Files\\\\Config\\\\MountProviderCollection\",\"type\":\"->\",\"args\":[[\"OC\\\\x
User\\\\User\"],[\"OC\\\\Files\\\\Mount\\\\Manager\"],[\"Closure\"]]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/SetupManager.php\",\"line\":306,\"function\":\"OC\\\\Fx
iles\\\\{closure}\",\"class\":\"OC\\\\Files\\\\SetupManager\",\"type\":\"->\",\"args\":[\"*** sensitive parameters replaced ***\"]},{\"file\":\"/srv/apps/nextcloud/lib/privatx
e/Files/SetupManager.php\",\"line\":202,\"function\":\"setupForUserWith\",\"class\":\"OC\\\\Files\\\\SetupManager\",\"type\":\"->\",\"args\":[[\"OC\\\\User\\\\User\"],[\"Closx
ure\"]]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/SetupManager.php\",\"line\":386,\"function\":\"setupForUser\",\"class\":\"OC\\\\Files\\\\SetupManager\",\"type\":\"x
->\",\"args\":[[\"OC\\\\User\\\\User\"]]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Mount/Manager.php\",\"line\":117,\"function\":\"setupForPath\",\"class\":\"OC\\\\Fx
iles\\\\SetupManager\",\"type\":\"->\",\"args\":[\"/admin/files\",true]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/View.php\",\"line\":1393,\"function\":\"findIn\",\"x
class\":\"OC\\\\Files\\\\Mount\\\\Manager\",\"type\":\"->\",\"args\":[\"/admin/files\"]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Node/Node.php\",\"line\":94,\"functx
ion\":\"addSubMounts\",\"class\":\"OC\\\\Files\\\\View\",\"type\":\"->\",\"args\":[[\"OC\\\\Files\\\\FileInfo\"]]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Node/Nodex
.php\",\"line\":221,\"function\":\"getFileInfo\",\"class\":\"OC\\\\Files\\\\Node\\\\Node\",\"type\":\"->\",\"args\":[]},{\"function\":\"getEtag\",\"class\":\"OC\\\\Files\\\\Nx
ode\\\\Node\",\"type\":\"->\",\"args\":[]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Node/LazyFolder.php\",\"line\":64,\"function\":\"call_user_func_array\",\"args\":x
[[[\"OC\\\\Files\\\\Node\\\\Folder\"],\"getEtag\"],[]]},{\"file\":\"/srv/apps/nextcloud/lib/private/Files/Node/LazyFolder.php\",\"line\":240,\"function\":\"__call\",\"class\"x
:\"OC\\\\Files\\\\Node\\\\LazyFolder\",\"type\":\"->\",\"args\":[\"getEtag\",[]]},{\"file\":\"/srv/apps/nextcloud/apps/dav/lib/Connector/Sabre/Node.php\",\"line\":182,\"functx
ion\":\"getEtag\",\"class\":\"OC\\\\Files\\\\Node\\\\LazyFolder\",\"type\":\"->\",\"args\":[]},{\"file\":\"/srv/apps/nextcloud/apps/dav/lib/Connector/Sabre/FilesPlugin.php\",x
\"line\":337,\"function\":\"getETag\",\"class\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\Node\",\"type\":\"->\",\"args\":[]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lx
ib/DAV/PropFind.php\",\"line\":95,\"function\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\{closure}\",\"class\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\FilesPlugin\",\"type\":\"->\"x
,\"args\":[\"*** sensitive parameters replaced ***\"]},{\"file\":\"/srv/apps/nextcloud/apps/dav/lib/Connector/Sabre/FilesPlugin.php\",\"line\":336,\"function\":\"handle\",\"cx
lass\":\"Sabre\\\\DAV\\\\PropFind\",\"type\":\"->\",\"args\":[\"{DAV:}getetag\",[\"Closure\"]]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/event/lib/WildcardEmitterTrait.x
php\",\"line\":89,\"function\":\"handleGetProperties\",\"class\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\FilesPlugin\",\"type\":\"->\",\"args\":[[\"Sabre\\\\DAV\\\\PropFind\"],x
[\"OCA\\\\DAV\\\\Files\\\\FilesHome\"]]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php\",\"line\":1052,\"function\":\"emit\",\"class\":\"Sabre\\\\DAV\x
\\\Server\",\"type\":\"->\",\"args\":[\"propFind\",[[\"Sabre\\\\DAV\\\\PropFind\"],[\"OCA\\\\DAV\\\\Files\\\\FilesHome\"]]]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dax
v/lib/DAV/Server.php\",\"line\":984,\"function\":\"getPropertiesByNode\",\"class\":\"Sabre\\\\DAV\\\\Server\",\"type\":\"->\",\"args\":[[\"Sabre\\\\DAV\\\\PropFind\"],[\"OCA\x
\\\DAV\\\\Files\\\\FilesHome\"]]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php\",\"line\":1662,\"function\":\"getPropertiesIteratorForPath\",\"class\x
":\"Sabre\\\\DAV\\\\Server\",\"type\":\"->\",\"args\":[\"files/admin\",[\"{DAV:}getcontentlength\",\"{DAV:}getcontenttype\",\"{DAV:}getetag\",\"{DAV:}getlastmodified\",\"{DAVx
:}creationdate\",\"And 25 more entries, set log level to debug to see all entries\"],1]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php\",\"line\":1647x
,\"function\":\"writeMultiStatus\",\"class\":\"Sabre\\\\DAV\\\\Server\",\"type\":\"->\",\"args\":[[\"Sabre\\\\Xml\\\\Writer\",[],\"/remote.php/dav/\",[\"d\",\"s\",\"oc\",\"ncx
\"],[]],[\"Generator\"],false]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lib/DAV/CorePlugin.php\",\"line\":346,\"function\":\"generateMultiStatus\",\"class\":\"Sabrx
e\\\\DAV\\\\Server\",\"type\":\"->\",\"args\":[[\"Generator\"],false]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/event/lib/WildcardEmitterTrait.php\",\"line\":89,\"functx
ion\":\"httpPropFind\",\"class\":\"Sabre\\\\DAV\\\\CorePlugin\",\"type\":\"->\",\"args\":[[\"Sabre\\\\HTTP\\\\Request\"],[\"Sabre\\\\HTTP\\\\Response\"]]},{\"file\":\"/srv/apx
ps/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php\",\"line\":472,\"function\":\"emit\",\"class\":\"Sabre\\\\DAV\\\\Server\",\"type\":\"->\",\"args\":[\"method:PROPFIND\",[[\x
"Sabre\\\\HTTP\\\\Request\"],[\"Sabre\\\\HTTP\\\\Response\"]]]},{\"file\":\"/srv/apps/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php\",\"line\":253,\"function\"             x

… which only barely references Talk which is one of the missing apps.

Here is the output of occ app:list

Enabled:
  - activity: 3.0.0
  - bruteforcesettings: 3.0.0
  - circles: 30.0.0-dev
  - cloud_federation_api: 1.13.0
  - comments: 1.20.1
  - contactsinteraction: 1.11.0
  - dashboard: 7.10.0
  - dav: 1.31.1
  - federatedfilesharing: 1.20.0
  - federation: 1.20.0
  - files: 2.2.0
  - files_external: 1.22.0
  - files_pdfviewer: 3.0.0
  - files_reminders: 1.3.0
  - files_sharing: 1.22.0
  - files_trashbin: 1.20.1
  - files_versions: 1.23.0
  - logreader: 3.0.0
  - lookup_server_connector: 1.18.0
  - nextcloud_announcements: 2.0.0
  - notifications: 3.0.0
  - oauth2: 1.18.1
  - password_policy: 2.0.0
  - photos: 3.0.2
  - privacy: 2.0.0
  - provisioning_api: 1.20.0
  - recommendations: 3.0.0
  - related_resources: 1.5.0
  - serverinfo: 2.0.0
  - settings: 1.13.0
  - sharebymail: 1.20.0
  - support: 2.0.0
  - survey_client: 2.0.0
  - systemtags: 1.20.0
  - text: 4.1.0
  - theming: 2.5.0
  - twofactor_backupcodes: 1.19.0
  - twofactor_totp: 12.0.0-dev
  - updatenotification: 1.20.0
  - user_status: 1.10.0
  - viewer: 3.0.0
  - weather_status: 1.10.0
  - webhook_listeners: 1.1.0-dev
  - workflowengine: 2.12.0
Disabled:
  - admin_audit: 1.20.0
  - encryption: 2.18.0
  - files_downloadlimit: 3.0.0 (installed 2.0.0)
  - firstrunwizard: 3.0.0 (installed 2.14.0)
  - suspicious_login: 8.0.0
  - twofactor_nextcloud_notification: 4.0.0
  - user_ldap: 1.21.0

The ones that report as installed when I run occ app:install _____ but which are not listed above are…

  - announcementcenter
  - calendar
  - contacts
  - cookbook
  - deck
  - fulltextsearch
  - files_fulltextsearch
  - fileslibreofficeedit
  - keeweb
  - memories
  - metadata
  - phonetrack
  - previewgenerator
  - richdocuments
  - richdocumentscode
  - spreed
  - tasks
  - timemanager

My config.php is as follows…

<?php
$CONFIG = array (
  'passwordsalt' => '##########',
  'secret' => '##########',
  'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '##########',
  ),
  'datadirectory' => '##########/nextcloud',
  'dbtype' => 'mysql',
  'version' => '30.0.0.14',
  'overwrite.cli.url' => 'http://localhost',
  'dbname' => '##########',
  'dbhost' => 'localhost:/run/mysqld/mysqld.sock',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => '##########',
  'dbpassword' => '##########',
  'installed' => true,
  'instanceid' => '##########',
  'log_type' => 'syslog',
  'logfile' => '',
  'loglevel' => '3',
  'redis' =>
  array (
    'host' => '/run/redis/redis.sock',
    'port' => '0',
    'dbindex' => '3',
    'timeout' => '0.0',
  ),
  'filelocking.enabled' => true,
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'cache_path' => '##########/nextcloud',
  'apps_paths' =>
  array (
    0 =>
    array (
      'path' => '##########/nextcloud/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 =>
    array (
      'path' => '##########/nextcloud/ext_apps',
      'url' => '/ext_apps',
      'writable' => true,
    ),
  ),
  'upgrade.disable-web' => true,
  'default_phone_region' => 'CA',
  'blacklisted_files' =>
  array (
  ),
  'mail_smtpmode' => 'smtp',
  'mail_smtphost' => '127.0.0.1',
  'mail_smtpport' => 25,
  'mail_smtpauth' => true,
  'mail_smtpauthtype' => 'LOGIN',
  'mail_smtpname' => '##########',
  'mail_smtppassword' => '##########',
  'appstoreenabled' => 'false',
  'maintenance' => false,
  'memories.exiftool_no_local' => true,
  'memories.vod.path' => '##########/nextcloud/ext_apps/memories/bin-ext/go-vod-amd64',
  'memories.vod.ffmpeg' => '/bin/ffmpeg',
  'memories.vod.ffprobe' => '/bin/ffprobe',
  'memories.db.triggers.fcu' => true,
  'defaultapp' => 'apporder',
  'mail_from_address' => '##########',
  'mail_sendmailmode' => 'smtp',
  'mail_domain' => '##########',
  'enable_previews' => true,
  'enabledPreviewProviders' =>
  array (
    0 => 'OC\\Preview\\BMP',
    1 => 'OC\\Preview\\Font',
    2 => 'OC\\Preview\\GIF',
    3 => 'OC\\Preview\\Illustrator',
    4 => 'OC\\Preview\\JPEG',
    5 => 'OC\\Preview\\MarkDown',
    6 => 'OC\\Preview\\Movie',
    7 => 'OC\\Preview\\MP3',
    8 => 'OC\\Preview\\MP4',
    9 => 'OC\\Preview\\MSOffice2003',
    10 => 'OC\\Preview\\MSOffice2007',
    11 => 'OC\\Preview\\MSOfficeDoc',
    12 => 'OC\\Preview\\PDF',
    13 => 'OC\\Preview\\Photoshop',
    14 => 'OC\\Preview\\PNG',
    15 => 'OC\\Preview\\SVG',
    16 => 'OC\\Preview\\TIFF',
    17 => 'OC\\Preview\\TXT',
    18 => 'OC\\Preview\\XBitmap',
  ),
  'preview_libreoffice_path' => '/bin/libreoffice',
  'preview_ffmpeg_path' => '/bin/ffmpeg',
);

NB: The NC root, data, and cache directories are in different paths, which isn’t obvious above.

No idea where to start with this. Any help would be appreciated!


EDIT: If I run the integrity check against calendar I get an error…

... occ integrity:check-app calendar
  - EXCEPTION:
    - class: Exception
    - message: App not found

So one part of occ things calendar is installed, and another part doesn’t.


EDIT 2 - PROBLEM FOUND: During my upgrade process, in order to avoid stale files, I delete the NC root (which is recommended), and start with fresh files, including my ext_apps directory which is where the extra apps get installed.

With previous versions I was able to just re-install the apps using occ app:install _______ and it would work perfectly fine. Now it seems NC is reporting that the App is already installed despite the files not being there anymore, and so you can’t re-install it, and thus the files are never re-created.

This is why the apps aren’t working. But how are we supposed to now force the app to re-install the fresh files when NC thinks it’s already installed?

I just tried occ app:update calendar and it responds calendar not installed, but then if I try occ app:install calendar it responds calendar already installed.


EDIT 3: I’ve created a bug report at GITHub here: [Bug]: app:install reports app as already installed when files have been deleted, while app:update reports not installed · Issue #48413 · nextcloud/server · GitHub

While this may have worked before, it was more accidental that it worked and it’s not what we recommend in our documented manual upgrade process.

But you’re right that this previously may have worked for you. That particular function (used by app:install) previously checked whether an app was installed by just looking for the existence of the app’s installation folder. It now more properly queries the database to see if the app is installed, which is more consistent with other areas of our app management code. This change was made in v30.

Our recommended manual update process states you should keep your apps though. :slight_smile: If you do so, this change has no impact.

Hi Josh, this has worked for years, and was in-line with the recommended treatment of the NC root so I hadn’t seen the lines regarding extra apps. As I mentioned on the github thread, it’s odd that one standard is applied to the core app, and another standard to extra apps. I worry about stale files accumulating in long established extra apps unless there’s some form of garbage collection as part of the update process.

In any case, thanks for pointing this out, I’ll adjust our upgrade process accordingly.

1 Like

I followed up on the GH issue with you re: your comment.

Short answer: the app management code completely removes old app versions before replacing with them with newer ones.

1 Like

Saw that, and appreciate it Josh, thanks!

This topic was automatically closed 8 days after the last reply. New replies are no longer allowed.