raijin-server 0.2.40__py3-none-any.whl → 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of raijin-server might be problematic. Click here for more details.
- raijin_server/__init__.py +1 -1
- raijin_server/cli.py +6 -0
- raijin_server/modules/__init__.py +3 -1
- raijin_server/modules/grafana.py +365 -16
- raijin_server/modules/internal_dns.py +446 -0
- raijin_server/modules/kong.py +8 -4
- raijin_server/modules/minio.py +24 -53
- raijin_server/modules/observability_ingress.py +29 -1
- raijin_server/modules/prometheus.py +266 -3
- raijin_server/modules/traefik.py +35 -1
- raijin_server/modules/vpn_client.py +438 -0
- raijin_server-0.3.0.dist-info/METADATA +361 -0
- {raijin_server-0.2.40.dist-info → raijin_server-0.3.0.dist-info}/RECORD +17 -15
- raijin_server-0.2.40.dist-info/METADATA +0 -564
- {raijin_server-0.2.40.dist-info → raijin_server-0.3.0.dist-info}/WHEEL +0 -0
- {raijin_server-0.2.40.dist-info → raijin_server-0.3.0.dist-info}/entry_points.txt +0 -0
- {raijin_server-0.2.40.dist-info → raijin_server-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {raijin_server-0.2.40.dist-info → raijin_server-0.3.0.dist-info}/top_level.txt +0 -0
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: raijin-server
|
|
3
|
-
Version: 0.2.40
|
|
4
|
-
Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
|
|
5
|
-
Home-page: https://example.com/raijin-server
|
|
6
|
-
Author: Equipe Raijin
|
|
7
|
-
License: MIT
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
-
Classifier: Intended Audience :: System Administrators
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Requires-Python: >=3.9
|
|
15
|
-
Description-Content-Type: text/markdown
|
|
16
|
-
License-File: LICENSE
|
|
17
|
-
Requires-Dist: typer>=0.12
|
|
18
|
-
Requires-Dist: rich>=13.7
|
|
19
|
-
Provides-Extra: yaml
|
|
20
|
-
Requires-Dist: pyyaml>=6.0; extra == "yaml"
|
|
21
|
-
Provides-Extra: dev
|
|
22
|
-
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
23
|
-
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
24
|
-
Requires-Dist: black>=23.0; extra == "dev"
|
|
25
|
-
Requires-Dist: ruff>=0.1; extra == "dev"
|
|
26
|
-
Provides-Extra: all
|
|
27
|
-
Requires-Dist: pyyaml>=6.0; extra == "all"
|
|
28
|
-
Requires-Dist: pytest>=7.0; extra == "all"
|
|
29
|
-
Requires-Dist: pytest-cov>=4.0; extra == "all"
|
|
30
|
-
Requires-Dist: black>=23.0; extra == "all"
|
|
31
|
-
Requires-Dist: ruff>=0.1; extra == "all"
|
|
32
|
-
Dynamic: license-file
|
|
33
|
-
|
|
34
|
-
# raijin-server
|
|
35
|
-
|
|
36
|
-
CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Server em ambientes produtivos. Orquestra rede, firewall, Kubernetes, observabilidade e backups para acelerar a subida de clusters e workloads.
|
|
37
|
-
|
|
38
|
-
**✨ Versão Auditada e Resiliente para Produção**
|
|
39
|
-
|
|
40
|
-
## Links úteis
|
|
41
|
-
|
|
42
|
-
- Repositório: https://github.com/rafaelluisdacostacoelho/raijin-server
|
|
43
|
-
- Documentação completa: [docs/INFRASTRUCTURE_GUIDE.md](docs/INFRASTRUCTURE_GUIDE.md)
|
|
44
|
-
- Arquitetura: [ARCHITECTURE.md](ARCHITECTURE.md)
|
|
45
|
-
- Auditoria: [AUDIT.md](AUDIT.md)
|
|
46
|
-
- Segurança: [SECURITY.md](SECURITY.md)
|
|
47
|
-
- Acesso SSH (Windows): [docs/SSH_WINDOWS.md](docs/SSH_WINDOWS.md)
|
|
48
|
-
- VPN para acesso remoto (WireGuard): [docs/VPN_REMOTE_ACCESS.md](docs/VPN_REMOTE_ACCESS.md)
|
|
49
|
-
- MinIO (monitorar/testar): [docs/MINIO_OPERATIONS.md](docs/MINIO_OPERATIONS.md)
|
|
50
|
-
|
|
51
|
-
## Destaques
|
|
52
|
-
|
|
53
|
-
- ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade, ambiente Python (venv)
|
|
54
|
-
- ✅ **Health Checks Automáticos**: Valida serviços após instalação
|
|
55
|
-
- ✅ **Retry Inteligente com Backoff**: Resistente a falhas temporárias de rede (5 tentativas, backoff exponencial)
|
|
56
|
-
- ✅ **Logging Estruturado**: Logs persistentes com rotação (20MB, 5 backups)
|
|
57
|
-
- ✅ **Gestão de Dependências**: Garante ordem correta de execução
|
|
58
|
-
- ✅ **Verificação de Cluster**: Módulos que dependem de K8s verificam disponibilidade antes de executar
|
|
59
|
-
- ✅ **Clean Automático**: Opção de limpar instalação anterior ao re-executar kubernetes
|
|
60
|
-
- ✅ **IPv4 Only**: IPv6 desabilitado por padrão para simplificar rede
|
|
61
|
-
- ✅ **Configuração via Arquivo**: Automação completa com YAML/JSON
|
|
62
|
-
- ✅ **Idempotência**: Re-execução segura sem quebrar o sistema
|
|
63
|
-
- ✅ **Modo Dry-run**: Simula execução sem aplicar mudanças
|
|
64
|
-
|
|
65
|
-
## Requisitos
|
|
66
|
-
Ubuntu Server 20.04+ com Python 3 disponível. Se precisar instalar/atualizar no host alvo:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
sudo apt update
|
|
70
|
-
sudo apt install -y python3 python3-venv python3-pip
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Instalação (sempre em venv midgard)
|
|
74
|
-
|
|
75
|
-
Use apenas o venv `~/.venvs/midgard` para padronizar ambiente e logs.
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# 1) Criar/reativar venv midgard
|
|
79
|
-
python3 -m venv ~/.venvs/midgard
|
|
80
|
-
source ~/.venvs/midgard/bin/activate
|
|
81
|
-
pip install -U pip setuptools
|
|
82
|
-
|
|
83
|
-
# 2) Instalar a partir do PyPI (ou source)
|
|
84
|
-
pip install -U raijin-server==x.x.x
|
|
85
|
-
|
|
86
|
-
# 3) Uso com sudo preservando o venv
|
|
87
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server --version
|
|
88
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server validate
|
|
89
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install
|
|
90
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server menu
|
|
91
|
-
|
|
92
|
-
# 4) Quando terminar
|
|
93
|
-
deactivate
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
> **Após instalar:**
|
|
97
|
-
>
|
|
98
|
-
> Execute:
|
|
99
|
-
>
|
|
100
|
-
> ```bash
|
|
101
|
-
> pip install -U raijin-server==x.x.x
|
|
102
|
-
> sudo -E ~/.venvs/midgard/bin/raijin-server menu
|
|
103
|
-
> ```
|
|
104
|
-
>
|
|
105
|
-
> Isso garante que o menu principal do Raijin Server estará disponível no Ubuntu Server.
|
|
106
|
-
|
|
107
|
-
> Dica: se precisar reinstalar, remova o venv (`rm -rf ~/.venvs/midgard`), recrie e repita o passo 2. O `-E` no sudo mantém o venv ativo para o Python.
|
|
108
|
-
|
|
109
|
-
# 5. Rodar usando root preservando o venv
|
|
110
|
-
sudo -E ~/.venvs/raijin/bin/raijin-server --version
|
|
111
|
-
sudo -E ~/.venvs/raijin/bin/raijin-server validate
|
|
112
|
-
sudo -E ~/.venvs/raijin/bin/raijin-server full-install
|
|
113
|
-
|
|
114
|
-
# 6. Para sair do venv quando terminar
|
|
115
|
-
deactivate
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
> **Nota**: O `-E` no sudo preserva as variáveis de ambiente, garantindo que o Python use o venv correto mesmo como root.
|
|
119
|
-
|
|
120
|
-
## Uso rapido
|
|
121
|
-
|
|
122
|
-
### Validar Sistema
|
|
123
|
-
```bash
|
|
124
|
-
# Verifica se o sistema atende pré-requisitos
|
|
125
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server validate
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Menu Interativo
|
|
129
|
-
```bash
|
|
130
|
-
# Menu visual com atalho para módulos
|
|
131
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server menu
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Rollback de módulos
|
|
135
|
-
- No menu, após escolher o módulo, selecione `r` para rollback; se houver dependentes já executados, será pedido confirmacao para rollback em cascata dos dependentes antes.
|
|
136
|
-
- Linha de comando: `sudo -E ~/.venvs/midgard/bin/raijin-server rollback <modulo> --cascade/--no-cascade` (best-effort; alguns módulos podem exigir limpeza manual). Caso seja apenas para revisar o efeito, use `-n/--dry-run` no comando principal para não aplicar.
|
|
137
|
-
|
|
138
|
-
### Execução Direta de Módulos
|
|
139
|
-
```bash
|
|
140
|
-
# Executar módulo específico
|
|
141
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server kubernetes
|
|
142
|
-
|
|
143
|
-
# Dry-run (simula sem aplicar)
|
|
144
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server --dry-run kubernetes
|
|
145
|
-
|
|
146
|
-
# Pular validações (não recomendado)
|
|
147
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server --skip-validation kubernetes
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Instalação Completa com seleção de passos
|
|
151
|
-
```bash
|
|
152
|
-
# Rodar tudo (padrão)
|
|
153
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install
|
|
154
|
-
|
|
155
|
-
# Escolher passos antes de rodar
|
|
156
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --select-steps
|
|
157
|
-
|
|
158
|
-
# Definir lista fixa (ordem original preservada)
|
|
159
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --steps "kubernetes,calico,cert_manager,traefik"
|
|
160
|
-
|
|
161
|
-
# Pedir confirmação a cada módulo
|
|
162
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --confirm-each
|
|
163
|
-
|
|
164
|
-
# Modo debug: snapshots + diagnose pós-módulo
|
|
165
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --debug-mode
|
|
166
|
-
|
|
167
|
-
# Apenas snapshots após cada módulo (pós-kubernetes)
|
|
168
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --snapshots
|
|
169
|
-
|
|
170
|
-
# Apenas diagnose pós-módulo (ex.: cert-manager)
|
|
171
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install --post-diagnose
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### Depuração e Logs (pós-Kubernetes)
|
|
175
|
-
```bash
|
|
176
|
-
# Ver todos os logs do CLI com pager (less)
|
|
177
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug logs --lines 400
|
|
178
|
-
|
|
179
|
-
# Seguir logs em tempo real
|
|
180
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug logs --follow
|
|
181
|
-
|
|
182
|
-
# Snapshot do cluster: nodes, pods e eventos (últimos 200)
|
|
183
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug kube --events 200
|
|
184
|
-
|
|
185
|
-
# Focar em um namespace (ex.: cert-manager)
|
|
186
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug kube --namespace cert-manager --events 150
|
|
187
|
-
|
|
188
|
-
# Consultar logs do kubelet via journalctl
|
|
189
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug journal --service kubelet --lines 300
|
|
190
|
-
|
|
191
|
-
# Consultar outro serviço systemd (ex.: containerd)
|
|
192
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug journal --service containerd --lines 200
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### Automação via Arquivo de Configuração
|
|
196
|
-
## Documentação Adicional
|
|
197
|
-
|
|
198
|
-
- **[AUDIT.md](AUDIT.md)**: Relatório completo de auditoria e melhorias implementadas
|
|
199
|
-
- **[ARCHITECTURE.md](ARCHITECTURE.md)**: Arquitetura técnica do ambiente
|
|
200
|
-
- **[SECURITY.md](SECURITY.md)**: Políticas de segurança e reporte de vulnerabilidades
|
|
201
|
-
- **Publicação PyPI**: ver seção "Publicar no PyPI" abaixo
|
|
202
|
-
- **CNI automático**: Calico aplicado automaticamente no passo Kubernetes (override com `RAIJIN_CNI=none`)
|
|
203
|
-
- Para reaplicar CNI (forçar mesmo se já houver): `RAIJIN_FORCE_CNI=1`
|
|
204
|
-
- **LoadBalancer bare metal**: módulo `metallb` aplica pool L2 para Services `LoadBalancer`
|
|
205
|
-
|
|
206
|
-
## Fluxo de Execução Recomendado
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
# 1. Validar sistema
|
|
210
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server validate
|
|
211
|
-
|
|
212
|
-
# 2. Base do sistema
|
|
213
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server essentials
|
|
214
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server hardening
|
|
215
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server network # OPCIONAL: pule se IP já configurado via provedor ISP
|
|
216
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server firewall
|
|
217
|
-
|
|
218
|
-
# 3. Kubernetes
|
|
219
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server kubernetes
|
|
220
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server calico
|
|
221
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server metallb # se ambiente bare metal e quiser Service LoadBalancer
|
|
222
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server secrets
|
|
223
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server cert-manager
|
|
224
|
-
|
|
225
|
-
# 4. Ingress (escolha um)
|
|
226
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server traefik
|
|
227
|
-
# OU
|
|
228
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server kong
|
|
229
|
-
|
|
230
|
-
# 5. Observabilidade
|
|
231
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server prometheus
|
|
232
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server grafana
|
|
233
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server observability-ingress
|
|
234
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server observability-dashboards
|
|
235
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server loki
|
|
236
|
-
|
|
237
|
-
# 6. Storage e Mensageria (opcional)
|
|
238
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server minio
|
|
239
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server kafka
|
|
240
|
-
|
|
241
|
-
# 7. Backup
|
|
242
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server velero
|
|
243
|
-
|
|
244
|
-
# 8. Service Mesh (opcional)
|
|
245
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server istio
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### IP Estático (pular se já configurado)
|
|
249
|
-
|
|
250
|
-
O módulo `network` é **opcional** quando:
|
|
251
|
-
- O IP fixo foi configurado pelo provedor ISP (ex: Ibi Internet Empresarial)
|
|
252
|
-
- O IP estático foi definido durante a instalação do Ubuntu Server
|
|
253
|
-
- A rede já está funcionando corretamente
|
|
254
|
-
|
|
255
|
-
Para pular automaticamente em automações:
|
|
256
|
-
```bash
|
|
257
|
-
export RAIJIN_SKIP_NETWORK=1
|
|
258
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server full-install
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
O módulo detecta automaticamente se já existe um Netplan com IP estático e pergunta
|
|
262
|
-
se deseja pular. Se executar manualmente, basta responder "não" quando perguntado.
|
|
263
|
-
|
|
264
|
-
### Notas de kernel / Secure Boot
|
|
265
|
-
- WireGuard depende de módulo de kernel. Com Secure Boot ativo, o módulo DKMS pode precisar ser assinado; se `modprobe wireguard` falhar, assine ou desabilite Secure Boot temporariamente.
|
|
266
|
-
- Certifique-se de ter headers do kernel instalados (`/lib/modules/$(uname -r)/build`) antes de instalar WireGuard.
|
|
267
|
-
- Para Kubernetes/Calico é necessário `br_netfilter` e sysctl `bridge-nf-call-iptables=1`. O módulo `bootstrap` já aplica, mas verifique se seu kernel suporta.
|
|
268
|
-
|
|
269
|
-
### Comandos Úteis
|
|
270
|
-
```bash
|
|
271
|
-
# Versão (flag ou comando)
|
|
272
|
-
~/.venvs/midgard/bin/raijin-server --version
|
|
273
|
-
~/.venvs/midgard/bin/raijin-server -V
|
|
274
|
-
~/.venvs/midgard/bin/raijin-server version
|
|
275
|
-
|
|
276
|
-
# Monitorar logs
|
|
277
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server debug logs --follow
|
|
278
|
-
|
|
279
|
-
# Rotacao de logs (default: 20MB, 5 backups)
|
|
280
|
-
# Ajuste via env:
|
|
281
|
-
# export RAIJIN_LOG_MAX_BYTES=$((50*1024*1024))
|
|
282
|
-
# export RAIJIN_LOG_BACKUP_COUNT=5
|
|
283
|
-
|
|
284
|
-
# Métrica de tamanho de logs (Prometheus/Grafana) usando node_exporter textfile collector
|
|
285
|
-
# 1) Habilite textfile collector (ex.: /var/lib/node_exporter/textfile_collector)
|
|
286
|
-
# 2) Agende o script:
|
|
287
|
-
# sudo /bin/bash -c 'RAIJIN_METRIC_FILE=/var/lib/node_exporter/textfile_collector/raijin_log_size.prom \
|
|
288
|
-
# RAIJIN_LOG_DIR=/var/log/raijin-server \
|
|
289
|
-
# /usr/bin/bash -l $(python - <<'PY'
|
|
290
|
-
#from raijin_server.utils import resolve_script_path
|
|
291
|
-
#print(resolve_script_path("log_size_metric.sh"))
|
|
292
|
-
#PY
|
|
293
|
-
#)'
|
|
294
|
-
# 3) Crie um painel no Grafana com a métrica `raijin_log_size_total_bytes` (Prometheus)
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
## Estrutura
|
|
298
|
-
|
|
299
|
-
- `src/raijin_server/cli.py`: CLI principal com Typer, banner e `--dry-run`.
|
|
300
|
-
- `src/raijin_server/modules/`: automacoes por topico (hardening, network, essentials, firewall, kubernetes, calico, istio, traefik, kong, minio, prometheus, grafana, loki, harness, velero, kafka).
|
|
301
|
-
- `src/raijin_server/scripts/`: shells embarcados acessíveis via `raijin_server.utils.resolve_script_path()`.
|
|
302
|
-
- `ARCHITECTURE.md`: visao do desenho atual.
|
|
303
|
-
- `SECURITY.md`: como reportar e pensar seguranca.
|
|
304
|
-
|
|
305
|
-
## Modulos disponiveis
|
|
306
|
-
|
|
307
|
-
- `sanitize`: remove clusters/residuos kube*, binarios antigos e listas apt.
|
|
308
|
-
- `bootstrap`: instala helm, kubectl, istioctl, velero, containerd e dependencias.
|
|
309
|
-
- `ssh-hardening`: cria usuario dedicado, aplica politicas seguras de SSH e integra ao Fail2ban.
|
|
310
|
-
- `hardening`: fail2ban, unattended-upgrades, sysctl.
|
|
311
|
-
- `essentials`: pacotes base (curl, git, jq, etc.) e NTP.
|
|
312
|
-
- `network`: Netplan com IP fixo e DNS. **OPCIONAL** se IP já configurado pelo provedor ISP.
|
|
313
|
-
- `firewall`: UFW com regras para SSH/HTTP/HTTPS/K8s.
|
|
314
|
-
- `vpn`: provisiona WireGuard (servidor + cliente inicial) e libera firewall.
|
|
315
|
-
- `kubernetes`: kubeadm init, containerd SystemdCgroup, kubeconfig. **Oferece limpeza automática** se detectar instalação anterior. IPv6 desabilitado por padrão.
|
|
316
|
-
- `calico`: CNI Calico com CIDR custom, default-deny e opcao de liberar egress rotulado. **Verifica cluster ativo** antes de aplicar.
|
|
317
|
-
- `cert_manager`: instala cert-manager e ClusterIssuer ACME (HTTP-01/DNS-01). **Verifica cluster ativo** antes de instalar.
|
|
318
|
-
- `secrets`: instala sealed-secrets e external-secrets via Helm.
|
|
319
|
-
- `istio`: istioctl install (perfil raijin) e injeção automática.
|
|
320
|
-
- `traefik`: IngressController com TLS/ACME.
|
|
321
|
-
- `kong`: Ingress/Gateway com Helm.
|
|
322
|
-
- `minio`: armazenamento S3 compatível via Helm.
|
|
323
|
-
- `prometheus`, `grafana`, `loki`: observabilidade, dashboards e persistencia.
|
|
324
|
-
- `observability-ingress`: autentica e publica Grafana/Prometheus/Alertmanager com TLS dedicado.
|
|
325
|
-
- `observability-dashboards`: aplica dashboards opinativos e alertas default (Grafana/Prometheus/Alertmanager).
|
|
326
|
-
- `apokolips-demo`: landing page temática para validar ingress/TLS e testar DNS externo.
|
|
327
|
-
- `harness`: delegate Helm com parametros interativos.
|
|
328
|
-
- `velero`: backup/restore com schedule.
|
|
329
|
-
- `kafka`: deploy Bitnami via OCI.
|
|
330
|
-
- `full-install`: orquestra toda a sequência automaticamente (sanitize ➜ observability-dashboards).
|
|
331
|
-
|
|
332
|
-
## Roadmap basico
|
|
333
|
-
|
|
334
|
-
- ✅ Validacoes de pre-requisitos e health-check por modulo.
|
|
335
|
-
- ✅ Provisionar ingress seguro para Grafana/Prometheus/Alertmanager (modulo `observability-ingress`).
|
|
336
|
-
- ✅ Dashboards e alertas opinativos prontos para uso (modulo `observability-dashboards`).
|
|
337
|
-
- ✅ Suporte a sealed-secrets/external-secrets para credenciais.
|
|
338
|
-
- ⏳ Testes automatizados (pytest) e linters.
|
|
339
|
-
|
|
340
|
-
## Proximos passos sugeridos
|
|
341
|
-
|
|
342
|
-
- Suporte a sealed-secrets/external-secrets para credenciais sensíveis.
|
|
343
|
-
- Adicionar validacoes e testes (pytest, linters, testcontainers).
|
|
344
|
-
|
|
345
|
-
## Scripts embarcados
|
|
346
|
-
|
|
347
|
-
Todos os helpers shell agora vivem em `src/raijin_server/scripts/` e acompanham o pacote Python.
|
|
348
|
-
Para invocá-los dentro de um módulo (ou mesmo após instalar via `pip`), use o helper `resolve_script_path()`:
|
|
349
|
-
|
|
350
|
-
```bash
|
|
351
|
-
SCRIPT_PATH=$(python - <<'PY'
|
|
352
|
-
from raijin_server.utils import resolve_script_path
|
|
353
|
-
print(resolve_script_path('pre-deploy-check.sh'))
|
|
354
|
-
PY
|
|
355
|
-
)
|
|
356
|
-
|
|
357
|
-
bash "$SCRIPT_PATH"
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
O helper garante o caminho absoluto correto independentemente de onde o pacote foi instalado.
|
|
361
|
-
|
|
362
|
-
## Publicar no PyPI
|
|
363
|
-
|
|
364
|
-
Use o venv local do repositório (`.venv`) para garantir dependências corretas:
|
|
365
|
-
|
|
366
|
-
```bash
|
|
367
|
-
cd /home/rafael/github/raijin-server
|
|
368
|
-
python3 -m venv .venv
|
|
369
|
-
source .venv/bin/activate
|
|
370
|
-
python -m pip install -U pip build twine
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
Gerar artefatos limpos:
|
|
374
|
-
|
|
375
|
-
```bash
|
|
376
|
-
rm -rf dist build
|
|
377
|
-
python -m build --sdist --wheel --outdir dist
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
Publicar no PyPI (requere token):
|
|
381
|
-
|
|
382
|
-
```bash
|
|
383
|
-
export TWINE_USERNAME="__token__"
|
|
384
|
-
export TWINE_PASSWORD="pypi-xxxxx" # token do PyPI
|
|
385
|
-
python -m twine upload dist/*
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
Opcional: validar no TestPyPI antes de publicar (precisa token de TestPyPI):
|
|
389
|
-
|
|
390
|
-
```bash
|
|
391
|
-
export TWINE_USERNAME="__token__"
|
|
392
|
-
export TWINE_PASSWORD="pypi-xxxxx" # token do TestPyPI
|
|
393
|
-
python -m twine upload --repository testpypi dist/*
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
Depois de publicar, atualize/instale:
|
|
397
|
-
|
|
398
|
-
```bash
|
|
399
|
-
pip install -U raijin-server
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
## Teste de ingress (Apokolips)
|
|
403
|
-
|
|
404
|
-
O módulo [src/raijin_server/modules/apokolips_demo.py](src/raijin_server/modules/apokolips_demo.py) cria um namespace dedicado, ConfigMap com HTML, Deployment NGINX, Service e Ingress Traefik com uma landing page "Apokolips" para validar o tráfego externo.
|
|
405
|
-
|
|
406
|
-
```bash
|
|
407
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server apokolips-demo
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
Personalização rápida:
|
|
411
|
-
|
|
412
|
-
- Defina `APOKOLIPS_HOST=ingress.seudominio.com` para pular o prompt de host.
|
|
413
|
-
- Defina `APOKOLIPS_TLS_SECRET=nome-do-secret` caso já possua um Secret TLS pronto (caso contrário o módulo publica apenas HTTP).
|
|
414
|
-
|
|
415
|
-
Recursos criados:
|
|
416
|
-
|
|
417
|
-
- Namespace `apokolips-demo`
|
|
418
|
-
- ConfigMap com o HTML temático
|
|
419
|
-
- Deployment + Service `ClusterIP` baseado em `nginx:1.25`
|
|
420
|
-
- Ingress (`ingressClassName: traefik`) apontando para o host informado
|
|
421
|
-
|
|
422
|
-
Valide o acesso:
|
|
423
|
-
|
|
424
|
-
```bash
|
|
425
|
-
kubectl -n apokolips-demo get ingress apokolips-demo -o wide
|
|
426
|
-
curl -H "Host: SEU_HOST" https://<IP_DO_LOAD_BALANCER>/ --insecure
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
Para remover rapidamente:
|
|
430
|
-
|
|
431
|
-
```bash
|
|
432
|
-
kubectl delete namespace apokolips-demo
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
## Liberar egress controlado para pods
|
|
436
|
-
|
|
437
|
-
O módulo `calico` agora gera um `default-deny` por namespace e oferece uma política opcional
|
|
438
|
-
`allow-egress-internet`. Ao responder "sim" para a pergunta de egress, basta rotular os workloads
|
|
439
|
-
que precisam falar com APIs externas:
|
|
440
|
-
|
|
441
|
-
```bash
|
|
442
|
-
kubectl label deployment minha-api -n backend \
|
|
443
|
-
networking.raijin.dev/egress=internet
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
Somente pods com esse label terão tráfego liberado para o CIDR definido (padrão `0.0.0.0/0`).
|
|
447
|
-
Isso permite manter o isolamento padrão enquanto libera acesso seletivo para integrações externas.
|
|
448
|
-
|
|
449
|
-
## Automacao de segredos (sealed-secrets + external-secrets)
|
|
450
|
-
|
|
451
|
-
Execute o modulo `secrets` para instalar os controladores:
|
|
452
|
-
|
|
453
|
-
```bash
|
|
454
|
-
sudo -E ~/.venvs/midgard/bin/raijin-server secrets
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
Passos realizados:
|
|
458
|
-
- Instala `sealed-secrets` (namespace padrao: `kube-system`)
|
|
459
|
-
- Instala `external-secrets` (namespace padrao: `external-secrets`, com CRDs)
|
|
460
|
-
- Opcional: exporta o certificado publico do sealed-secrets para gerar manifests lacrados via `kubeseal`
|
|
461
|
-
|
|
462
|
-
Dicas rapidas:
|
|
463
|
-
- Exportar certificado depois: `kubectl -n kube-system get secret -l sealedsecrets.bitnami.com/sealed-secrets-key -o jsonpath='{.items[0].data.tls\.crt}' | base64 -d > sealed-secrets-cert.pem`
|
|
464
|
-
- Gerar sealed secret local: `kubeseal --controller-namespace kube-system --controller-name sealed-secrets < secret.yaml > sealed.yaml`
|
|
465
|
-
- ESO: crie um `SecretStore`/`ClusterSecretStore` apontando para seu backend (AWS/GCP/Vault) e um `ExternalSecret` referenciando as chaves.
|
|
466
|
-
|
|
467
|
-
### Validar o modulo `secrets`
|
|
468
|
-
|
|
469
|
-
```bash
|
|
470
|
-
# Status dos releases
|
|
471
|
-
helm status sealed-secrets -n kube-system
|
|
472
|
-
helm status external-secrets -n external-secrets
|
|
473
|
-
|
|
474
|
-
# Pods prontos
|
|
475
|
-
kubectl get pods -n kube-system -l name=sealed-secrets
|
|
476
|
-
kubectl get pods -n external-secrets -l app.kubernetes.io/name=external-secrets
|
|
477
|
-
|
|
478
|
-
# Health check integrado
|
|
479
|
-
raijin-server --health-check secrets
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
### Exemplos (prontos para aplicar)
|
|
483
|
-
|
|
484
|
-
- SecretStore AWS Secrets Manager: [examples/secrets/secretstore-aws-sm.yaml](examples/secrets/secretstore-aws-sm.yaml)
|
|
485
|
-
- ExternalSecret AWS Secrets Manager: [examples/secrets/externalsecret-aws-sm.yaml](examples/secrets/externalsecret-aws-sm.yaml)
|
|
486
|
-
- SecretStore Vault AppRole: [examples/secrets/secretstore-vault-approle.yaml](examples/secrets/secretstore-vault-approle.yaml)
|
|
487
|
-
- ExternalSecret Vault: [examples/secrets/externalsecret-vault.yaml](examples/secrets/externalsecret-vault.yaml)
|
|
488
|
-
|
|
489
|
-
Notas rápidas:
|
|
490
|
-
- Para AWS/IRSA: crie um ServiceAccount (`apps/eso-aws`) anotado com o role IAM e garanta a policy para leitura dos secrets.
|
|
491
|
-
- Para Vault: crie o Secret `vault-approle-secret` com `secretId` e ajuste `ROLE_ID_AQUI`. Ajuste `server`/`path` conforme seu mount de KV.
|
|
492
|
-
- Aplique na ordem: SecretStore ➜ ExternalSecret ➜ valide `kubectl get secret` no namespace do app.
|
|
493
|
-
|
|
494
|
-
## Testes e lint
|
|
495
|
-
|
|
496
|
-
Ambiente de dev:
|
|
497
|
-
```bash
|
|
498
|
-
python -m pip install -e .[dev]
|
|
499
|
-
pytest
|
|
500
|
-
ruff check src tests
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
## Publicar no PyPI (Twine)
|
|
504
|
-
|
|
505
|
-
O Twine é a ferramenta oficial para enviar pacotes Python ao PyPI com upload seguro (HTTPS e checagem de hash). Use sempre um token de API.
|
|
506
|
-
|
|
507
|
-
Passo a passo:
|
|
508
|
-
```bash
|
|
509
|
-
# 1) Gere artefatos
|
|
510
|
-
python3 -m pip install --user build
|
|
511
|
-
python3 -m build --sdist --wheel --outdir dist/
|
|
512
|
-
|
|
513
|
-
# 2) Configure o token (crie em https://pypi.org/manage/account/token/)
|
|
514
|
-
export TWINE_USERNAME=__token__
|
|
515
|
-
export TWINE_PASSWORD="<seu-token>"
|
|
516
|
-
|
|
517
|
-
# 3) Envie para o PyPI
|
|
518
|
-
python3 -m twine upload dist/*
|
|
519
|
-
|
|
520
|
-
# 4) Verifique instalação
|
|
521
|
-
python3 -m pip install -U raijin-server
|
|
522
|
-
raijin-server --version
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
Boas práticas:
|
|
526
|
-
- Use venv dedicado para publicar (`python -m venv ~/.venvs/publish && source ~/.venvs/publish/bin/activate`).
|
|
527
|
-
- Nunca commite ou exponha o token; mantenha em variável de ambiente/secret manager.
|
|
528
|
-
- Sempre suba primeiro para TestPyPI se quiser validar (`--repository testpypi`).
|
|
529
|
-
|
|
530
|
-
## Acesso remoto seguro (VPN + SSH)
|
|
531
|
-
|
|
532
|
-
Execute `raijin-server ssh-hardening` para aplicar as politicas abaixo automaticamente e `raijin-server vpn` para subir o servidor WireGuard com um cliente inicial. Use `--dry-run` se quiser apenas revisar os comandos.
|
|
533
|
-
|
|
534
|
-
1. **SSH reforçado**
|
|
535
|
-
- Gere chaves `ed25519` em cada estação: `ssh-keygen -t ed25519 -C "adminops@empresa"`.
|
|
536
|
-
- No servidor, crie um usuário administrativo (ex.: `adminops`) e aplique hardening no `/etc/ssh/sshd_config`:
|
|
537
|
-
```
|
|
538
|
-
Port 22 # altere caso deseje
|
|
539
|
-
PermitRootLogin no
|
|
540
|
-
PasswordAuthentication no
|
|
541
|
-
AllowUsers adminops
|
|
542
|
-
```
|
|
543
|
-
- Copie as chaves públicas para `/home/adminops/.ssh/authorized_keys`, ajuste permissões e reinicie o sshd (`systemctl restart ssh`).
|
|
544
|
-
- Para tunelar dashboards internos sem expor portas, use `ssh -L 3000:localhost:3000 adminops@IP_PUBLICO` (ou `-R` para acesso reverso).
|
|
545
|
-
|
|
546
|
-
2. **VPN privada (WireGuard sugerido)**
|
|
547
|
-
- Instale `wireguard-tools` e `qrencode`, gere chaves do servidor (`wg genkey | tee server.key | wg pubkey > server.pub`).
|
|
548
|
-
- Configure `/etc/wireguard/wg0.conf`:
|
|
549
|
-
```
|
|
550
|
-
[Interface]
|
|
551
|
-
Address = 10.20.0.1/24
|
|
552
|
-
ListenPort = 51820
|
|
553
|
-
PrivateKey = <server.key>
|
|
554
|
-
PostUp = ufw route allow in on wg0 out on eth0
|
|
555
|
-
PostDown = ufw route delete allow in on wg0 out on eth0
|
|
556
|
-
```
|
|
557
|
-
- Adicione um `[Peer]` por estação com `AllowedIPs = 10.20.0.X/32`, distribua os arquivos `clientX.conf` ou QR codes e inicie com `systemctl enable --now wg-quick@wg0`.
|
|
558
|
-
- No modem/VPC, libere apenas `51820/UDP` e limite SSH/UIs para o range `10.20.0.0/24` (UFW `allow from 10.20.0.0/24 to any port 22`).
|
|
559
|
-
|
|
560
|
-
3. **Fluxo recomendado**
|
|
561
|
-
- Exporte apenas o que precisa ser público (Traefik, Harness) e mantenha Grafana/Prometheus/Kubernetes API restritos ao túnel VPN.
|
|
562
|
-
- Documente as portas encaminhadas e mantenha as chaves/tokens em `secrets/` ou sealed-secrets para fácil rotação.
|
|
563
|
-
|
|
564
|
-
Combine esse fluxo com `raijin-server observability-ingress` para publicar Grafana/Prometheus/Alertmanager somente via TLS dedicado e autenticação básica por Traefik e finalize com `raijin-server observability-dashboards` para carregar dashboards e alertas opinativos.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|