|
Xdev Host Manager
authored
2 days ago
|
1
|
# Host Manager MVP
|
|
|
2
|
|
|
|
3
|
Host Manager este o aplicație web locală, Perl-only, pentru registrul de hosturi Madagascar. Nu folosește npm, pip sau pachete CPAN instalate direct pe host.
|
|
|
4
|
|
|
|
5
|
## Politica de dependențe
|
|
|
6
|
|
|
|
7
|
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.
|
|
|
8
|
|
|
|
9
|
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.
|
|
|
10
|
|
|
|
11
|
MVP-ul curent nu are dependențe CPAN externe.
|
|
|
12
|
|
|
|
13
|
## Rol
|
|
|
14
|
|
|
Xdev Host Manager
authored
2 days ago
|
15
|
`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
|
16
|
|
|
|
17
|
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ă.
|
|
|
18
|
|
|
Xdev Host Manager
authored
2 days ago
|
19
|
Endpoint-uri publice:
|
|
Xdev Host Manager
authored
2 days ago
|
20
|
|
|
Xdev Host Manager
authored
2 days ago
|
21
|
- `/` — pagina de login/aplicație, fără date de host până la autentificare
|
|
|
22
|
- `/api/session` — status boolean al sesiunii
|
|
|
23
|
- `/api/login`
|
|
|
24
|
- `/api/logout`
|
|
Xdev Host Manager
authored
2 days ago
|
25
|
|
|
|
26
|
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
|
27
|
|
|
|
28
|
Endpoint-uri cu OTP:
|
|
|
29
|
|
|
Xdev Host Manager
authored
2 days ago
|
30
|
- `/api/hosts`
|
|
Xdev Host Manager
authored
2 days ago
|
31
|
- `/api/ca/status`
|
|
|
32
|
- `/api/ca/certificates`
|
|
Xdev Host Manager
authored
2 days ago
|
33
|
- `/download/hosts.yaml`
|
|
|
34
|
- `/download/local-hosts.tsv`
|
|
|
35
|
- `/download/monitoring.json`
|
|
Xdev Host Manager
authored
2 days ago
|
36
|
- `/download/ca.crt`
|
|
Xdev Host Manager
authored
2 days ago
|
37
|
- `POST /api/hosts/upsert`
|
|
|
38
|
- `POST /api/hosts/delete`
|
|
|
39
|
- `POST /api/render/local-hosts-tsv`
|
|
|
40
|
|
|
|
41
|
## Pornire locală
|
|
|
42
|
|
|
|
43
|
```bash
|
|
|
44
|
HOST_MANAGER_TOTP_SECRET="BASE32_SECRET_AICI" \
|
|
|
45
|
perl scripts/host_manager.pl --bind 127.0.0.1 --port 8088
|
|
|
46
|
```
|
|
|
47
|
|
|
|
48
|
Deschide:
|
|
|
49
|
|
|
|
50
|
```text
|
|
|
51
|
http://127.0.0.1:8088/
|
|
|
52
|
```
|
|
|
53
|
|
|
|
54
|
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`.
|
|
|
55
|
|
|
|
56
|
Vhost-ul implicit propus este:
|
|
|
57
|
|
|
|
58
|
```text
|
|
|
59
|
hosts.madagascar.xdev.ro
|
|
|
60
|
```
|
|
|
61
|
|
|
|
62
|
Configurațiile de deployment sunt în `deploy/jumper/`.
|
|
|
63
|
|
|
|
64
|
Instanța de pe jumper este instalată în `/usr/local/xdev-host-manager` și publicată prin:
|
|
|
65
|
|
|
|
66
|
```text
|
|
|
67
|
http://hosts.madagascar.xdev.ro/
|
|
|
68
|
```
|
|
|
69
|
|
|
|
70
|
Secretul TOTP nu este în repo. Pentru bootstrap, citește URI-ul root-only de pe jumper:
|
|
|
71
|
|
|
|
72
|
```bash
|
|
Xdev Host Manager
authored
2 days ago
|
73
|
ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri'
|
|
Xdev Host Manager
authored
2 days ago
|
74
|
```
|
|
|
75
|
|
|
|
76
|
## OTP
|
|
|
77
|
|
|
Xdev Host Manager
authored
2 days ago
|
78
|
`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
|
79
|
|
|
|
80
|
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.
|
|
|
81
|
|
|
|
82
|
## Flux
|
|
|
83
|
|
|
|
84
|
1. Hosturile se editează în aplicație sau direct în `config/hosts.yaml`.
|
|
Xdev Host Manager
authored
2 days ago
|
85
|
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
|
86
|
3. Pentru DNS local, butonul `Write local-hosts.tsv` regenerează `config/local-hosts.tsv`.
|
|
Xdev Host Manager
authored
2 days ago
|
87
|
4. Sincronizarea efectivă către jumper și as01 rămâne:
|
|
Xdev Host Manager
authored
2 days ago
|
88
|
|
|
|
89
|
```bash
|
|
|
90
|
./scripts/sync_local_hosts.sh --apply --verify
|
|
|
91
|
```
|
|
|
92
|
|
|
Xdev Host Manager
authored
2 days ago
|
93
|
## Convenții de nume
|
|
|
94
|
|
|
|
95
|
`madagascar.xdev.ro` este domeniul implicit al rețelei interne. În `config/hosts.yaml` se declară doar numele canonice/FQDN-urile necesare.
|
|
|
96
|
|
|
|
97
|
Pentru orice nume `*.madagascar.xdev.ro`, aplicația derivă automat aliasul scurt prin eliminarea sufixului `.madagascar.xdev.ro`.
|
|
|
98
|
|
|
|
99
|
Exemple:
|
|
|
100
|
|
|
|
101
|
- `autonas01.madagascar.xdev.ro` produce automat aliasul `autonas01`
|
|
|
102
|
- `pmx.baobab.madagascar.xdev.ro` produce automat aliasul `pmx.baobab`
|
|
|
103
|
|
|
|
104
|
Aliasurile derivate nu se declară separat în `hosts.yaml`. Ele apar în API, monitoring export și `local-hosts.tsv` ca nume efective.
|
|
|
105
|
|
|
Xdev Host Manager
authored
2 days ago
|
106
|
## Git și managementul cheilor
|
|
|
107
|
|
|
Xdev Host Manager
authored
2 days ago
|
108
|
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
|
109
|
|
|
|
110
|
Reguli:
|
|
|
111
|
|
|
|
112
|
- Fiecare host/serviciu automat are propria cheie SSH, fără reutilizare între roluri.
|
|
|
113
|
- Cheile de consum sunt read-only pentru repo.
|
|
|
114
|
- Cheile care pot scrie în repo sunt rare, separate și folosite doar de componenta de management.
|
|
|
115
|
- Cheile nu se comit în repo și nu se pun în `hosts.yaml`.
|
|
|
116
|
- Pentru deployment pe hosturi, se preferă chei restrânse la comanda necesară sau deploy keys read-only unde platforma git permite.
|
|
|
117
|
- 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.
|
|
|
118
|
|
|
|
119
|
Modelul recomandat:
|
|
|
120
|
|
|
|
121
|
```text
|
|
|
122
|
git repo
|
|
|
123
|
config/hosts.yaml sursă versionată
|
|
|
124
|
config/local-hosts.tsv manifest generat/versionat pentru DNS local
|
|
|
125
|
|
|
|
126
|
jumper
|
|
|
127
|
host-manager editează working tree cu OTP
|
|
|
128
|
sync_local_hosts.sh aplică DNS după review/verificare
|
|
|
129
|
|
|
|
130
|
servicii consumatoare
|
|
Xdev Host Manager
authored
2 days ago
|
131
|
git pull read-only citesc hosts.yaml/local-hosts.tsv
|
|
Xdev Host Manager
authored
2 days ago
|
132
|
```
|
|
|
133
|
|
|
|
134
|
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.
|
|
|
135
|
|
|
Xdev Host Manager
authored
2 days ago
|
136
|
## Autoritate locală de certificate
|
|
|
137
|
|
|
|
138
|
Host Manager 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.
|
|
|
139
|
|
|
|
140
|
Locația implicită:
|
|
|
141
|
|
|
|
142
|
```text
|
|
|
143
|
/usr/local/xdev-host-manager/var/ca
|
|
|
144
|
```
|
|
|
145
|
|
|
|
146
|
Inițializare CA, pe jumper:
|
|
|
147
|
|
|
|
148
|
```bash
|
|
|
149
|
cd /usr/local/xdev-host-manager
|
|
|
150
|
sudo scripts/ca_manager.sh init
|
|
|
151
|
```
|
|
|
152
|
|
|
|
153
|
Semnare CSR pentru un host:
|
|
|
154
|
|
|
|
155
|
```bash
|
|
|
156
|
sudo scripts/ca_manager.sh sign-csr host-id /path/to/host.csr host.madagascar.xdev.ro host
|
|
|
157
|
```
|
|
|
158
|
|
|
|
159
|
Aplicația web, după OTP, poate afișa statusul CA, lista certificatelor emise și poate descărca certificatul public CA prin `/download/ca.crt`.
|
|
|
160
|
|
|
|
161
|
Reguli:
|
|
|
162
|
|
|
|
163
|
- Se semnează preferabil CSR-uri generate pe hosturi; cheia privată a hostului nu trebuie copiată în Host Manager.
|
|
|
164
|
- CA private key rămâne local pe jumper și în afara git-ului.
|
|
|
165
|
- Endpoint-urile CA sunt în spatele OTP-ului.
|
|
|
166
|
- Automatizarea pentru emitere direct din UI se adaugă ulterior doar cu helper privilegiat și audit separat.
|
|
|
167
|
|
|
Xdev Host Manager
authored
2 days ago
|
168
|
## Limitări MVP
|
|
|
169
|
|
|
|
170
|
- Parserul YAML acceptă schema strictă generată de aplicație, nu YAML arbitrar.
|
|
|
171
|
- Conflict engine-ul verifică doar consistența locală din `hosts.yaml`.
|
|
|
172
|
- DHCP, mDNS, `hosts-local.yaml` și `madagascar.json` sunt încă surse pentru audit manual sau pentru următorul collector.
|