|
Xdev Host Manager
authored
2 days ago
|
1
|
# Madagascar Local Authority MVP
|
|
Xdev Host Manager
authored
2 days ago
|
2
|
|
|
Xdev Host Manager
authored
2 days 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
2 days ago
|
6
|
|
|
Bogdan Timofte
authored
2 days ago
|
7
|
Pentru deciziile de evoluție și schimbările de scope, vezi `.doc/development-log.md`.
|
|
|
8
|
|
|
Xdev Host Manager
authored
2 days 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
|
|
|
|
15
|
MVP-ul curent nu are dependențe CPAN externe.
|
|
|
16
|
|
|
|
17
|
## Rol
|
|
|
18
|
|
|
Xdev Host Manager
authored
2 days ago
|
19
|
`config/hosts.yaml` este registrul editabil și trebuie menținut în git. Aplicația este complet în spatele autentificării OTP pentru orice date de registru, exporturi sau modificări.
|
|
Xdev Host Manager
authored
2 days ago
|
20
|
|
|
|
21
|
Git rămâne mecanismul de audit, istoric și rollback. Aplicația nu înlocuiește repo-ul și nu devine o bază de date separată.
|
|
|
22
|
|
|
Xdev Host Manager
authored
2 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 git, exprimă intenția operațională și trebuie dus până la capăt înainte să modifice registrul.
|
|
Xdev Host Manager
authored
2 days ago
|
24
|
|
|
Xdev Host Manager
authored
2 days ago
|
25
|
Endpoint-uri publice:
|
|
Xdev Host Manager
authored
2 days ago
|
26
|
|
|
Xdev Host Manager
authored
2 days 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
2 days 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
2 days ago
|
33
|
|
|
|
34
|
Endpoint-uri cu OTP:
|
|
|
35
|
|
|
Xdev Host Manager
authored
2 days ago
|
36
|
- `/api/hosts`
|
|
Xdev Host Manager
authored
2 days ago
|
37
|
- `/api/work-orders`
|
|
Xdev Host Manager
authored
2 days ago
|
38
|
- `/api/ca/status`
|
|
|
39
|
- `/api/ca/certificates`
|
|
Xdev Host Manager
authored
2 days ago
|
40
|
- `/download/hosts.yaml`
|
|
|
41
|
- `/download/local-hosts.tsv`
|
|
|
42
|
- `/download/monitoring.json`
|
|
Xdev Host Manager
authored
2 days ago
|
43
|
- `/download/ca.crt`
|
|
Xdev Host Manager
authored
2 days ago
|
44
|
- `POST /api/hosts/upsert`
|
|
|
45
|
- `POST /api/hosts/delete`
|
|
Xdev Host Manager
authored
2 days ago
|
46
|
- `POST /api/work-orders/checklist`
|
|
Xdev Host Manager
authored
2 days ago
|
47
|
- `POST /api/work-orders/confirm`
|
|
Xdev Host Manager
authored
2 days 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
2 days ago
|
73
|
Checkout-ul de dezvoltare este local:
|
|
|
74
|
|
|
|
75
|
```text
|
|
|
76
|
/Users/bogdan/Documents/Workspaces/Xdev/Madagascar/LocalAuthority
|
|
|
77
|
```
|
|
|
78
|
|
|
Bogdan Timofte
authored
2 days 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
2 days ago
|
86
|
Instanța runtime de pe jumper este instalată în `/usr/local/xdev-host-manager` și publicată prin:
|
|
Xdev Host Manager
authored
2 days ago
|
87
|
|
|
|
88
|
```text
|
|
|
89
|
http://hosts.madagascar.xdev.ro/
|
|
|
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
2 days ago
|
95
|
ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri'
|
|
Xdev Host Manager
authored
2 days ago
|
96
|
```
|
|
|
97
|
|
|
Bogdan Timofte
authored
2 days 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
2 days ago
|
106
|
## OTP
|
|
|
107
|
|
|
Xdev Host Manager
authored
2 days 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
2 days 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
|
|
|
|
114
|
1. Hosturile se editează în aplicație sau direct în `config/hosts.yaml`.
|
|
Xdev Host Manager
authored
2 days ago
|
115
|
2. Operatorii autentificați pot descărca `/download/hosts.yaml`, `/download/local-hosts.tsv` sau `/download/monitoring.json`.
|
|
Xdev Host Manager
authored
2 days ago
|
116
|
3. Pentru DNS local, butonul `Write local-hosts.tsv` regenerează `config/local-hosts.tsv`.
|
|
Xdev Host Manager
authored
2 days ago
|
117
|
4. Sincronizarea efectivă către jumper și as01 rămâne:
|
|
Xdev Host Manager
authored
2 days ago
|
118
|
|
|
|
119
|
```bash
|
|
|
120
|
./scripts/sync_local_hosts.sh --apply --verify
|
|
|
121
|
```
|
|
|
122
|
|
|
Xdev Host Manager
authored
2 days ago
|
123
|
## Work Orders
|
|
|
124
|
|
|
Xdev Host Manager
authored
2 days ago
|
125
|
`config/work-orders.yaml` păstrează operațiuni care trebuie executate și confirmate înainte să atingă registrul.
|
|
|
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
2 days 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
2 days ago
|
138
|
- este blocată dacă există pași de checklist nemarcați `done`
|
|
Xdev Host Manager
authored
2 days ago
|
139
|
- elimină numele declarate din `config/hosts.yaml`
|
|
|
140
|
- marchează WO-ul ca `confirmed`
|
|
|
141
|
- regenerează `config/local-hosts.tsv`
|
|
|
142
|
- nu rulează automat sync-ul către resolvere
|
|
|
143
|
|
|
|
144
|
După confirmare, operatorul verifică schimbarea în git și rulează explicit:
|
|
|
145
|
|
|
|
146
|
```bash
|
|
|
147
|
./scripts/sync_local_hosts.sh --apply --verify
|
|
|
148
|
```
|
|
|
149
|
|
|
Xdev Host Manager
authored
2 days 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
2 days ago
|
151
|
|
|
Xdev Host Manager
authored
2 days ago
|
152
|
## Convenții de nume
|
|
|
153
|
|
|
|
154
|
`madagascar.xdev.ro` este domeniul implicit al rețelei interne. În `config/hosts.yaml` se declară doar numele canonice/FQDN-urile necesare.
|
|
|
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
2 days ago
|
165
|
## Git și managementul cheilor
|
|
|
166
|
|
|
Xdev Host Manager
authored
2 days ago
|
167
|
Varianta obligatorie pentru servicii automate este să citească `config/hosts.yaml` din git, nu să depindă de HTTP neautentificat. Serviciile care sincronizează DNS, monitorizare sau inventare primesc chei dedicate, cu acces minim.
|
|
Xdev Host Manager
authored
2 days 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
|
git repo
|
|
|
182
|
config/hosts.yaml sursă versionată
|
|
|
183
|
config/local-hosts.tsv manifest generat/versionat pentru DNS local
|
|
Xdev Host Manager
authored
2 days ago
|
184
|
config/work-orders.yaml operațiuni confirmabile/versionate
|
|
Xdev Host Manager
authored
2 days ago
|
185
|
|
|
|
186
|
jumper
|
|
|
187
|
host-manager editează working tree cu OTP
|
|
|
188
|
sync_local_hosts.sh aplică DNS după review/verificare
|
|
|
189
|
|
|
|
190
|
servicii consumatoare
|
|
Xdev Host Manager
authored
2 days ago
|
191
|
git pull read-only citesc hosts.yaml/local-hosts.tsv
|
|
Xdev Host Manager
authored
2 days ago
|
192
|
```
|
|
|
193
|
|
|
|
194
|
Pentru etapa MVP, aplicația nu face commit/push automat. După o modificare, schimbarea rămâne vizibilă în working tree și se comite explicit după review. Automatizarea commit/push poate fi adăugată ulterior, dar numai cu cheie separată și reguli clare de semnare/audit.
|
|
|
195
|
|
|
Xdev Host Manager
authored
2 days ago
|
196
|
## Autoritate locală de certificate
|
|
|
197
|
|
|
Xdev Host Manager
authored
2 days ago
|
198
|
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
2 days ago
|
199
|
|
|
|
200
|
Locația implicită:
|
|
|
201
|
|
|
|
202
|
```text
|
|
|
203
|
/usr/local/xdev-host-manager/var/ca
|
|
|
204
|
```
|
|
|
205
|
|
|
|
206
|
Inițializare CA, pe jumper:
|
|
|
207
|
|
|
|
208
|
```bash
|
|
|
209
|
cd /usr/local/xdev-host-manager
|
|
|
210
|
sudo scripts/ca_manager.sh init
|
|
|
211
|
```
|
|
|
212
|
|
|
|
213
|
Semnare CSR pentru un host:
|
|
|
214
|
|
|
|
215
|
```bash
|
|
|
216
|
sudo scripts/ca_manager.sh sign-csr host-id /path/to/host.csr host.madagascar.xdev.ro host
|
|
|
217
|
```
|
|
|
218
|
|
|
|
219
|
Aplicația web, după OTP, poate afișa statusul CA, lista certificatelor emise și poate descărca certificatul public CA prin `/download/ca.crt`.
|
|
|
220
|
|
|
|
221
|
Reguli:
|
|
|
222
|
|
|
Xdev Host Manager
authored
2 days ago
|
223
|
- Se semnează preferabil CSR-uri generate pe hosturi; cheia privată a hostului nu trebuie copiată în Madagascar Local Authority.
|
|
Xdev Host Manager
authored
2 days ago
|
224
|
- CA private key rămâne local pe jumper și în afara git-ului.
|
|
|
225
|
- Endpoint-urile CA sunt în spatele OTP-ului.
|
|
|
226
|
- Automatizarea pentru emitere direct din UI se adaugă ulterior doar cu helper privilegiat și audit separat.
|
|
|
227
|
|
|
Xdev Host Manager
authored
2 days ago
|
228
|
## Limitări MVP
|
|
|
229
|
|
|
|
230
|
- Parserul YAML acceptă schema strictă generată de aplicație, nu YAML arbitrar.
|
|
|
231
|
- Conflict engine-ul verifică doar consistența locală din `hosts.yaml`.
|
|
|
232
|
- DHCP, mDNS, `hosts-local.yaml` și `madagascar.json` sunt încă surse pentru audit manual sau pentru următorul collector.
|