From 60c57b67073ca6a230d8f7a2da805ad03f181884 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 23 Sep 2025 16:39:00 -0700 Subject: [PATCH] miniflux: Fix DB connection issues during install/uninstall Fixes: #2536. Multiple fixes: - When miniflux and postgresql are install simultaneously, miniflux setup may be installed before postgresql is started. - When postgresql is already installed and disabled (due to a previous uninstall), then postgresql may not be running during miniflux package installation (and fail initial DB setup). - When app is being installed while it is disabled, the database may not running and may lead to failure in removing the app database. Tests: - Run functional tests on stable/testing twice in a row. - Install the app without postgresql or miniflux installed. - Disable the app and uninstall it. DB is purged. - Uninstall and re-install (with postgresql is disabled during installed). Reviewed-by: James Valleroy --- plinth/modules/miniflux/__init__.py | 27 +++++++++++++++++++++++---- plinth/modules/miniflux/privileged.py | 9 +++++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/plinth/modules/miniflux/__init__.py b/plinth/modules/miniflux/__init__.py index ab1461d53..1a4083379 100644 --- a/plinth/modules/miniflux/__init__.py +++ b/plinth/modules/miniflux/__init__.py @@ -58,7 +58,12 @@ class MinifluxApp(app_module.App): login_required=True) self.add(shortcut) - packages = Packages('packages-miniflux', ['miniflux', 'postgresql']) + # miniflux package does not depend on postgres. Install postgresql, + # start it and only then install miniflux. + packages = Packages('packages-miniflux-postgresql', ['postgresql']) + self.add(packages) + + packages = Packages('packages-miniflux', ['miniflux']) self.add(packages) drop_in_configs = DropinConfigs( @@ -74,7 +79,7 @@ class MinifluxApp(app_module.App): urls=['https://{host}/miniflux/']) self.add(webserver) - daemon = SharedDaemon('shared-daemon-miniflus-postgresql', + daemon = SharedDaemon('shared-daemon-miniflux-postgresql', 'postgresql') self.add(daemon) @@ -89,7 +94,17 @@ class MinifluxApp(app_module.App): def setup(self, old_version=None): """Install and configure the app.""" privileged.pre_setup() - super().setup(old_version) + + # Database needs to be running for successful initialization or upgrade + # of miniflux database. 1. The app and database are being freshly + # installed. 2. The app is being freshly installed, but database server + # is already installed but disabled. 3. The app is being updated to new + # version but is currently disabled (DB is installed but disabled or + # enabled). + with self.get_component( + 'shared-daemon-miniflux-postgresql').ensure_running(): + super().setup(old_version) + privileged.setup(old_version) if not old_version: self.enable() @@ -97,7 +112,11 @@ class MinifluxApp(app_module.App): def uninstall(self): """De-configure and uninstall the app.""" privileged.uninstall() - super().uninstall() + with self.get_component( + 'shared-daemon-miniflux-postgresql').ensure_running(): + # Database needs to be running for successful removal miniflux + # database. + super().uninstall() class MinifluxBackupRestore(BackupRestore): diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py index 1018e53f4..e30b09170 100644 --- a/plinth/modules/miniflux/privileged.py +++ b/plinth/modules/miniflux/privileged.py @@ -123,8 +123,13 @@ def reset_user_password(username: str, password: secret_str): @privileged def uninstall(): """Ensure that the database is removed.""" - action_utils.debconf_set_selections( - ['miniflux miniflux/purge boolean true']) + action_utils.debconf_set_selections([ + 'miniflux miniflux/purge boolean true', + 'miniflux miniflux/dbconfig-install boolean true', + 'miniflux miniflux/dbconfig-reinstall boolean true' + 'miniflux miniflux/dbconfig-upgrade boolean true', + 'miniflux miniflux/dbconfig-remove boolean true', + ]) def _get_database_config():