LocalAuthority / .doc / host-manager.md
Newer Older
249 lines | 11.709kb
Xdev Host Manager authored a week ago
1
# Madagascar Local Authority MVP
Xdev Host Manager authored a week ago
2

            
Xdev Host Manager authored a week ago
3
Madagascar Local Authority este o aplicație web locală, Perl-only, pentru registrul de hosturi Madagascar, manifestele DNS locale, Work Orders și autoritatea locală de certificate. Nu folosește npm, pip sau pachete CPAN instalate direct pe host.
4

            
5
Numele de produs este `Madagascar Local Authority`. Numele tehnic al serviciului, userului Unix, path-ului și fișierelor de environment rămâne `host-manager`.
Xdev Host Manager authored a week ago
6

            
Bogdan Timofte authored 4 days ago
7
Pentru deciziile de evoluție și schimbările de scope, vezi indexul `.doc/development-log.md` și logurile pe componente din `.doc/development-logs/`.
Bogdan Timofte authored a week ago
8

            
Xdev Host Manager authored a week ago
9
## Politica de dependențe
10

            
11
Perl-ul livrat de distribuție este acceptat ca bază de runtime. Modulele Perl incluse în distribuție sau în core pot fi folosite direct.
12

            
13
Pachetele CPAN nu se instalează direct pe host cu `cpan`, `cpanm` sau mecanisme similare. Dacă aplicația are nevoie de un modul CPAN, modulul trebuie făcut disponibil prin repo-ul local după audit. Este acceptabilă o versiune mai veche/stabilă din repo-ul local; nu urmărim neapărat ultima versiune upstream.
14

            
Bogdan Timofte authored 4 days ago
15
MVP-ul curent nu are dependențe CPAN instalate direct pe host. Pentru store-ul runtime folosește `DBI`/`DBD::SQLite` disponibile din distribuție sau repo-ul local auditat, plus SQLite.
Xdev Host Manager authored a week ago
16

            
17
## Rol
18

            
Bogdan Timofte authored a day ago
19
`var/host-manager.sqlite` este sursa de adevăr runtime pentru hosturi, aliasuri, vhosturi, taguri, Work Orders, workeri de date și certificate emise. `hosts.yaml` este produsul finit exportat din baza runtime și seed pentru baze noi. La prima pornire, aplicația seed-uiește tabelele din `config/hosts.yaml` și `config/work-orders.yaml` dacă baza nu are încă rânduri operaționale. Aplicația este complet în spatele autentificării OTP pentru orice date de registru, exporturi sau modificări.
Xdev Host Manager authored a week ago
20

            
Bogdan Timofte authored 4 days ago
21
Git rămâne mecanismul pentru cod, seed-uri, exporturi și istoric manual. Aplicația nu mai scrie registry-ul live direct în working tree, ca editările făcute în UI să nu se piardă la push/deploy de cod.
Xdev Host Manager authored a week ago
22

            
Bogdan Timofte authored 4 days ago
23
Schimbările cu impact operațional care elimină nume sau schimbă semantica serviciilor locale se fac prin Work Order (WO), nu prin ștergere directă din UI. WO-ul rămâne în store-ul runtime, exprimă intenția operațională și trebuie dus până la capăt înainte să modifice registrul.
Xdev Host Manager authored a week ago
24

            
Xdev Host Manager authored a week ago
25
Endpoint-uri publice:
Xdev Host Manager authored a week ago
26

            
Xdev Host Manager authored a week ago
27
- `/` — pagina de login/aplicație, fără date de host până la autentificare
28
- `/api/session` — status boolean al sesiunii
29
- `/api/login`
30
- `/api/logout`
Bogdan Timofte authored 3 days ago
31
- `POST /api/collect/dhcp-leases` — ingest DHCP lease push, protejat cu `HOST_MANAGER_DHCP_PUSH_TOKEN`
Xdev Host Manager authored a week ago
32

            
33
Healthcheck-ul `/healthz` este disponibil doar pe backend-ul local (`127.0.0.1:8088`). Vhost-ul nginx nu îl expune.
Xdev Host Manager authored a week ago
34

            
35
Endpoint-uri cu OTP:
36

            
Xdev Host Manager authored a week ago
37
- `/api/hosts`
Bogdan Timofte authored a day ago
38
- `/api/tags`
Xdev Host Manager authored a week ago
39
- `/api/work-orders`
Bogdan Timofte authored a day ago
40
- `/api/exports/hosts.yaml`
Xdev Host Manager authored a week ago
41
- `/api/ca/status`
42
- `/api/ca/certificates`
Xdev Host Manager authored a week ago
43
- `/download/hosts.yaml`
44
- `/download/monitoring.json`
Xdev Host Manager authored a week ago
45
- `/download/ca.crt`
Xdev Host Manager authored a week ago
46
- `POST /api/hosts/upsert`
47
- `POST /api/hosts/delete`
Bogdan Timofte authored a day ago
48
- `POST /api/tags/upsert`
49
- `POST /api/tags/rename`
50
- `POST /api/tags/delete`
51
- `POST /api/dns/publish`
Xdev Host Manager authored a week ago
52
- `POST /api/work-orders/checklist`
Xdev Host Manager authored a week ago
53
- `POST /api/work-orders/confirm`
Xdev Host Manager authored a week ago
54

            
55
## Pornire locală
56

            
57
```bash
58
HOST_MANAGER_TOTP_SECRET="BASE32_SECRET_AICI" \
59
perl scripts/host_manager.pl --bind 127.0.0.1 --port 8088
60
```
61

            
62
Deschide:
63

            
64
```text
65
http://127.0.0.1:8088/
66
```
67

            
68
Implicit serverul ascultă doar pe loopback. Pe jumper, publicarea se face prin nginx, ca vhost separat, cu proxy către `127.0.0.1:8088`.
69

            
70
Vhost-ul implicit propus este:
71

            
72
```text
73
hosts.madagascar.xdev.ro
74
```
75

            
76
Configurațiile de deployment sunt în `deploy/jumper/`.
77

            
Bogdan Timofte authored a week ago
78
Checkout-ul de dezvoltare este local:
79

            
80
```text
81
/Users/bogdan/Documents/Workspaces/Xdev/Madagascar/LocalAuthority
82
```
83

            
Bogdan Timofte authored a week ago
84
Repo-ul canonic în GitPrep este:
85

            
86
```text
87
git@192.168.2.102:repositories/bogdan/LocalAuthority.git
88
http://192.168.2.102:3000/bogdan/LocalAuthority
89
```
90

            
Bogdan Timofte authored a week ago
91
Instanța runtime de pe jumper este instalată în `/usr/local/xdev-host-manager` și publicată prin:
Xdev Host Manager authored a week ago
92

            
93
```text
Bogdan Timofte authored 5 days ago
94
https://hosts.madagascar.xdev.ro/
Xdev Host Manager authored a week ago
95
```
96

            
97
Secretul TOTP nu este în repo. Pentru bootstrap, citește URI-ul root-only de pe jumper:
98

            
99
```bash
Xdev Host Manager authored a week ago
100
ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri'
Xdev Host Manager authored a week ago
101
```
102

            
Bogdan Timofte authored a week ago
103
Codul aplicației se modifică local și se publică pe jumper cu:
104

            
105
```bash
106
scripts/deploy_to_jumper.sh
107
```
108

            
109
Scriptul de deploy nu copiază implicit `config/`, deoarece acesta conține date operaționale editabile de aplicația live. Folosește `--include-config` doar când vrei explicit să înlocuiești registrul runtime.
110

            
Xdev Host Manager authored a week ago
111
## OTP
112

            
Xdev Host Manager authored a week ago
113
`HOST_MANAGER_TOTP_SECRET` trebuie să fie un secret Base32 compatibil TOTP. Fără această variabilă, healthcheck-ul și pagina de login funcționează, dar login-ul, API-ul, download-urile și scrierile nu.
Xdev Host Manager authored a week ago
114

            
115
Secretul nu se comite în repo. Dacă avem nevoie de integrare cu un manager de secrete sau systemd environment file, se definește separat pe host.
116

            
117
## Flux
118

            
Bogdan Timofte authored 4 days ago
119
1. Hosturile se editează în aplicație; store-ul runtime este `var/host-manager.sqlite`.
Bogdan Timofte authored a day ago
120
2. Operatorii autentificați pot descărca `/download/hosts.yaml` sau `/download/monitoring.json`; UI-ul afișează și raw `hosts.yaml`.
121
3. Pentru DNS local, schimbările făcute în aplicație pun în coadă acțiunea de sincronizare a resolverelor.
122
4. Aplicația atinge `var/dns-publish.trigger`, iar pe jumper `host-manager-dns-publish.path` pornește:
Xdev Host Manager authored a week ago
123

            
124
```bash
125
./scripts/sync_local_hosts.sh --apply --verify
126
```
127

            
Xdev Host Manager authored a week ago
128
## Work Orders
129

            
Bogdan Timofte authored 4 days ago
130
Work Orders sunt păstrate în SQLite. `config/work-orders.yaml` rămâne seed/snapshot compatibil pentru instalări noi și export manual.
Xdev Host Manager authored a week ago
131

            
132
Un WO nu înseamnă că numele nu mai este în uz. Înseamnă doar că vrem să ajungem acolo. Pentru retragerea unui nume, checklist-ul trebuie să acopere pașii reali: ștergerea vhostului, înlocuirea certificatelor publice cu certificate locale, reîncărcarea serviciilor, testarea accesului și verificarea că nu mai există consumatori.
Xdev Host Manager authored a week ago
133

            
134
În MVP, acțiunea suportată este:
135

            
136
```text
137
remove_name(host_id, name)
138
```
139

            
140
Confirmarea unui WO:
141

            
142
- cere tastarea exactă a ID-ului WO în interfață
Xdev Host Manager authored a week ago
143
- este blocată dacă există pași de checklist nemarcați `done`
Bogdan Timofte authored 4 days ago
144
- elimină numele declarate din registry-ul SQLite
Xdev Host Manager authored a week ago
145
- marchează WO-ul ca `confirmed`
Bogdan Timofte authored a day ago
146
- pune în coadă sincronizarea resolverelor locale prin `host-manager-dns-publish.path`
Xdev Host Manager authored a week ago
147

            
Bogdan Timofte authored 2 days ago
148
După confirmare, operatorul poate verifica manual resolverele cu:
Xdev Host Manager authored a week ago
149

            
150
```bash
Bogdan Timofte authored 2 days ago
151
dig @192.168.2.100 nume.madagascar.xdev.ro +short
152
dig @192.168.2.2   nume.madagascar.xdev.ro +short
Xdev Host Manager authored a week ago
153
```
154

            
Xdev Host Manager authored a week ago
155
Primul WO curent este pentru retragerea numelor locale `pmx.*`/`pbs.*` create istoric pentru vhosturi nginx cu certificate Let's Encrypt. Odată cu CA-ul local, aceste nume nu mai trebuie să existe ca vhosturi separate pentru interfețele Proxmox/PBS, dar rămân publicate până când checklist-ul operațional este complet și WO-ul este confirmat.
Xdev Host Manager authored a week ago
156

            
Xdev Host Manager authored a week ago
157
## Convenții de nume
158

            
Bogdan Timofte authored 4 days ago
159
`madagascar.xdev.ro` este domeniul implicit al rețelei interne. Hosturile sunt identificate în baza de date prin FQDN complet, iar UI-ul păstrează temporar `id` ca identificator compatibil.
Xdev Host Manager authored a week ago
160

            
Bogdan Timofte authored 4 days ago
161
Modelul curent de adresare păstrează un singur IP canonic per host. UI-ul și API-ul expun acest câmp ca `ip`, iar store-ul runtime îl mapează în coloanele istorice SQLite doar pentru compatibilitate internă.
162

            
163
Modelul curent de naming separă explicit:
164

            
165
- `fqdn` — numele canonic al hostului
166
- `aliases` — nume suplimentare atașate hostului, care pot fi adăugate sau șterse
167
- `vhosts` — nume virtuale servite de host, care pot fi adăugate, șterse sau mutate pe alt host
168

            
169
Mutarea unui vhost înseamnă schimbarea `host_fqdn` în tabelul `vhosts`; legătura `certificate_id` de pe rândul vhostului rămâne atașată vhostului pe durata mutării.
170

            
Xdev Host Manager authored a week ago
171
Pentru orice nume `*.madagascar.xdev.ro`, aplicația derivă automat aliasul scurt prin eliminarea sufixului `.madagascar.xdev.ro`.
172

            
173
Exemple:
174

            
175
- `autonas01.madagascar.xdev.ro` produce automat aliasul `autonas01`
176
- `pmx.baobab.madagascar.xdev.ro` produce automat aliasul `pmx.baobab`
177

            
Bogdan Timofte authored a day ago
178
Aliasurile derivate nu se declară separat în `hosts.yaml` și nu sunt afișate ca zgomot separat în UI. Ele sunt păstrate în tabelul `host_aliases` și pot apărea în exporturile tehnice care au nevoie de nume efective.
179

            
180
## Taguri și observații
181

            
182
Tagurile sunt învățate din tagurile atașate hosturilor și sunt gestionate în catalogul de taguri: redenumire, culoare, icon și asocieri pe host. Tagurile sunt exportate în `hosts.yaml`.
183

            
184
`dhcp_leases` și `mdns_observations` sunt inputuri observate. Aplicația le afișează ca hinturi/autocomplete la adăugarea sau editarea de hosturi și vhosturi. Dacă există `nasturel.local` și operatorul tastează `nasturel` ca vhost/host, UI-ul poate propune IP-ul detectat sau atașarea la hostul existent cu acel IP; nu modifică registry-ul automat.
Xdev Host Manager authored a week ago
185

            
Xdev Host Manager authored a week ago
186
## Git și managementul cheilor
187

            
Bogdan Timofte authored 4 days ago
188
Varianta obligatorie pentru servicii automate este să consume exporturi generate și verificate, nu să depindă de HTTP neautentificat. Serviciile care sincronizează DNS, monitorizare sau inventare primesc chei dedicate, cu acces minim.
Xdev Host Manager authored a week ago
189

            
190
Reguli:
191

            
192
- Fiecare host/serviciu automat are propria cheie SSH, fără reutilizare între roluri.
193
- Cheile de consum sunt read-only pentru repo.
194
- Cheile care pot scrie în repo sunt rare, separate și folosite doar de componenta de management.
195
- Cheile nu se comit în repo și nu se pun în `hosts.yaml`.
196
- Pentru deployment pe hosturi, se preferă chei restrânse la comanda necesară sau deploy keys read-only unde platforma git permite.
197
- Pull-ul automat trebuie să valideze fișierele înainte de aplicare; de exemplu `perl -c scripts/host_manager.pl` și `./scripts/sync_local_hosts.sh --verify` după generarea DNS.
198

            
199
Modelul recomandat:
200

            
201
```text
202
jumper
Bogdan Timofte authored 4 days ago
203
  var/host-manager.sqlite  sursă runtime relațională pentru registry și Work Orders
Bogdan Timofte authored 4 days ago
204
  host-manager             editează SQLite cu OTP
Xdev Host Manager authored a week ago
205
  sync_local_hosts.sh      aplică DNS după review/verificare
206

            
207
servicii consumatoare
Bogdan Timofte authored a day ago
208
  export verificat         citesc hosts.yaml/monitoring.json
Xdev Host Manager authored a week ago
209
```
210

            
Bogdan Timofte authored 4 days ago
211
Pentru etapa MVP, aplicația nu face commit/push automat. După o modificare, schimbarea rămâne în SQLite și poate fi exportată explicit pentru review/arhivare. Automatizarea commit/push pentru exporturi poate fi adăugată ulterior, dar numai cu cheie separată și reguli clare de semnare/audit.
Xdev Host Manager authored a week ago
212

            
Xdev Host Manager authored a week ago
213
## Autoritate locală de certificate
214

            
Xdev Host Manager authored a week ago
215
Madagascar Local Authority include un helper OpenSSL pentru o autoritate locală de certificate pentru hosturi. Cheia privată CA nu este în git și nu este servită prin aplicație.
Xdev Host Manager authored a week ago
216

            
217
Locația implicită:
218

            
219
```text
220
/usr/local/xdev-host-manager/var/ca
221
```
222

            
223
Inițializare CA, pe jumper:
224

            
225
```bash
226
cd /usr/local/xdev-host-manager
227
sudo scripts/ca_manager.sh init
228
```
229

            
230
Semnare CSR pentru un host:
231

            
232
```bash
233
sudo scripts/ca_manager.sh sign-csr host-id /path/to/host.csr host.madagascar.xdev.ro host
234
```
235

            
236
Aplicația web, după OTP, poate afișa statusul CA, lista certificatelor emise și poate descărca certificatul public CA prin `/download/ca.crt`.
237

            
238
Reguli:
239

            
Xdev Host Manager authored a week ago
240
- Se semnează preferabil CSR-uri generate pe hosturi; cheia privată a hostului nu trebuie copiată în Madagascar Local Authority.
Xdev Host Manager authored a week ago
241
- CA private key rămâne local pe jumper și în afara git-ului.
242
- Endpoint-urile CA sunt în spatele OTP-ului.
243
- Automatizarea pentru emitere direct din UI se adaugă ulterior doar cu helper privilegiat și audit separat.
244

            
Xdev Host Manager authored a week ago
245
## Limitări MVP
246

            
247
- Parserul YAML acceptă schema strictă generată de aplicație, nu YAML arbitrar.
Bogdan Timofte authored 4 days ago
248
- Conflict engine-ul verifică doar consistența locală din registry-ul SQLite.
Bogdan Timofte authored a day ago
249
- DHCP și mDNS sunt inputuri observate pentru hinturi/autocomplete, nu surse de adevăr pentru registry.