Executive Summary
Przeprowadzono pełną inżynierię odwrotną lokalnego środowiska Leantime na podstawie konfiguracji, stanu runtime, logów, sieci, wolumenów, bazy danych, kodu zawartego w obrazie oraz zachowania aplikacji HTTP.
Obraz systemu
Badany system jest jednowęzłową instalacją aplikacji do zarządzania projektami i pracą zespołu. Kontener aplikacyjny łączy nginx, PHP-FPM, Leantime i scheduler; drugi kontener zapewnia MySQL. Jedynym publicznym punktem wejścia jest http://localhost:8080, a baza pozostaje dostępna wyłącznie wewnątrz sieci Compose.
Końcowa weryfikacja wykazała stan healthy dla obu kontenerów, brak restartów, przekierowanie niezalogowanego użytkownika do formularza logowania oraz odpowiedź HTTP 200 dashboardu po uwierzytelnieniu.
Zakres funkcjonalny
Leantime wspiera projekty, cele, kamienie milowe, zadania, Kanban, kalendarz, sprinty, ewidencję czasu, raporty, wiki, pliki, komentarze, powiadomienia i administrację użytkownikami. System stosuje sześciopoziomowy model ról od Read Only do Owner.
Stan danych
Instancja ma charakter demonstracyjny: zawiera jednego właściciela, projekt My Project i jedenaście elementów pracy, głównie onboarding. Brak klientów, wpisów czasu, sprintów, komentarzy i plików biznesowych. Dane nie reprezentują kompletnego procesu organizacji.
Kluczowe decyzje rekonstrukcyjne
- Przypiąć obrazy do zaobserwowanych digestów zamiast używać ruchomych tagów.
- Wygenerować nowe sekrety; nie przenosić wartości z prywatnego
.env. - Preferować czystą inicjalizację i jawny seed zamiast kopiowania anomalii danych.
- Uzgodnić strefę czasową i decyzję o telemetrii przed odbiorem.
- Potwierdzić rezultat pełnym zestawem testów funkcjonalnych i operacyjnych.
Discovery środowiska
Metoda i zakres
Discovery wykonano 20 czerwca 2026 r. w katalogu /home/pawel/lab/leantime-reverse-engineering-10. Analiza objęła pliki, efektywną konfigurację Compose, kontenery, obrazy, procesy, sieć, porty, wolumeny, logi, bazę i sesję HTTP. Hasła oraz klucze nie są powielane w raporcie.
Artefakty wejściowe
| Artefakt | Rola | Ustalenie |
|---|---|---|
docker-compose.yml | Definicja stosu | Dwie usługi, jedna sieć, pięć wolumenów, port 8080. |
.env | Konfiguracja lokalna | Połączenie DB, URL, sekret sesji, hasła i konto demonstracyjne; plik prywatny. |
| Wolumeny Docker | Stan trwały | Brak dumpa SQL i skryptu seed w katalogu; dane istnieją w aktywnych wolumenach. |
Katalog nie był repozytorium Git. Istniały starsze wolumeny z prefiksem leantime0_, lecz nie należały do aktywnego projektu.
Kontenery i obrazy
| Usługa | Kontener | Obraz | Stan | Rola |
|---|---|---|---|---|
leantime | leantime | leantime/leantime:latest | healthy, 0 restartów | HTTP, UI, logika, scheduler |
mysql_leantime | leantime_db | mysql:8.4 | healthy, 0 restartów | Relacyjna baza danych |
| Komponent | Wersja | Dowód |
|---|---|---|
| Leantime | 3.9.5 | CLI about |
| Schemat Leantime | 3.5.18 | CLI i zp_settings |
| MySQL | 8.4.10 | CLI DB i manifest obrazu |
| PHP / Laravel / nginx | 8.3.31 / 11.45.1 / 1.30.2 | CLI, nagłówki HTTP |
Sieć, porty i trwałość
Sieć bridge leantime-net używa podsieci 172.18.0.0/16. Aplikacja miała IP 172.18.0.3, baza 172.18.0.2. DNS Compose rozwiązuje mysql_leantime. Tylko TCP 8080 jest publikowany na IPv4 i IPv6; 3306/33060 pozostają wewnętrzne.
| Wolumen | Montowanie | Przeznaczenie |
|---|---|---|
leantime_db_data | /var/lib/mysql | Schemat oraz dane systemowe i biznesowe |
leantime_userfiles | /var/www/html/userfiles | Prywatne pliki użytkowników i marker trwałości |
leantime_public_userfiles | /var/www/html/public/userfiles | Publiczne zasoby użytkowników |
leantime_plugins | /var/www/html/app/Plugins | Wtyczki; wolumen pusty |
leantime_logs | /var/www/html/storage/logs | Logi aplikacji i deprecacji |
Baza i dane
Schemat obejmuje 35 tabel dotyczących użytkowników, ról, projektów, zadań, sprintów, czasu, kalendarza, plików, wiki, powiadomień, raportów, integracji, kolejek i audytu.
| Obiekt | Liczba dokładna | Charakter |
|---|---|---|
| Użytkownicy / projekty | 1 / 1 | Owner oraz My Project |
| Elementy pracy | 11 | 1 milestone, 10 zadań; onboarding i ślady eksperymentu |
| Role / uprawnienia | 6 / 59 | Dane systemowe |
| Członkostwa | 2 rekordy, 1 relacja logiczna | Duplikat wymagający decyzji migracyjnej |
| Klienci, sprinty, timesheety, komentarze | 0 | Brak danych biznesowych |
TABLE_ROWS InnoDB wskazywało 9 zadań, podczas gdy dokładne COUNT(*) i odczyt rekordów wykazały 11. Walidacja rekonstrukcji musi używać dokładnych zapytań.Weryfikacja HTTP i logów
GET /zwracał 302 do/auth/login.- Formularz logowania zawierał CSRF, e-mail, hasło i reset hasła.
- Poprawne uwierzytelnienie utworzyło sesję;
GET /dashboard/homezwrócił 200. - Dashboard potwierdził projekt i menu Dashboard, Project Hub, Timesheets, Calendar.
- Logi wykazały historyczne błędy instalacji/awatara i ostrzeżenia deprecacyjne, lecz zdrowy bieżący runtime.
Analiza komponentów
Warstwa aplikacyjna
Kontener leantime jest autonomicznym pakietem runtime. tini inicjuje skrypt startowy, a Supervisor utrzymuje nginx, PHP-FPM i php bin/leantime schedule:work. Nginx realizuje front HTTP, PHP-FPM wykonuje aplikację, a scheduler obsługuje kolejki e-mail, HTTP/default, telemetrię, ingestion i kontrolę licencji.
Warstwa danych
MySQL 8.4.10 jest krytyczną zależnością i trwałym źródłem prawdy dla encji domenowych, uprawnień i ustawień. Używa utf8mb4 oraz kolacji utf8mb4_unicode_ci. Healthcheck bazy steruje kolejnością startu aplikacji.
Warstwa plikowa
Cztery wolumeny aplikacji oddzielają pliki prywatne, publiczne, wtyczki i logi od obrazu. Dzięki temu wymiana kontenera nie powinna usuwać stanu. Backup bazy bez plików albo plików bez bazy nie zapewnia pełnej spójności funkcjonalnej.
Zależności runtime
| Źródło | Cel | Interfejs | Znaczenie |
|---|---|---|---|
| Przeglądarka | nginx | HTTP :8080 | UI, sesja i API aplikacji |
| nginx | PHP-FPM | lokalny FastCGI | Obsługa żądań dynamicznych |
| Leantime | MySQL | SQL :3306 | Dane i konfiguracja |
| Leantime | Wolumeny | System plików | Załączniki, wtyczki, logi |
| Scheduler | Kolejki/usługi | proces cykliczny | Praca asynchroniczna i raportowa |
Konfiguracja, produkt i dane
Konfiguracja wdrożenia
URL, port, host i dane bazy, sekret sesji, obrazy, restart, healthcheck, sieć, wolumeny.
Funkcje produktu
Projekty, zadania, cele, Kanban, kalendarz, sprinty, czas, raporty, wiki, role i logowanie.
Dane instancji
Owner, My Project, statusy, onboarding, ustawienia motywu, telemetria i wersja schematu.
Brakujące integracje
Brak osobnego Redis, SMTP, reverse proxy TLS, LDAP/OIDC i aktywnych wtyczek.
Research
Charakter systemu
Leantime jest webowym systemem organizacji pracy łączącym zarządzanie projektami, zadaniami i celami. Kod, UI, migracje oraz procesy tła są dostarczane wewnątrz obrazu, a nie w katalogu operatora.
Model informacji
Centralnym kontekstem jest projekt. Użytkownicy otrzymują członkostwo, a elementy pracy tworzą strukturę rezultatu: zadanie należy do kamienia milowego, a kamień milowy mierzy cel. Zadanie może posiadać opis, kryteria akceptacji, priorytet, status, wykonawcę, daty, estymaty, tagi, sprint i zależności.
Domeny biznesowe
- Portfel i projekty: tworzenie projektów, Project Hub, daty, budżety i członkostwo.
- Planowanie: cele, milestones, zadania, priorytety, terminy i zależności.
- Realizacja: Kanban, statusy, wykonawcy, sprinty, komentarze i załączniki.
- Plan osobisty: dashboard, kalendarz, własne zadania i timesheety.
- Współpraca: komentarze, wiki/notatki, reakcje, powiadomienia i pliki.
- Kontrola: statystyki, raporty, czas i zatwierdzenia.
- Administracja: role, uprawnienia, ustawienia, wtyczki, integracje i tokeny.
Dane demonstracyjne
Wszystkie obecne dane biznesowe sklasyfikowano jako demonstracyjne. Wskazują na to lokalna domena konta, nazwa projektu, onboardingowe tytuły, zadania rekonstrukcyjne, fikcyjny kontekst ACME i brak aktywności w pozostałych domenach. reconstruction-volume-test.txt jest markerem technicznym, nie załącznikiem użytkownika.
Architektura logiczna
Topologia
Przepływ żądania
- Przeglądarka wysyła żądanie HTTP do hosta na porcie 8080.
- Docker przekazuje ruch do nginx w kontenerze aplikacji.
- Nginx przekazuje obsługę dynamiczną do PHP-FPM i Leantime.
- Aplikacja weryfikuje sesję i uprawnienia, korzysta z MySQL oraz plików.
- Odpowiedź HTML/API wraca do przeglądarki; scheduler niezależnie obsługuje pracę cykliczną.
Właściwości jakościowe
| Obszar | Stan | Konsekwencja |
|---|---|---|
| Dostępność | Jedna replika każdego komponentu | Brak wysokiej dostępności; restart powoduje przerwę. |
| Trwałość | Nazwane wolumeny | Stan przeżywa wymianę kontenera, o ile nie użyto -v. |
| Izolacja | Baza bez publikacji portu | Ograniczona powierzchnia dostępu z hosta. |
| Bezpieczeństwo transportu | HTTP, brak proxy TLS | Akceptowalne lokalnie, nie dla produkcji. |
| Powtarzalność | Ruchome tagi obrazów | Wymaga przypięcia digestów. |
Plan rekonstrukcji
Wymagania
- Docker Engine lub Docker Desktop oraz Compose v2; host Linux, WSL lub macOS.
- Architektura amd64 albo uprzednio zweryfikowane obrazy alternatywne.
- Minimum około 3 GB na obrazy oraz zapas na bazę i logi.
- Wolny port TCP 8080 i dostęp do registry lub lokalnych obrazów.
- Generator sekretów, prywatny
.env, backup i narzędzie HTTP.
Artefakty docelowe
- Compose z obrazami przypiętymi do digestów.
.env.examplebez sekretów oraz chroniony.env.- Jawny, wersjonowany seed danych inicjalnych.
- Procedura backup/restore bazy i czterech wolumenów aplikacji.
- Automatyczny smoke test health, HTTP i liczników danych.
Kolejność uruchomienia
| Etap | Działanie | Punkt kontrolny |
|---|---|---|
| 1 | Zamrozić wersje, digesty, strefę czasu i wariant danych. | Specyfikacja zatwierdzona. |
| 2 | Zweryfikować host, Compose, port, miejsce i architekturę. | Brak konfliktów. |
| 3 | Utworzyć Compose, sieć, wolumeny i nowe sekrety. | docker compose config --quiet. |
| 4 | Pobrać obrazy i sprawdzić digesty. | Identyczne artefakty binarne. |
| 5 | Uruchomić MySQL i czekać na healthcheck. | healthy, charset i collation zgodne. |
| 6 | Uruchomić Leantime i migracje. | Leantime 3.9.5, DB 3.5.18. |
| 7 | Załadować role, Ownera, projekt i zatwierdzony seed. | Dokładne liczniki zgodne. |
| 8 | Wykonać smoke i testy funkcjonalne. | Brak defektów krytycznych. |
| 9 | Zrestartować bez usuwania wolumenów. | Dane i pliki zachowane. |
| 10 | Wykonać backup i kontrolowany restore. | Odtworzenie na nowych wolumenach. |
Inicjalizacja danych
Wariant zalecany: czysta instancja + seed
Migracje obrazu, nowe konto Owner, jeden projekt, jedno unikalne członkostwo, sześć ról i 59 uprawnień. Onboarding ładowany opcjonalnie. Wariant powtarzalny i łatwy do anonimizacji.
Wariant wierny: klon eksperymentu
Spójny dump transakcyjny i archiwa wolumenów, odtworzone przed aplikacją. Zachowuje 11 elementów pracy i duplikat członkostwa; wymaga świadomej akceptacji anomalii.
Kontrole techniczne
docker compose config --quiet
docker compose up -d
docker compose ps
curl -fsS -o /dev/null http://localhost:8080/auth/login
docker compose exec leantime php bin/leantime about --only=environment
docker compose exec mysql_leantime mysql -u"$LEAN_DB_USER" -p -D leantime \
-e 'SELECT COUNT(*) users FROM zp_user; SELECT COUNT(*) projects FROM zp_projects;'
Hasła należy przekazywać interaktywnie lub przez mechanizm secrets. Nie powinny znajdować się w historii powłoki ani w raporcie.
Kryteria odbioru
- Oba kontenery healthy, zero nieplanowanych restartów; opublikowany tylko port 8080.
- Poprawne logowanie, wersje, role, projekt i uzgodnione dane seed.
- Spójne działanie dashboardu, zadań, Kanbanu, kalendarza i przypisań.
- Trwałość po restarcie i poprawny restore na izolowanych wolumenach.
- Brak nowych
production.ERRORw przebiegu odbiorowym.
Projekt funkcjonalny
Cel systemu
System wspiera planowanie, realizację i kontrolę pracy projektowej w jednej przestrzeni współpracy. Pozwala przełożyć cele na kamienie milowe i zadania, przydzielać odpowiedzialność, monitorować terminy i postęp oraz udostępniać wiedzę zespołowi.
Zakres funkcjonalny
- zarządzanie użytkownikami, rolami, klientami i dostępem projektowym;
- tworzenie i prowadzenie projektów, celów, kamieni milowych i zadań;
- Kanban, sprinty, kalendarz, statusy, priorytety, terminy i estymaty;
- dashboardy, raportowanie i ewidencja czasu pracy;
- komentarze, pliki, notatki/wiki i powiadomienia;
- ustawienia organizacji, integracje i rozszerzenia dla uprawnionych osób.
Poza zakresem podstawowym pozostają księgowość, fakturowanie, kadry, repozytorium kodu, komunikator czasu rzeczywistego i automatyzacja wdrożeń.
Aktorzy
| Aktor | Odpowiedzialność |
|---|---|
| Właściciel | Organizacja, pełny model dostępu, administratorzy. |
| Administrator | Użytkownicy, role, ustawienia i dostępność funkcji. |
| Manager | Projekty, zespół, cele, plan i raportowanie. |
| Edytor | Tworzenie i aktualizacja elementów pracy. |
| Komentujący | Odczyt i udział w dyskusji bez edycji planu. |
| Odbiorca Read Only | Przegląd stanu i wyników. |
| System | Powiadomienia, kolejki i działania cykliczne. |
Główne funkcje
Uwierzytelnienie
Logowanie e-mailem i hasłem, reset hasła, profil, sesja i autoryzacja.
Projekty i zespół
Projekt, opis, typ, daty, klient, członkowie i selektor bieżącego projektu.
Planowanie pracy
Cele, milestones i zadania z opisem, priorytetem, wykonawcą, statusem, terminem i estymatą.
Realizacja i kontrola
Kanban, sprinty, kalendarz, dashboard, timesheety i raporty.
Współpraca
Komentarze, załączniki, wiedza i powiadomienia w kontekście pracy.
Administracja
Role, uprawnienia, ustawienia, integracje, tokeny i wtyczki.
Reguły biznesowe
- E-mail użytkownika jest unikalny, a sesję może rozpocząć tylko konto aktywne.
- Operacja wymaga odpowiedniej roli i dostępu do projektu.
- Zadanie należy do projektu, a jego status musi pochodzić z workflow tego projektu.
- Zmiana statusu jest spójna w szczegółach, Kanbanie, dashboardzie i raportach.
- Termin końcowy nie powinien poprzedzać daty rozpoczęcia.
- Raporty wynikają z aktualnych danych źródłowych, a operacje administracyjne są chronione serwerowo.
Kryteria funkcjonalne
Uprawniony użytkownik może się zalogować, utworzyć projekt i zadanie, przypisać członka, zmienić status, zobaczyć spójny wynik w Kanbanie, dashboardzie i szczegółach, znaleźć termin w kalendarzu oraz utracić prawo edycji po obniżeniu roli.
Role użytkowników
Model uprawnień
Role są hierarchiczne i oparte na zapisanej macierzy uprawnień. Dostęp do operacji zależy jednocześnie od poziomu roli i członkostwa w projekcie. Liczba uprawnień odzwierciedla badaną bazę, lecz nie zastępuje testu poszczególnych operacji.
| Rola | Poziom | Liczba uprawnień | Zakres funkcjonalny |
|---|---|---|---|
| Read Only | 5 | 11 | Odczyt udostępnionych danych. |
| Commenter | 10 | 15 | Odczyt i ograniczona współpraca/komentarze. |
| Editor | 20 | 41 | Edycja projektów i elementów pracy. |
| Company Manager | 30 | 48 | Zarządzanie pracą na poziomie organizacji. |
| Admin | 40 | 59 | Pełna administracja operacyjna. |
| Owner | 50 | 59 | Pełna administracja i właścicielstwo instancji. |
Zasady dostępu
- Stosować najmniejsze niezbędne uprawnienia.
- Chronić operacje na serwerze; ukrycie elementu UI nie wystarcza.
- Nie tworzyć więcej niż jednego logicznego członkostwa użytkownik-projekt.
- Testować zmianę roli w istniejącej i nowej sesji.
- Chronić ostatnie konto Owner przed odebraniem kontroli nad instancją.
Przypadki użycia
UC-01 Logowanie
- Aktor
- Aktywny użytkownik.
- Warunek
- Konto istnieje i jest aktywne.
- Przebieg
- Użytkownik podaje e-mail i hasło; system weryfikuje dane, tworzy sesję i pokazuje dashboard.
- Rezultat
- Sesja z właściwymi uprawnieniami; błędne dane nie ujawniają istnienia konta.
UC-02 Utworzenie projektu
- Aktor
- Owner, Admin lub Manager.
- Warunek
- Prawo tworzenia projektu.
- Przebieg
- Wprowadzenie nazwy, opisu, dat i opcjonalnego klienta w Project Hub.
- Rezultat
- Projekt jest dostępny w selektorze; brak nazwy blokuje zapis.
UC-03 Dodanie użytkownika do projektu
- Aktor
- Manager, Admin lub Owner.
- Warunek
- Projekt i użytkownik istnieją.
- Przebieg
- Wybór użytkownika i roli projektowej, zatwierdzenie członkostwa.
- Rezultat
- Dostęp zgodny z rolą; ponowienie nie tworzy duplikatu.
UC-04 Utworzenie zadania
- Aktor
- Editor lub rola wyższa.
- Warunek
- Dostęp do projektu.
- Przebieg
- Tytuł, opis, priorytet, status, daty i estymata są zapisywane.
- Rezultat
- Zadanie pojawia się w projekcie i właściwej kolumnie Kanban.
UC-05 Przypisanie wykonawcy
- Aktor
- Editor lub wyższy.
- Warunek
- Kandydat jest członkiem projektu.
- Przebieg
- Wybór wykonawcy w zadaniu i zapis.
- Rezultat
- Zadanie trafia do widoków osobistych wykonawcy.
UC-06 Zmiana statusu
- Aktor
- Uprawniony członek.
- Warunek
- Status należy do workflow projektu.
- Przebieg
- Zmiana w formularzu lub przeciągnięcie karty.
- Rezultat
- Spójny stan w szczegółach, Kanbanie, dashboardzie i raportach.
UC-07 Planowanie celu i kamienia milowego
- Aktor
- Manager lub Editor.
- Przebieg
- Cel, mierzący go milestone, termin i powiązane zadania.
- Rezultat
- Praca operacyjna jest powiązana z rezultatem.
UC-08 Praca na Kanbanie
- Aktor
- Członek projektu.
- Przebieg
- Filtrowanie, przegląd kolumn i przenoszenie dozwolonych kart.
- Rezultat
- Tablica odzwierciedla workflow; role niższe nie zmieniają stanu.
UC-09 Kalendarz
- Aktor
- Zalogowany użytkownik.
- Warunek
- Elementy mają daty.
- Przebieg
- Wybór zakresu i przejście z terminu do obiektu.
- Rezultat
- Harmonogram jest zgodny z projektem i strefą czasu.
UC-10 Dashboard
- Aktor
- Zalogowany użytkownik.
- Przebieg
- Przegląd własnych/projektowych zadań, terminów i postępu.
- Rezultat
- Aktualne dane ograniczone do dostępnych projektów.
UC-11 Rejestracja czasu
- Aktor
- Członek zespołu.
- Przebieg
- Data, czas i opis pracy w kontekście zadania.
- Rezultat
- Wpis widoczny w timesheetach i raportach.
UC-12 Współpraca
- Aktor
- Commenter lub wyższy.
- Przebieg
- Dodanie komentarza i opcjonalnego pliku.
- Rezultat
- Dyskusja i artefakty pozostają w kontekście zadania.
UC-13 Zarządzanie rolą
- Aktor
- Admin lub Owner.
- Przebieg
- Zmiana roli i zapis.
- Rezultat
- Nowa macierz operacji obowiązuje najpóźniej przy kolejnej sesji.
UC-14 Wylogowanie
- Aktor
- Zalogowany użytkownik.
- Przebieg
- Wylogowanie i ponowne otwarcie chronionego URL.
- Rezultat
- Sesja jest nieważna, wymagane ponowne logowanie.
Scenariusze testowe
Organizacja testów
Testy należy wykonywać na odtworzonej instancji, używając kont Owner, Editor, Commenter i Read Only oraz projektu TEST-Project. Dla każdego przebiegu należy zachować czas, rolę, wynik HTTP/UI, identyfikatory obiektów i wycinek logu.
| ID | Priorytet | Przebieg skrócony | Wynik oczekiwany |
|---|---|---|---|
| TC-01 | Krytyczny | Przekierowanie, poprawny e-mail/hasło. | CSRF, sesja i dashboard bez błędu. |
| TC-02 | Wysoki | Błędne hasło i nieistniejący e-mail. | Brak sesji i enumeracji kont; brak 500. |
| TC-03 | Wysoki | Wylogowanie, chroniony URL, Wstecz. | Wymagane ponowne uwierzytelnienie. |
| TC-04 | Krytyczny | Utworzenie TEST-Project; próba bez nazwy. | Jeden projekt; walidacja nazwy. |
| TC-05 | Krytyczny | Dodanie Editora dwa razy. | Dostęp i jedno logiczne członkostwo. |
| TC-06 | Krytyczny | Zadanie z opisem, datami i 3 SP. | Zgodne pola i karta Kanban. |
| TC-07 | Wysoki | Brak tytułu, błędne daty/estymata. | Walidacja bez częściowego rekordu. |
| TC-08 | Krytyczny | Zmiana na In Progress i odświeżenie. | Trwały, spójny status. |
| TC-09 | Krytyczny | Drag-and-drop do Done i powrót. | Brak duplikacji, zgodne szczegóły. |
| TC-10 | Krytyczny | Przypisanie Editorowi i jego logowanie. | Zadanie w osobistym dashboardzie. |
| TC-11 | Krytyczny | Kalendarz osobisty i projektowy. | Właściwa data, link i strefa czasu. |
| TC-12 | Krytyczny | New → In Progress → Done. | Aktualne widgety bez podwójnego liczenia. |
| TC-13 | Krytyczny | Próby edycji jako Commenter/Read Only. | Serwerowa odmowa niedozwolonych działań. |
| TC-14 | Krytyczny | Komentarz, plik, restart Compose. | Pełna trwałość; kontenery healthy. |
| TC-15 | Wysoki | Backup i restore do nowych wolumenów. | Kompletny, izolowany restore. |
| TC-16 | Wysoki | Kontrola portów i dostępu DB. | Tylko 8080 publiczny; SQL wewnętrzny. |
| TC-17 | Wysoki | Zimny start i obserwacja healthchecków. | Baza gotowa przed aplikacją; brak pętli. |
| TC-18 | Średni | Analiza logów po pełnym odbiorze. | Brak nowych błędów i sekretów w logu. |
Macierz odbioru
| Obszar | Scenariusze | Warunek zaliczenia |
|---|---|---|
| Dostęp | TC-01–03, TC-13 | Pozytywne i negatywne ścieżki bez obejścia autoryzacji. |
| Projekty i praca | TC-04–10 | Spójność CRUD, przypisań i statusów. |
| Widoki | TC-09, 11, 12 | Te same dane w szczegółach, Kanbanie, kalendarzu i dashboardzie. |
| Operacje | TC-14–18 | Trwałość, restore, izolacja i brak nowych błędów. |
Ograniczenia i założenia
Ograniczenia badania
- Nie wykonywano destrukcyjnego resetu, pełnego testu UI w przeglądarce ani testu obciążeniowego.
- Integracje z pocztą, LDAP/OIDC i usługami zewnętrznymi nie były skonfigurowane.
- Zakres modułów może zależeć od licencji lub wtyczek; wolumen wtyczek był pusty.
- Stan demonstracyjny nie pokrywa raportowania czasu, klientów, sprintów ani współpracy wieloosobowej.
Ograniczenia rozwiązania
- Jednowęzłowy stack nie zapewnia wysokiej dostępności.
- HTTP bez TLS jest odpowiedni tylko dla środowiska lokalnego.
- Jakość raportów zależy od kompletności statusów, dat, estymat i timesheetów.
- Funkcje powiadomień i integracji zależą od zewnętrznej konfiguracji.
Założenia funkcjonalne
- Organizacja posiada co najmniej jednego Ownera.
- Użytkownicy otrzymują dostęp wyłącznie do potrzebnych projektów.
- Zespół ustala znaczenie statusów i definicję zakończenia pracy.
- Dane demonstracyjne nie trafiają do produkcji bez jawnej decyzji.
- Testy odbiorowe używają osobnych kont dla każdej roli.
Ryzyka i zalecenia
| Ryzyko | Wpływ | Zalecenie |
|---|---|---|
Ruchome tagi latest i 8.4 | Niepowtarzalny runtime | Przypiąć oba digesty. |
Sekrety w .env | Ujawnienie dostępu | Nowe sekrety, chmod 0600, secrets manager. |
| Aktywna telemetria | Nieplanowany ruch/dane | Podjąć i udokumentować decyzję. |
Strefa America/Los_Angeles | Rozbieżności terminów i logów | Uzgodnić przed seedem i testami. |
| Duplikat członkostwa | Niespójność danych | Seed przez API/CLI, unikalność logiczna. |
| Ostrzeżenia deprecacyjne | Ryzyko przyszłej aktualizacji | Skatalogować i monitorować przy upgrade. |
| Duplikaty nagłówków bezpieczeństwa | Niejednoznaczna polityka klienta | Ujednolicić przed publikacją produkcyjną. |
Case Study
Kontekst eksperymentu
Eksperyment miał wykazać, czy system bez wcześniejszej dokumentacji może zostać opisany na tyle precyzyjnie, aby niezależny Agent AI odtworzył go bez dostępu do aktywnych kontenerów, wolumenów i prywatnych sekretów.
Przebieg
1. DevOps uruchomił środowisko
Przygotowano .env i Compose, uruchomiono MySQL z trwałym wolumenem i healthcheckiem, a następnie Leantime z czterema wolumenami oraz portem 8080. Wynikiem był sprawny, ale nieudokumentowany stack.
2. Agent AI przeprowadził discovery
Agent zinwentaryzował deklarację i runtime, obrazy, digesty, procesy, sieć, porty, wolumeny, logi, bazę, CLI oraz zachowanie HTTP. Porównanie różnych dowodów ujawniło telemetrię, strefę czasu, stare wolumeny, duplikat członkostwa i niedokładność statystyk InnoDB.
3. Agent AI wykonał inżynierię odwrotną
Konfiguracja i runtime dały architekturę, schema i dane dały model informacji, a moduły obrazu i działające UI dały funkcje biznesowe. Oddzielono produkt, konfigurację wdrożenia oraz dane demonstracyjne.
4. Powstał Projekt Funkcjonalny i testy
PF definiuje oczekiwane zachowanie bez narzucania implementacji. Przypadki użycia i 18 testów tworzą sprawdzalny kontrakt obejmujący funkcje, autoryzację, spójność widoków, trwałość i operacje.
5. Dokumentacja zasila niezależną rekonstrukcję
Drugi Agent AI powinien przygotować Compose, wygenerować sekrety, uruchomić bazę i aplikację w poprawnej kolejności, wykonać migracje i seed, a następnie przeprowadzić cały odbiór. Nie może korzystać z aktywnych wolumenów ani zgadywać obecnych haseł.
Mierniki sukcesu
- Brak zależności od wolumenów źródłowych i prywatnego
.env. - Zgodność architektury, wersji, granic sieci i modelu danych.
- Spełnienie PF oraz wszystkich krytycznych scenariuszy.
- Trwałość po restarcie i odtwarzalny backup/restore.
- Jawne rozróżnienie produktu, konfiguracji, seedu i anomalii.
Wnioski
Ocena środowiska
Badany stack jest niewielki, logicznie spójny i poprawnie izoluje bazę od hosta. Healthchecki i nazwane wolumeny zapewniają właściwą kolejność startu oraz podstawową trwałość. Aplikacja 3.9.5 działa w zweryfikowanej ścieżce logowania i dashboardu.
Warunki wiarygodnej rekonstrukcji
Wiarygodna rekonstrukcja wymaga zamrożenia artefaktów binarnych, nowych sekretów, kontrolowanego sposobu inicjalizacji, zgodnego modelu ról, dokładnych liczników oraz testów przekrojowych. Zalecanym wariantem jest czysta instancja z jawnym seedem, ponieważ usuwa historyczne anomalie i pozwala rozróżnić dane systemowe od demonstracyjnych.
Priorytety przed użyciem produkcyjnym
- Przypiąć digesty i ustanowić procedurę aktualizacji z backupem.
- Przenieść sekrety do chronionego mechanizmu i włączyć TLS.
- Uzgodnić strefę czasu, locale i politykę telemetrii.
- Usunąć duplikat członkostwa i ujednolicić nagłówki bezpieczeństwa.
- Przeprowadzić testy ról, trwałości i restore oraz monitorować deprecacje.
Metryka dokumentu
- Analizowany system
- Leantime 3.9.5, schemat DB 3.5.18
- Data wygenerowania
- 20 czerwca 2026
- Autor dokumentacji
- Gemini CLI
- Model AI
- OpenAI GPT-5 Codex
- Środowisko uruchomieniowe
- Docker Compose; kontenery Leantime i MySQL 8.4.10; lokalny host/WSL
- Źródła discovery
docker-compose.yml, prywatny.env(bez publikacji sekretów), efektywna konfiguracja Compose, inspekcja kontenerów i obrazów, sieć i wolumeny Docker, logi, CLI Leantime, schemat i dane MySQL, procesy runtime, porty i odpowiedzi HTTP aplikacji- Zakres dokumentu
- Discovery, analiza, architektura, research, PF, role, przypadki użycia, testy, plan rekonstrukcji i case study
- Klasyfikacja
- Raport końcowy, wersja 1.0
Koniec dokumentu. Raport nie zawiera haseł, kluczy sesyjnych ani innych wartości tajnych odczytanych ze środowiska.