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.

@@ -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.