All OCC commands fail on restored nextcloud 15.0.4 instance

Nextcloud version: 15.0.4 (fpm from docker)
Operating system and version: Ubuntu 18.04.2 LTS
Apache or nginx version: nginx/1.15.8 (also from dockerhub, nginx alpine)
PHP version (eg, 7.1): 7.2.15
Postgres version: 10

My setup follows the setup example from this nextcloud dockerhub page: a nginx with the nextcloud fpm version and a postgres instance.

When trying to restore a backup from the healthy nextcloud instance on my home server, I cannot execute any php occ commands in the new nextcloud container. The occ command simply fails.

This is not the first time this error has occurred; I have reproduced it.

Steps to replicate it:

  1. Create a fresh backup of data, config, themes folder and the database
  2. move backup to test VM
  3. restore folders, database (either with or without nextcloud running)
  4. try and execute php occ in the nextcloud container (using sudo docker-compose exec --user www-data nextcloud php occ)

The output of my occ command:

An unhandled exception has been thrown:
PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "appconfig" does not exist
LINE 1: SELECT * FROM "appconfig"
                      ^ in /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:104
Stack trace:
#0 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(104): PDO->query('SELECT * FROM "...')
#1 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(852): Doctrine\DBAL\Driver\PDOConnection->query('SELECT * FROM "...')
#2 /var/www/html/lib/private/DB/Connection.php(195): Doctrine\DBAL\Connection->executeQuery('SELECT * FROM "...', Array, Array, NULL)
#3 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php(206): OC\DB\Connection->executeQuery('SELECT * FROM "...', Array, Array)
#4 /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php(214): Doctrine\DBAL\Query\QueryBuilder->execute()
#5 /var/www/html/lib/private/AppConfig.php(315): OC\DB\QueryBuilder\QueryBuilder->execute()
#6 /var/www/html/lib/private/AppConfig.php(94): OC\AppConfig->loadConfigValues()
#7 /var/www/html/lib/private/AppConfig.php(272): OC\AppConfig->getApps()
#8 /var/www/html/lib/private/legacy/app.php(874): OC\AppConfig->getValues(false, 'installed_versi...')
#9 /var/www/html/lib/private/Server.php(502): OC_App::getAppVersions()
#10 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#11 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\Memcache\\Fac...')
#12 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\Memcache\\Fac...')
#13 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\Memcache\\Fac...')
#14 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#15 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('MemCacheFactory')
#16 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('MemCacheFactory')
#17 /var/www/html/lib/private/Server.php(1533): OC\ServerContainer->query('MemCacheFactory')
#18 /var/www/html/lib/private/Server.php(697): OC\Server->getMemCacheFactory()
#19 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#20 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\App\\AppManag...')
#21 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\App\\AppManag...')
#22 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\App\\AppManag...')
#23 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#24 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('AppManager')
#25 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('AppManager')
#26 /var/www/html/lib/private/Server.php(1723): OC\ServerContainer->query('AppManager')
#27 /var/www/html/lib/private/legacy/app.php(342): OC\Server->getAppManager()
#28 /var/www/html/lib/private/legacy/util.php(1482): OC_App::getEnabledApps(false, true)
#29 /var/www/html/lib/public/Util.php(519): OC_Util::needUpgrade(Object(OC\SystemConfig))
#30 /var/www/html/lib/base.php(720): OCP\Util::needUpgrade()
#31 /var/www/html/lib/base.php(1068): OC::init()
#32 /var/www/html/console.php(46): require_once('/var/www/html/l...')
#33 /var/www/html/occ(11): require_once('/var/www/html/c...')
#34 {main}

Next Doctrine\DBAL\Driver\PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "appconfig" does not exist
LINE 1: SELECT * FROM "appconfig"
                      ^ in /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:106
Stack trace:
#0 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(852): Doctrine\DBAL\Driver\PDOConnection->query('SELECT * FROM "...')
#1 /var/www/html/lib/private/DB/Connection.php(195): Doctrine\DBAL\Connection->executeQuery('SELECT * FROM "...', Array, Array, NULL)
#2 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php(206): OC\DB\Connection->executeQuery('SELECT * FROM "...', Array, Array)
#3 /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php(214): Doctrine\DBAL\Query\QueryBuilder->execute()
#4 /var/www/html/lib/private/AppConfig.php(315): OC\DB\QueryBuilder\QueryBuilder->execute()
#5 /var/www/html/lib/private/AppConfig.php(94): OC\AppConfig->loadConfigValues()
#6 /var/www/html/lib/private/AppConfig.php(272): OC\AppConfig->getApps()
#7 /var/www/html/lib/private/legacy/app.php(874): OC\AppConfig->getValues(false, 'installed_versi...')
#8 /var/www/html/lib/private/Server.php(502): OC_App::getAppVersions()
#9 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#10 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\Memcache\\Fac...')
#11 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\Memcache\\Fac...')
#12 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\Memcache\\Fac...')
#13 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#14 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('MemCacheFactory')
#15 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('MemCacheFactory')
#16 /var/www/html/lib/private/Server.php(1533): OC\ServerContainer->query('MemCacheFactory')
#17 /var/www/html/lib/private/Server.php(697): OC\Server->getMemCacheFactory()
#18 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#19 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\App\\AppManag...')
#20 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\App\\AppManag...')
#21 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\App\\AppManag...')
#22 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#23 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('AppManager')
#24 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('AppManager')
#25 /var/www/html/lib/private/Server.php(1723): OC\ServerContainer->query('AppManager')
#26 /var/www/html/lib/private/legacy/app.php(342): OC\Server->getAppManager()
#27 /var/www/html/lib/private/legacy/util.php(1482): OC_App::getEnabledApps(false, true)
#28 /var/www/html/lib/public/Util.php(519): OC_Util::needUpgrade(Object(OC\SystemConfig))
#29 /var/www/html/lib/base.php(720): OCP\Util::needUpgrade()
#30 /var/www/html/lib/base.php(1068): OC::init()
#31 /var/www/html/console.php(46): require_once('/var/www/html/l...')
#32 /var/www/html/occ(11): require_once('/var/www/html/c...')
#33 {main}

Next Doctrine\DBAL\Exception\TableNotFoundException: An exception occurred while executing 'SELECT * FROM "appconfig"':

SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "appconfig" does not exist
LINE 1: SELECT * FROM "appconfig"
                      ^ in /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractPostgreSQLDriver.php:76
Stack trace:
#0 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php(128): Doctrine\DBAL\Driver\AbstractPostgreSQLDriver->convertException('An exception oc...', Object(Doctrine\DBAL\Driver\PDOException))
#1 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(855): Doctrine\DBAL\DBALException::driverExceptionDuringQuery(Object(Doctrine\DBAL\Driver\PDOPgSql\Driver), Object(Doctrine\DBAL\Driver\PDOException), 'SELECT * FROM "...', Array)
#2 /var/www/html/lib/private/DB/Connection.php(195): Doctrine\DBAL\Connection->executeQuery('SELECT * FROM "...', Array, Array, NULL)
#3 /var/www/html/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php(206): OC\DB\Connection->executeQuery('SELECT * FROM "...', Array, Array)
#4 /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php(214): Doctrine\DBAL\Query\QueryBuilder->execute()
#5 /var/www/html/lib/private/AppConfig.php(315): OC\DB\QueryBuilder\QueryBuilder->execute()
#6 /var/www/html/lib/private/AppConfig.php(94): OC\AppConfig->loadConfigValues()
#7 /var/www/html/lib/private/AppConfig.php(272): OC\AppConfig->getApps()
#8 /var/www/html/lib/private/legacy/app.php(874): OC\AppConfig->getValues(false, 'installed_versi...')
#9 /var/www/html/lib/private/Server.php(502): OC_App::getAppVersions()
#10 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#11 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\Memcache\\Fac...')
#12 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\Memcache\\Fac...')
#13 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\Memcache\\Fac...')
#14 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#15 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('MemCacheFactory')
#16 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('MemCacheFactory')
#17 /var/www/html/lib/private/Server.php(1533): OC\ServerContainer->query('MemCacheFactory')
#18 /var/www/html/lib/private/Server.php(697): OC\Server->getMemCacheFactory()
#19 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(118): OC\Server->OC\{closure}(Object(OC\Server))
#20 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('OC\\App\\AppManag...')
#21 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('OC\\App\\AppManag...')
#22 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(165): OC\ServerContainer->query('OC\\App\\AppManag...')
#23 /var/www/html/3rdparty/pimple/pimple/src/Pimple/Container.php(114): OC\AppFramework\Utility\SimpleContainer->OC\AppFramework\Utility\{closure}(Object(OC\Server))
#24 /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php(117): Pimple\Container->offsetGet('AppManager')
#25 /var/www/html/lib/private/ServerContainer.php(132): OC\AppFramework\Utility\SimpleContainer->query('AppManager')
#26 /var/www/html/lib/private/Server.php(1723): OC\ServerContainer->query('AppManager')
#27 /var/www/html/lib/private/legacy/app.php(342): OC\Server->getAppManager()
#28 /var/www/html/lib/private/legacy/util.php(1482): OC_App::getEnabledApps(false, true)
#29 /var/www/html/lib/public/Util.php(519): OC_Util::needUpgrade(Object(OC\SystemConfig))
#30 /var/www/html/lib/base.php(720): OCP\Util::needUpgrade()
#31 /var/www/html/lib/base.php(1068): OC::init()
#32 /var/www/html/console.php(46): require_once('/var/www/html/l...')
#33 /var/www/html/occ(11): require_once('/var/www/html/c...')

My config.php:

<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'apps_paths' => 
  array (
    0 => 
    array (
      'path' => '/var/www/html/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 => 
    array (
      'path' => '/var/www/html/custom_apps',
      'url' => '/custom_apps',
      'writable' => true,
    ),
  ),
  'instanceid' => '',
  'passwordsalt' => '',
  'secret' => '',
  'trusted_domains' => 
  array (
    0 => 'local-name:44444',
  ),
  'datadirectory' => '/var/www/html/data',
  'overwrite.cli.url' => '',
  'dbtype' => 'pgsql',
  'version' => '15.0.4.0',
  'dbname' => 'correct db name',
  'dbhost' => 'name of the postgres container - reachable via docker DNS',
  'dbport' => '',
  'dbtableprefix' => '',
  'dbuser' => 'correct user',
  'dbpassword' => 'correct password',
  'installed' => true,
  'maintenance' => true,
  'data-fingerprint' => '1ec2f2b9b986651939c4e28c8342efd4',
  'mail_smtpmode' => 'smtp',
  'mail_smtpauthtype' => 'LOGIN',
  'loglevel' => 2,
);

Output of the postgres container:

postgres_1         | 2019-02-18 22:09:06.981 UTC [28] ERROR:  relation "appconfig" does not exist at character 15
postgres_1         | 2019-02-18 22:09:06.981 UTC [28] STATEMENT:  SELECT * FROM "appconfig"
postgres_1         | 2019-02-18 22:09:07.006 UTC [28] ERROR:  relation "appconfig" does not exist at character 15
postgres_1         | 2019-02-18 22:09:07.006 UTC [28] STATEMENT:  SELECT * FROM "appconfig"

However, when I connect to the postgres server as the nextcloud user, I can see that the appconfig relation does indeed exist:

nextcloud=> SELECT * FROM pg_catalog.pg_tables;
     schemaname     |        tablename         | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity 
--------------------+--------------------------+------------+------------+------------+----------+-------------+-------------
 public             | accounts                 | nextcloud  |            | t          | f        | f           | f
 public             | activity                 | nextcloud  |            | t          | f        | f           | f
 public             | appconfig                | nextcloud  |            | t          | f        | f           | f
 public             | activity_mq              | nextcloud  |            | t          | f        | f           | f
 public             | addressbookchanges       | nextcloud  |            | t          | f        | f           | f
 public             | addressbooks             | nextcloud  |            | t          | f        | f           | f
 pg_catalog         | pg_statistic             | arne       |            | t          | f        | f           | f
 pg_catalog         | pg_type                  | arne       |            | t          | f        | f           | f
 public             | authtoken                | nextcloud  |            | t          | f        | f           | f
 public             | bruteforce_attempts      | nextcloud  |            | t          | f        | f           | f
etc.

It seems to me that my configuration might be wrong somehow for the occ command to find the table; however, I cannot for the life of me figure out what is wrong, especially since I followed the backup and restore guide. Trying to bring nextcloud into maintenance mode before restoring the db also fails, with occ simply proclaiming that the command maintenance:mode does not exist.

I found a github issue that reports a very similar issue, albeit on a fresh installation of 15. However, my configuration works until I try to restore the backup.

Uuuh well turns out my database was not exactly the same. I fixed the problem by using pg_dumpall instead of pg_dump. Probably nextcloud was somehow missing access to the data, something to do with schemas or roles or something…