|
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
a week ago
|
7
|
Pentru deciziile de evoluție și schimbările de scope, vezi `.doc/development-log.md`.
|
|
|
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
4 days ago
|
19
|
`var/host-manager.sqlite` este sursa de adevăr runtime pentru registry și Work Orders. La prima pornire, aplicația seed-uiește baza din `config/hosts.yaml` și `config/work-orders.yaml` dacă documentele lipsesc din SQLite. 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`
|
|
Xdev Host Manager
authored
a week ago
|
31
|
|
|
|
32
|
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
|
33
|
|
|
|
34
|
Endpoint-uri cu OTP:
|
|
|
35
|
|
|
Xdev Host Manager
authored
a week ago
|
36
|
- `/api/hosts`
|
|
Xdev Host Manager
authored
a week ago
|
37
|
- `/api/work-orders`
|
|
Xdev Host Manager
authored
a week ago
|
38
|
- `/api/ca/status`
|
|
|
39
|
- `/api/ca/certificates`
|
|
Xdev Host Manager
authored
a week ago
|
40
|
- `/download/hosts.yaml`
|
|
|
41
|
- `/download/local-hosts.tsv`
|
|
|
42
|
- `/download/monitoring.json`
|
|
Xdev Host Manager
authored
a week ago
|
43
|
- `/download/ca.crt`
|
|
Xdev Host Manager
authored
a week ago
|
44
|
- `POST /api/hosts/upsert`
|
|
|
45
|
- `POST /api/hosts/delete`
|
|
Xdev Host Manager
authored
a week ago
|
46
|
- `POST /api/work-orders/checklist`
|
|
Xdev Host Manager
authored
a week ago
|
47
|
- `POST /api/work-orders/confirm`
|
|
Xdev Host Manager
authored
a week ago
|
48
|
- `POST /api/render/local-hosts-tsv`
|
|
|
49
|
|
|
|
50
|
## Pornire locală
|
|
|
51
|
|
|
|
52
|
```bash
|
|
|
53
|
HOST_MANAGER_TOTP_SECRET="BASE32_SECRET_AICI" \
|
|
|
54
|
perl scripts/host_manager.pl --bind 127.0.0.1 --port 8088
|
|
|
55
|
```
|
|
|
56
|
|
|
|
57
|
Deschide:
|
|
|
58
|
|
|
|
59
|
```text
|
|
|
60
|
http://127.0.0.1:8088/
|
|
|
61
|
```
|
|
|
62
|
|
|
|
63
|
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`.
|
|
|
64
|
|
|
|
65
|
Vhost-ul implicit propus este:
|
|
|
66
|
|
|
|
67
|
```text
|
|
|
68
|
hosts.madagascar.xdev.ro
|
|
|
69
|
```
|
|
|
70
|
|
|
|
71
|
Configurațiile de deployment sunt în `deploy/jumper/`.
|
|
|
72
|
|
|
Bogdan Timofte
authored
a week ago
|
73
|
Checkout-ul de dezvoltare este local:
|
|
|
74
|
|
|
|
75
|
```text
|
|
|
76
|
/Users/bogdan/Documents/Workspaces/Xdev/Madagascar/LocalAuthority
|
|
|
77
|
```
|
|
|
78
|
|
|
Bogdan Timofte
authored
a week ago
|
79
|
Repo-ul canonic în GitPrep este:
|
|
|
80
|
|
|
|
81
|
```text
|
|
|
82
|
git@192.168.2.102:repositories/bogdan/LocalAuthority.git
|
|
|
83
|
http://192.168.2.102:3000/bogdan/LocalAuthority
|
|
|
84
|
```
|
|
|
85
|
|
|
Bogdan Timofte
authored
a week ago
|
86
|
Instanța runtime de pe jumper este instalată în `/usr/local/xdev-host-manager` și publicată prin:
|
|
Xdev Host Manager
authored
a week ago
|
87
|
|
|
|
88
|
```text
|
|
Bogdan Timofte
authored
5 days ago
|
89
|
https://hosts.madagascar.xdev.ro/
|
|
Xdev Host Manager
authored
a week ago
|
90
|
```
|
|
|
91
|
|
|
|
92
|
Secretul TOTP nu este în repo. Pentru bootstrap, citește URI-ul root-only de pe jumper:
|
|
|
93
|
|
|
|
94
|
```bash
|
|
Xdev Host Manager
authored
a week ago
|
95
|
ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri'
|
|
Xdev Host Manager
authored
a week ago
|
96
|
```
|
|
|
97
|
|
|
Bogdan Timofte
authored
a week ago
|
98
|
Codul aplicației se modifică local și se publică pe jumper cu:
|
|
|
99
|
|
|
|
100
|
```bash
|
|
|
101
|
scripts/deploy_to_jumper.sh
|
|
|
102
|
```
|
|
|
103
|
|
|
|
104
|
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.
|
|
|
105
|
|
|
Xdev Host Manager
authored
a week ago
|
106
|
## OTP
|
|
|
107
|
|
|
Xdev Host Manager
authored
a week ago
|
108
|
`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
|
109
|
|
|
|
110
|
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.
|
|
|
111
|
|
|
|
112
|
## Flux
|
|
|
113
|
|
|
Bogdan Timofte
authored
4 days ago
|
114
|
1. Hosturile se editează în aplicație; store-ul runtime este `var/host-manager.sqlite`.
|
|
Xdev Host Manager
authored
a week ago
|
115
|
2. Operatorii autentificați pot descărca `/download/hosts.yaml`, `/download/local-hosts.tsv` sau `/download/monitoring.json`.
|
|
Bogdan Timofte
authored
4 days ago
|
116
|
3. Pentru DNS local, butonul `Write local-hosts.tsv` regenerează `config/local-hosts.tsv` din SQLite.
|
|
Xdev Host Manager
authored
a week ago
|
117
|
4. Sincronizarea efectivă către jumper și as01 rămâne:
|
|
Xdev Host Manager
authored
a week ago
|
118
|
|
|
|
119
|
```bash
|
|
|
120
|
./scripts/sync_local_hosts.sh --apply --verify
|
|
|
121
|
```
|
|
|
122
|
|
|
Xdev Host Manager
authored
a week ago
|
123
|
## Work Orders
|
|
|
124
|
|
|
Bogdan Timofte
authored
4 days ago
|
125
|
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
|
126
|
|
|
|
127
|
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
|
128
|
|
|
|
129
|
În MVP, acțiunea suportată este:
|
|
|
130
|
|
|
|
131
|
```text
|
|
|
132
|
remove_name(host_id, name)
|
|
|
133
|
```
|
|
|
134
|
|
|
|
135
|
Confirmarea unui WO:
|
|
|
136
|
|
|
|
137
|
- cere tastarea exactă a ID-ului WO în interfață
|
|
Xdev Host Manager
authored
a week ago
|
138
|
- este blocată dacă există pași de checklist nemarcați `done`
|
|
Bogdan Timofte
authored
4 days ago
|
139
|
- elimină numele declarate din registry-ul SQLite
|
|
Xdev Host Manager
authored
a week ago
|
140
|
- marchează WO-ul ca `confirmed`
|
|
|
141
|
- regenerează `config/local-hosts.tsv`
|
|
|
142
|
- nu rulează automat sync-ul către resolvere
|
|
|
143
|
|
|
Bogdan Timofte
authored
4 days ago
|
144
|
După confirmare, operatorul verifică exportul și rulează explicit:
|
|
Xdev Host Manager
authored
a week ago
|
145
|
|
|
|
146
|
```bash
|
|
|
147
|
./scripts/sync_local_hosts.sh --apply --verify
|
|
|
148
|
```
|
|
|
149
|
|
|
Xdev Host Manager
authored
a week ago
|
150
|
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
|
151
|
|
|
Xdev Host Manager
authored
a week ago
|
152
|
## Convenții de nume
|
|
|
153
|
|
|
Bogdan Timofte
authored
4 days ago
|
154
|
`madagascar.xdev.ro` este domeniul implicit al rețelei interne. În registry se declară doar numele canonice/FQDN-urile necesare.
|
|
Xdev Host Manager
authored
a week ago
|
155
|
|
|
|
156
|
Pentru orice nume `*.madagascar.xdev.ro`, aplicația derivă automat aliasul scurt prin eliminarea sufixului `.madagascar.xdev.ro`.
|
|
|
157
|
|
|
|
158
|
Exemple:
|
|
|
159
|
|
|
|
160
|
- `autonas01.madagascar.xdev.ro` produce automat aliasul `autonas01`
|
|
|
161
|
- `pmx.baobab.madagascar.xdev.ro` produce automat aliasul `pmx.baobab`
|
|
|
162
|
|
|
|
163
|
Aliasurile derivate nu se declară separat în `hosts.yaml`. Ele apar în API, monitoring export și `local-hosts.tsv` ca nume efective.
|
|
|
164
|
|
|
Xdev Host Manager
authored
a week ago
|
165
|
## Git și managementul cheilor
|
|
|
166
|
|
|
Bogdan Timofte
authored
4 days ago
|
167
|
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
|
168
|
|
|
|
169
|
Reguli:
|
|
|
170
|
|
|
|
171
|
- Fiecare host/serviciu automat are propria cheie SSH, fără reutilizare între roluri.
|
|
|
172
|
- Cheile de consum sunt read-only pentru repo.
|
|
|
173
|
- Cheile care pot scrie în repo sunt rare, separate și folosite doar de componenta de management.
|
|
|
174
|
- Cheile nu se comit în repo și nu se pun în `hosts.yaml`.
|
|
|
175
|
- Pentru deployment pe hosturi, se preferă chei restrânse la comanda necesară sau deploy keys read-only unde platforma git permite.
|
|
|
176
|
- 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.
|
|
|
177
|
|
|
|
178
|
Modelul recomandat:
|
|
|
179
|
|
|
|
180
|
```text
|
|
|
181
|
jumper
|
|
Bogdan Timofte
authored
4 days ago
|
182
|
var/host-manager.sqlite sursă runtime pentru registry și Work Orders
|
|
|
183
|
host-manager editează SQLite cu OTP
|
|
Xdev Host Manager
authored
a week ago
|
184
|
sync_local_hosts.sh aplică DNS după review/verificare
|
|
|
185
|
|
|
|
186
|
servicii consumatoare
|
|
Bogdan Timofte
authored
4 days ago
|
187
|
export verificat citesc hosts.yaml/local-hosts.tsv/monitoring.json
|
|
Xdev Host Manager
authored
a week ago
|
188
|
```
|
|
|
189
|
|
|
Bogdan Timofte
authored
4 days ago
|
190
|
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
|
191
|
|
|
Xdev Host Manager
authored
a week ago
|
192
|
## Autoritate locală de certificate
|
|
|
193
|
|
|
Xdev Host Manager
authored
a week ago
|
194
|
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
|
195
|
|
|
|
196
|
Locația implicită:
|
|
|
197
|
|
|
|
198
|
```text
|
|
|
199
|
/usr/local/xdev-host-manager/var/ca
|
|
|
200
|
```
|
|
|
201
|
|
|
|
202
|
Inițializare CA, pe jumper:
|
|
|
203
|
|
|
|
204
|
```bash
|
|
|
205
|
cd /usr/local/xdev-host-manager
|
|
|
206
|
sudo scripts/ca_manager.sh init
|
|
|
207
|
```
|
|
|
208
|
|
|
|
209
|
Semnare CSR pentru un host:
|
|
|
210
|
|
|
|
211
|
```bash
|
|
|
212
|
sudo scripts/ca_manager.sh sign-csr host-id /path/to/host.csr host.madagascar.xdev.ro host
|
|
|
213
|
```
|
|
|
214
|
|
|
|
215
|
Aplicația web, după OTP, poate afișa statusul CA, lista certificatelor emise și poate descărca certificatul public CA prin `/download/ca.crt`.
|
|
|
216
|
|
|
|
217
|
Reguli:
|
|
|
218
|
|
|
Xdev Host Manager
authored
a week ago
|
219
|
- 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
|
220
|
- CA private key rămâne local pe jumper și în afara git-ului.
|
|
|
221
|
- Endpoint-urile CA sunt în spatele OTP-ului.
|
|
|
222
|
- Automatizarea pentru emitere direct din UI se adaugă ulterior doar cu helper privilegiat și audit separat.
|
|
|
223
|
|
|
Xdev Host Manager
authored
a week ago
|
224
|
## Limitări MVP
|
|
|
225
|
|
|
|
226
|
- Parserul YAML acceptă schema strictă generată de aplicație, nu YAML arbitrar.
|
|
Bogdan Timofte
authored
4 days ago
|
227
|
- Conflict engine-ul verifică doar consistența locală din registry-ul SQLite.
|
|
Xdev Host Manager
authored
a week ago
|
228
|
- DHCP, mDNS, `hosts-local.yaml` și `madagascar.json` sunt încă surse pentru audit manual sau pentru următorul collector.
|