Files
cmsPRO/docs/plans/2026-02-28-update-channels-design.md

3.9 KiB
Raw Permalink Blame History

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.

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_versionsINSERT 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.