LocalAuthority / .doc / development-log.md
Newer Older
184 lines | 7.896kb
Bogdan Timofte authored a week ago
1
# Development Log
2

            
3
Acest fișier păstrează deciziile care schimbă scopul aplicației, regulile de operare sau modelul de deployment. Nu înlocuiește git history; explică de ce au apărut schimbările mari.
4

            
5
## 2026-06-06 - Repository and Deployment Split
6

            
7
Decizie: codul aplicației se dezvoltă local și se publică în GitPrep. Jumper rămâne runtime/deploy target.
8

            
9
Locații:
10

            
11
- checkout local: `/Users/bogdan/Documents/Workspaces/Xdev/Madagascar/LocalAuthority`
12
- GitPrep canonical remote: `git@192.168.2.102:repositories/bogdan/LocalAuthority.git`
13
- GitPrep web: `http://192.168.2.102:3000/bogdan/LocalAuthority`
14
- runtime jumper: `/usr/local/xdev-host-manager`
15

            
16
Motiv:
17

            
18
- editarea directă pe jumper amesteca dezvoltarea cu runtime-ul
19
- aplicația are acum scope mai mare și va continua să evolueze
20
- avem nevoie de istoric, review și deploy controlat
21

            
22
Regulă:
23

            
24
- `scripts/deploy_to_jumper.sh` publică aplicația pe jumper
25
- `config/` nu se copiază implicit
26
- `config/` se copiază doar cu `--include-config`, la cerere explicită
27

            
28
## 2026-06-06 - Scope Expanded Beyond Host Registry
29

            
30
Aplicația a pornit ca manager pentru registrul de hosturi, dar scope-ul curent include:
31

            
32
- registry de hosturi Madagascar
33
- manifest DNS local pentru jumper și as01
34
- Work Orders pentru schimbări operaționale confirmabile
35
- autoritate locală de certificate pentru hosturi
36
- exporturi pentru servicii consumatoare, preferabil prin git
37

            
38
Numele de produs a devenit `Madagascar Local Authority`.
39

            
40
Numele tehnice rămân stabile pentru compatibilitate:
41

            
42
- service systemd: `host-manager`
43
- user Unix: `host-manager`
44
- runtime path: `/usr/local/xdev-host-manager`
45
- environment file: `/etc/xdev/host-manager.env`
46

            
47
## 2026-06-06 - Work Orders Before Destructive Registry Changes
48

            
49
Decizie: numele cu impact operațional nu se șterg direct din UI.
50

            
51
Exemplu inițial:
52

            
53
- `pmx.*.madagascar.xdev.ro`
54
- `pbs.*.madagascar.xdev.ro`
55

            
56
Aceste nume au fost create pentru vhosturi nginx cu certificate Let's Encrypt. Odată cu CA-ul local, intenția este retragerea lor, dar eliminarea din registry se face doar după:
57

            
58
- inventarierea vhosturilor
59
- crearea și instalarea certificatelor locale
60
- eliminarea configurațiilor legacy
61
- testarea accesului prin numele canonice
62
- verificarea că numele nu mai sunt folosite
63
- aprobarea finală a operatorului
64

            
65
Confirmarea unui WO este blocată dacă checklist-ul nu este complet.
66

            
67
## 2026-06-06 - Local DNS Resolution Rules
68

            
69
Regulă: local nu se folosește wildcard pentru `*.madagascar.xdev.ro`.
70

            
71
Doar numele cunoscute din manifestul local trebuie să se rezolve intern. Numele necunoscute trebuie să întoarcă `NXDOMAIN`, chiar dacă DNS public poate avea wildcard către IP-ul public.
72

            
73
Resolverele interne sunt:
74

            
75
- jumper: `192.168.2.100`
76
- as01: `192.168.2.2`
77

            
78
Sync-ul rămâne explicit:
79

            
80
```bash
81
./scripts/sync_local_hosts.sh --apply --verify
82
```
83

            
84
## 2026-06-06 - Dependency Policy
85

            
86
Regulă: nu se instalează npm, pip sau CPAN direct pe hosturi.
87

            
88
Acceptat:
89

            
90
- pachete din distribuție, când sunt necesare
91
- Perl din distribuție
92
- module Perl core/distribution
93

            
94
CPAN se folosește doar dacă pachetul ajunge prin repo-ul local auditat.
95

            
96
Pachete de sistem instalate în timpul evoluției:
97

            
98
- `ripgrep` pe jumper
99
- `rsync` pe jumper
Bogdan Timofte authored 4 days ago
100
- `sqlite` pe jumper
101
- `perl-DBD-SQLite` pe jumper
Bogdan Timofte authored a week ago
102
- `sqlite3` pe mazeri/GitPrep
Bogdan Timofte authored 6 days ago
103

            
104
## 2026-06-06 - OTP Login Keeps a Password-Manager-Friendly Form Shape
105

            
106
Observație: unele password managere și autofill-uri mobile nu inițiau corect pe login-ul Madagascar Local Authority, deși completarea mergea pe o pagină similară din PBX management.
107

            
108
Diferențe relevante observate pe pagina care funcționa:
109

            
110
- formular clasic `method="post"`
111
- câmp de cont cu `autocomplete="username"`
112
- câmp unic pentru codul OTP, separat de cele 6 căsuțe vizuale
113

            
114
Decizie:
115

            
116
- UI-ul rămâne cu 6 căsuțe OTP
117
- formularul include și câmpuri ajutătoare off-screen pentru `username` și OTP agregat
118
- JS sincronizează codul complet între câmpul agregat și cele 6 căsuțe
119
- formularul păstrează `autocomplete="on"` la nivel de form, ca hint-urile specifice de pe câmpuri să nu fie neutralizate
120

            
121
Scop:
122

            
123
- compatibilitate mai bună cu password managere și autofill mobil
124
- fără a complica interfața vizibilă
Bogdan Timofte authored 5 days ago
125

            
Bogdan Timofte authored 4 days ago
126
## 2026-06-08 - Commit and Push Is the Development Contract
Bogdan Timofte authored 5 days ago
127

            
Bogdan Timofte authored 4 days ago
128
Observație: schimbările lăsate mult timp ca dirty working tree se pierd ușor în timpul deploy-urilor, reseturilor și schimbărilor de context. Pentru development, unitatea de lucru trebuie să fie commit-ul local, nu un set de fișiere uitate în stare necomisă.
Bogdan Timofte authored 5 days ago
129

            
130
Decizie:
131

            
Bogdan Timofte authored 4 days ago
132
- se lucrează cu commit-uri locale mici și coerente
133
- pentru test live, commit-ul se împinge în checkout-ul runtime de pe jumper cu `git push jumper-runtime HEAD:main`
134
- pentru arhivare și istoric canonic, același commit se împinge în GitPrep cu `git push origin main`
135
- jumper rămâne target de test live, nu locul principal de editare
136
- `scripts/deploy_to_jumper.sh` rămâne unealtă explicită de rsync deploy, dar nu înlocuiește disciplina commit/push
137
- `BUILD` rămâne sursa vizibilă pentru ce versiune rulează
Bogdan Timofte authored 5 days ago
138

            
139
Scop:
140

            
Bogdan Timofte authored 4 days ago
141
- niciun front de lucru să nu rămână doar în fișiere dirty locale sau runtime
142
- testul live pe jumper să fie legat de un commit identificabil
143
- GitPrep să păstreze istoria canonică pentru arhivare și recuperare
Bogdan Timofte authored 5 days ago
144
- badge-ul de build și meta tag-ul `xdev-build` devin verificarea rapidă pentru ce rulează
Bogdan Timofte authored 4 days ago
145

            
146
## 2026-06-09 - SQLite Runtime Source of Truth
147

            
148
Observație: editările de hosts făcute în aplicația live puteau rămâne în working tree-ul de pe jumper sau puteau fi suprascrise/confuzionate la push-ul de cod. Modelul vechi descria simultan `config/hosts.yaml` ca registry editabil în git și ca dată operațională runtime, ceea ce nu era o sursă de adevăr clară.
149

            
150
Decizie:
151

            
152
- `var/host-manager.sqlite` devine sursa de adevăr runtime pentru registry și Work Orders
153
- `config/hosts.yaml` și `config/work-orders.yaml` rămân seed/snapshot/export compatibility files
154
- la prima pornire, aplicația seed-uiește documentele lipsă din YAML în SQLite
155
- download-urile `/download/hosts.yaml`, `/download/local-hosts.tsv` și `/download/monitoring.json` sunt randate din SQLite
156
- `config/local-hosts.tsv` rămâne manifest generat explicit pentru sync-ul DNS local
157
- push-urile de cod către jumper nu trebuie să înlocuiască baza runtime din `var/`
158

            
159
Scop:
160

            
161
- editările făcute în UI să nu se piardă la deploy/push de cod
162
- să existe o singură autoritate runtime
163
- YAML/TSV să rămână utile pentru export, review și bootstrap fără să fie storage-ul live
Bogdan Timofte authored 4 days ago
164

            
165
## 2026-06-09 - Relational Runtime Schema
166

            
167
Observație: primul pas SQLite mutase sursa de adevăr din git în baza de date, dar o păstra ca document YAML într-o tabelă generică. Asta rezolva pierderea editărilor la push, dar nu oferea o bază de date operațională reală.
168

            
169
Decizie:
170

            
171
- `hosts.fqdn` devine cheia reală pentru hosturi, ca numele complete să evite coliziuni între domenii
172
- `legacy_id` rămâne doar compatibilitate pentru UI/API-ul curent
173
- aliasurile sunt păstrate în `host_aliases`, inclusiv după retragere
174
- vhosturile sunt în `vhosts` și pot fi mutate prin schimbarea `host_fqdn`
175
- rolurile, sursele, flagurile și SSH sunt în tabele separate, nu coloane adăugate continuu în `hosts`
176
- workerii de date au `data_workers`, `dhcp_leases` și `mdns_observations`
177
- certificatele emise au `certificates` și `certificate_dns_names`
178
- `documents` rămâne doar tabel legacy pentru migrare din modelul vechi document-store
179

            
180
Scop:
181

            
182
- schema să poată susține inventar, DNS, vhosturi, observații externe și certificate fără să piardă istoric operațional
183
- aliasurile/vhosturile retrase să rămână audibile în baza de date
184
- structura să fie extensibilă fără să supraîncarce tabelul `hosts`