Add Update Manager for automated Part-DB updates

This feature adds a comprehensive Update Manager similar to Mainsail's
update system, allowing administrators to update Part-DB directly from
the web interface.

Features:
- Web UI at /admin/update-manager showing current and available versions
- Support for Git-based installations with automatic update execution
- Maintenance mode during updates to prevent user access
- Automatic database backup before updates
- Git rollback points for recovery (tags created before each update)
- Progress tracking with real-time status updates
- Update history and log viewing
- Downgrade support with appropriate UI messaging
- CLI command `php bin/console partdb:update` for server-side updates

New files:
- UpdateManagerController: Handles all web UI routes
- UpdateCommand: CLI command for running updates
- UpdateExecutor: Core update execution logic with safety mechanisms
- UpdateChecker: GitHub API integration for version checking
- InstallationTypeDetector: Detects installation type (Git/Docker/ZIP)
- MaintenanceModeSubscriber: Blocks user access during maintenance
- UpdateExtension: Twig functions for update notifications

UI improvements:
- Update notification in navbar for admins when update available
- Confirmation dialogs for update/downgrade actions
- Downgrade-specific text throughout the interface
- Progress page with auto-refresh
This commit is contained in:
Sebastian Almberg 2026-01-30 21:36:33 +01:00
parent ae4c0786b2
commit 42fe781ef8
16 changed files with 4126 additions and 0 deletions

View file

@ -74,6 +74,19 @@
<ul class="navbar-nav ms-3" id="login-content">
{# Update notification badge #}
{% if is_update_available() %}
<li class="nav-item me-2">
<a href="{{ path('admin_update_manager') }}" class="nav-link position-relative"
title="{% trans %}update_manager.new_version_available.title{% endtrans %}: {{ get_latest_version() }}">
<i class="fas fa-arrow-circle-up text-success"></i>
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-success" style="font-size: 0.6rem;">
{% trans %}update_manager.new{% endtrans %}
</span>
</a>
</li>
{% endif %}
<li class="nav-item dropdown">
<a href="#" class="dropdown-toggle link-anchor nav-link" data-bs-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false" id="navbar-user-dropdown-btn" data-bs-reference="window">