docs: design dwukanałowego systemu aktualizacji + zarządzanie licencjami

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 00:18:14 +01:00
parent 2e715e803e
commit ff227fa6e0

View File

@@ -0,0 +1,113 @@
# Design: Dwukanałowy system aktualizacji + zarządzanie licencjami
**Data:** 2026-02-28
**Status:** Zatwierdzony
## Kontekst
cmsPRO jest używany przez wielu klientów. Celem jest wprowadzenie dwustopniowej dystrybucji aktualizacji:
- Kanał **beta** — tylko wybrane testowe instalacje (12 strony dewelopera)
- Kanał **stable** — wszyscy pozostali klienci
Zarządzanie odbywa się z panelu admina na `cmspro.project-dc.pl` (ten sam serwer i DB co serwer aktualizacji).
**Kluczowe ograniczenie:** nowy moduł admina oraz nowe tabele DB nigdy nie trafiają do paczek aktualizacyjnych wysyłanych klientom.
---
## Sekcja 1: Baza danych
Dwie nowe tabele tworzone **ręcznie tylko na serwerze dewelopera**. Nie mogą pojawić się w żadnym SQL migracyjnym dla klientów.
```sql
CREATE TABLE pp_update_licenses (
id INT AUTO_INCREMENT PRIMARY KEY,
`key` VARCHAR(64) NOT NULL UNIQUE,
domain VARCHAR(255) NOT NULL,
valid_to_date DATE NULL,
valid_to_version VARCHAR(10) NULL,
beta TINYINT(1) NOT NULL DEFAULT 0,
note TEXT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE pp_update_versions (
id INT AUTO_INCREMENT PRIMARY KEY,
version VARCHAR(10) NOT NULL UNIQUE,
channel ENUM('beta','stable') NOT NULL DEFAULT 'beta',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
promoted_at DATETIME NULL
);
```
Dane z `updates/versions.php` (tablica `$license`) migrujemy jednorazowo do `pp_update_licenses`.
---
## Sekcja 2: Plik `updates/versions.php`
Plik zostaje w tym samym miejscu, zmienia się tylko logika (hardkodowane tablice zastępowane odczytem z DB).
### Nowy przepływ:
1. `require_once '../config.php'` → dostęp do `$mdb` (Medoo)
2. Skan filesystem — lista istniejących ZIPów (jak dotychczas)
3. **Auto-discovery:** każdy ZIP nieobecny w `pp_update_versions``INSERT IGNORE` z `channel='beta'`. Wrzucenie nowego ZIPa na serwer automatycznie rejestruje go jako beta — bez zmian w `build-update.ps1`.
4. Walidacja klucza z `pp_update_licenses` (zamiast `$license[...]`)
5. Filtrowanie wersji według kanału:
- klient z `beta=1` → wersje gdzie `channel IN ('beta','stable')`
- klient z `beta=0` → tylko `channel='stable'`
6. Dalsze filtrowanie po `valid_to_date` i `valid_to_version` (bez zmian)
7. Wypisanie listy wersji (jak dotychczas)
---
## Sekcja 3: Nowy moduł admina `Releases`
Nowa nazwa `Releases` (odróżnienie od istniejącego modułu `Update` używanego przez klientów do aktualizacji własnej instalacji).
### Zakładka "Wersje"
- Tabela z `pp_update_versions` + status istnienia ZIPa na dysku
- Kolumny: wersja, kanał, data dodania, data promocji
- Akcje: **Promuj do stable** / **Cofnij do beta**
### Zakładka "Licencje"
- Tabela z `pp_update_licenses`
- Kolumny: domena, klucz (skrócony hash), ważna do daty, ważna do wersji, beta (toggle), notatka
- Pełny CRUD: dodaj / edytuj / usuń
- Szybki toggle flagi `beta` bezpośrednio z listy
### Pliki modułu
Wszystkie wykluczone z paczek ZIP dla klientów:
```
autoload/admin/controls/class.Releases.php
autoload/admin/factory/class.Releases.php
autoload/admin/view/class.Releases.php
admin/templates/releases/main-view.php
admin/templates/releases/licenses-view.php
```
---
## Sekcja 4: Wykluczenie z aktualizacji klientów
### Pliki PHP
W `build-update.ps1` — dodanie powyższych ścieżek do listy wykluczeń.
### Tabele DB
`pp_update_licenses` i `pp_update_versions` **nigdy** nie pojawiają się w:
- plikach `_sql.txt` dołączanych do paczek
- sekcji `sql` w plikach `_manifest.json`
Tabele tworzone jednorazowo ręcznie na serwerze dewelopera.
---
## Migracja danych
Jednorazowy skrypt PHP (uruchamiany ręcznie na serwerze) przenosi dane z `$license[...]` z `versions.php` do `pp_update_licenses`. Po migracji tablica `$license` w `versions.php` jest usuwana.