raijin-server 0.2.38__py3-none-any.whl → 0.2.40__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/modules/minio.py +187 -17
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/METADATA +2 -1
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/RECORD +8 -8
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/WHEEL +0 -0
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/entry_points.txt +0 -0
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/licenses/LICENSE +0 -0
- {raijin_server-0.2.38.dist-info → raijin_server-0.2.40.dist-info}/top_level.txt +0 -0
raijin_server/__init__.py
CHANGED
raijin_server/modules/minio.py
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"""Deploy do MinIO via Helm com configuracoes production-ready."""
|
|
2
2
|
|
|
3
|
+
import json
|
|
3
4
|
import secrets
|
|
4
5
|
import socket
|
|
6
|
+
import tempfile
|
|
5
7
|
import time
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
import textwrap
|
|
6
10
|
|
|
7
11
|
import typer
|
|
8
12
|
|
|
@@ -12,6 +16,7 @@ LOCAL_PATH_PROVISIONER_URL = (
|
|
|
12
16
|
"https://raw.githubusercontent.com/rancher/local-path-provisioner/"
|
|
13
17
|
"v0.0.30/deploy/local-path-storage.yaml"
|
|
14
18
|
)
|
|
19
|
+
RAIJIN_LOCAL_PATH_SC_NAME = "raijin-local-path"
|
|
15
20
|
|
|
16
21
|
|
|
17
22
|
def _detect_node_name(ctx: ExecutionContext) -> str:
|
|
@@ -31,6 +36,51 @@ def _generate_secret(length: int = 32) -> str:
|
|
|
31
36
|
return secrets.token_urlsafe(length)[:length]
|
|
32
37
|
|
|
33
38
|
|
|
39
|
+
def _apply_manifest(ctx: ExecutionContext, manifest: str, description: str) -> bool:
|
|
40
|
+
"""Aplica manifest YAML temporario com kubectl."""
|
|
41
|
+
tmp_path = None
|
|
42
|
+
try:
|
|
43
|
+
with tempfile.NamedTemporaryFile("w", delete=False, suffix=".yaml") as tmp:
|
|
44
|
+
tmp.write(manifest)
|
|
45
|
+
tmp.flush()
|
|
46
|
+
tmp_path = Path(tmp.name)
|
|
47
|
+
result = run_cmd(
|
|
48
|
+
["kubectl", "apply", "-f", str(tmp_path)],
|
|
49
|
+
ctx,
|
|
50
|
+
check=False,
|
|
51
|
+
)
|
|
52
|
+
if result.returncode != 0:
|
|
53
|
+
typer.secho(f" Falha ao aplicar {description}.", fg=typer.colors.RED)
|
|
54
|
+
return False
|
|
55
|
+
typer.secho(f" ✓ {description} aplicado.", fg=typer.colors.GREEN)
|
|
56
|
+
return True
|
|
57
|
+
finally:
|
|
58
|
+
if tmp_path and tmp_path.exists():
|
|
59
|
+
tmp_path.unlink(missing_ok=True)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _create_raijin_local_path_sc(ctx: ExecutionContext) -> bool:
|
|
63
|
+
"""Cria StorageClass com volumeBindingMode=Immediate baseada no local-path."""
|
|
64
|
+
manifest = textwrap.dedent(
|
|
65
|
+
f"""
|
|
66
|
+
apiVersion: storage.k8s.io/v1
|
|
67
|
+
kind: StorageClass
|
|
68
|
+
metadata:
|
|
69
|
+
name: {RAIJIN_LOCAL_PATH_SC_NAME}
|
|
70
|
+
provisioner: rancher.io/local-path
|
|
71
|
+
reclaimPolicy: Delete
|
|
72
|
+
volumeBindingMode: Immediate
|
|
73
|
+
allowVolumeExpansion: true
|
|
74
|
+
parameters:
|
|
75
|
+
type: ""
|
|
76
|
+
"""
|
|
77
|
+
).strip()
|
|
78
|
+
typer.echo(
|
|
79
|
+
f"Criando StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' com binding imediato para PVCs do MinIO..."
|
|
80
|
+
)
|
|
81
|
+
return _apply_manifest(ctx, manifest, f"StorageClass {RAIJIN_LOCAL_PATH_SC_NAME}")
|
|
82
|
+
|
|
83
|
+
|
|
34
84
|
def _get_default_storage_class(ctx: ExecutionContext) -> str:
|
|
35
85
|
"""Retorna o nome da StorageClass default do cluster, se existir."""
|
|
36
86
|
result = run_cmd(
|
|
@@ -58,6 +108,102 @@ def _list_storage_classes(ctx: ExecutionContext) -> list:
|
|
|
58
108
|
return []
|
|
59
109
|
|
|
60
110
|
|
|
111
|
+
def _patch_local_path_provisioner_tolerations(ctx: ExecutionContext) -> None:
|
|
112
|
+
"""Adiciona tolerations ao local-path-provisioner para rodar em control-plane."""
|
|
113
|
+
typer.echo(" Configurando tolerations no local-path-provisioner...")
|
|
114
|
+
|
|
115
|
+
# Patch no deployment para tolerar control-plane
|
|
116
|
+
patch_deployment = textwrap.dedent(
|
|
117
|
+
"""
|
|
118
|
+
spec:
|
|
119
|
+
template:
|
|
120
|
+
spec:
|
|
121
|
+
tolerations:
|
|
122
|
+
- key: node-role.kubernetes.io/control-plane
|
|
123
|
+
operator: Exists
|
|
124
|
+
effect: NoSchedule
|
|
125
|
+
- key: node-role.kubernetes.io/master
|
|
126
|
+
operator: Exists
|
|
127
|
+
effect: NoSchedule
|
|
128
|
+
"""
|
|
129
|
+
).strip()
|
|
130
|
+
|
|
131
|
+
result = run_cmd(
|
|
132
|
+
[
|
|
133
|
+
"kubectl", "-n", "local-path-storage", "patch", "deployment",
|
|
134
|
+
"local-path-provisioner", "--patch", patch_deployment,
|
|
135
|
+
],
|
|
136
|
+
ctx,
|
|
137
|
+
check=False,
|
|
138
|
+
)
|
|
139
|
+
if result.returncode == 0:
|
|
140
|
+
typer.secho(" ✓ Deployment patched com tolerations.", fg=typer.colors.GREEN)
|
|
141
|
+
|
|
142
|
+
# Patch no ConfigMap para os helper pods (que criam os dirs no node)
|
|
143
|
+
# O local-path-provisioner usa um ConfigMap com helperPod template
|
|
144
|
+
helper_pod_config = {
|
|
145
|
+
"nodePathMap": [
|
|
146
|
+
{
|
|
147
|
+
"node": "DEFAULT_PATH_FOR_NON_LISTED_NODES",
|
|
148
|
+
"paths": ["/opt/local-path-provisioner"]
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
"setupCommand": None,
|
|
152
|
+
"teardownCommand": None,
|
|
153
|
+
"helperPod": {
|
|
154
|
+
"apiVersion": "v1",
|
|
155
|
+
"kind": "Pod",
|
|
156
|
+
"metadata": {},
|
|
157
|
+
"spec": {
|
|
158
|
+
"tolerations": [
|
|
159
|
+
{"key": "node-role.kubernetes.io/control-plane", "operator": "Exists", "effect": "NoSchedule"},
|
|
160
|
+
{"key": "node-role.kubernetes.io/master", "operator": "Exists", "effect": "NoSchedule"}
|
|
161
|
+
],
|
|
162
|
+
"containers": [
|
|
163
|
+
{
|
|
164
|
+
"name": "helper-pod",
|
|
165
|
+
"image": "busybox:stable",
|
|
166
|
+
"imagePullPolicy": "IfNotPresent"
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
# Converte para JSON string para o patch
|
|
174
|
+
config_json_str = json.dumps(helper_pod_config)
|
|
175
|
+
patch_data = json.dumps({"data": {"config.json": config_json_str}})
|
|
176
|
+
|
|
177
|
+
# Aplica via patch no ConfigMap
|
|
178
|
+
result = run_cmd(
|
|
179
|
+
[
|
|
180
|
+
"kubectl", "-n", "local-path-storage", "patch", "configmap",
|
|
181
|
+
"local-path-config", "--type=merge", "-p", patch_data,
|
|
182
|
+
],
|
|
183
|
+
ctx,
|
|
184
|
+
check=False,
|
|
185
|
+
)
|
|
186
|
+
if result.returncode == 0:
|
|
187
|
+
typer.secho(" ✓ ConfigMap patched para helper pods.", fg=typer.colors.GREEN)
|
|
188
|
+
|
|
189
|
+
# Reinicia o deployment para aplicar as mudanças
|
|
190
|
+
run_cmd(
|
|
191
|
+
["kubectl", "-n", "local-path-storage", "rollout", "restart", "deployment/local-path-provisioner"],
|
|
192
|
+
ctx,
|
|
193
|
+
check=False,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Aguarda rollout
|
|
197
|
+
run_cmd(
|
|
198
|
+
[
|
|
199
|
+
"kubectl", "-n", "local-path-storage", "rollout", "status",
|
|
200
|
+
"deployment/local-path-provisioner", "--timeout=60s",
|
|
201
|
+
],
|
|
202
|
+
ctx,
|
|
203
|
+
check=False,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
61
207
|
def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
|
|
62
208
|
"""Instala local-path-provisioner para usar storage local (NVMe/SSD)."""
|
|
63
209
|
typer.echo("Instalando local-path-provisioner para storage local...")
|
|
@@ -71,7 +217,7 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
|
|
|
71
217
|
typer.secho(" Falha ao instalar local-path-provisioner.", fg=typer.colors.RED)
|
|
72
218
|
return False
|
|
73
219
|
|
|
74
|
-
# Aguarda deployment ficar pronto
|
|
220
|
+
# Aguarda deployment ficar pronto inicialmente
|
|
75
221
|
typer.echo(" Aguardando local-path-provisioner ficar Ready...")
|
|
76
222
|
run_cmd(
|
|
77
223
|
[
|
|
@@ -82,7 +228,10 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
|
|
|
82
228
|
check=False,
|
|
83
229
|
)
|
|
84
230
|
|
|
85
|
-
|
|
231
|
+
# Aplica tolerations para control-plane (single-node clusters)
|
|
232
|
+
_patch_local_path_provisioner_tolerations(ctx)
|
|
233
|
+
|
|
234
|
+
typer.secho(" ✓ local-path-provisioner instalado e configurado.", fg=typer.colors.GREEN)
|
|
86
235
|
return True
|
|
87
236
|
|
|
88
237
|
|
|
@@ -117,28 +266,46 @@ def _set_default_storage_class(ctx: ExecutionContext, name: str) -> None:
|
|
|
117
266
|
|
|
118
267
|
def _ensure_storage_class(ctx: ExecutionContext) -> str:
|
|
119
268
|
"""Garante que existe uma StorageClass disponivel, instalando local-path se necessario."""
|
|
120
|
-
# Verifica se ja tem default
|
|
121
269
|
default_sc = _get_default_storage_class(ctx)
|
|
122
|
-
|
|
270
|
+
available = _list_storage_classes(ctx)
|
|
271
|
+
|
|
272
|
+
# Se ja houver StorageClass dedicada do Raijin, usa ela
|
|
273
|
+
if default_sc == RAIJIN_LOCAL_PATH_SC_NAME:
|
|
123
274
|
typer.echo(f"StorageClass default detectada: {default_sc}")
|
|
275
|
+
# Garante que o provisioner tem tolerations (pode ter sido instalado antes do fix)
|
|
276
|
+
_patch_local_path_provisioner_tolerations(ctx)
|
|
124
277
|
return default_sc
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
278
|
+
if RAIJIN_LOCAL_PATH_SC_NAME in available:
|
|
279
|
+
typer.echo(f"StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' detectada.")
|
|
280
|
+
_patch_local_path_provisioner_tolerations(ctx)
|
|
281
|
+
_set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
|
|
282
|
+
return RAIJIN_LOCAL_PATH_SC_NAME
|
|
283
|
+
|
|
284
|
+
# Se ja existir default diferente de local-path, respeita configuracao do cluster
|
|
285
|
+
if default_sc and default_sc != "local-path":
|
|
286
|
+
typer.echo(f"StorageClass default detectada: {default_sc}")
|
|
287
|
+
return default_sc
|
|
288
|
+
|
|
289
|
+
# Se local-path estiver disponivel (default ou nao), cria uma classe dedicada com binding imediato
|
|
290
|
+
if "local-path" in available or default_sc == "local-path":
|
|
291
|
+
# Garante tolerations no provisioner existente
|
|
292
|
+
_patch_local_path_provisioner_tolerations(ctx)
|
|
293
|
+
if _create_raijin_local_path_sc(ctx):
|
|
294
|
+
_set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
|
|
295
|
+
return RAIJIN_LOCAL_PATH_SC_NAME
|
|
296
|
+
typer.echo("Nao foi possivel criar StorageClass dedicada; usando 'local-path'.")
|
|
297
|
+
_set_default_storage_class(ctx, "local-path")
|
|
298
|
+
return "local-path"
|
|
299
|
+
|
|
128
300
|
if available:
|
|
129
301
|
typer.echo(f"StorageClasses disponiveis (sem default): {', '.join(available)}")
|
|
130
|
-
# Se local-path existe, define como default
|
|
131
|
-
if "local-path" in available:
|
|
132
|
-
_set_default_storage_class(ctx, "local-path")
|
|
133
|
-
return "local-path"
|
|
134
|
-
# Pergunta qual usar
|
|
135
302
|
choice = typer.prompt(
|
|
136
303
|
f"Qual StorageClass usar? ({'/'.join(available)})",
|
|
137
304
|
default=available[0],
|
|
138
305
|
)
|
|
139
306
|
return choice
|
|
140
|
-
|
|
141
|
-
#
|
|
307
|
+
|
|
308
|
+
# Nenhuma StorageClass disponivel - instala local-path automaticamente
|
|
142
309
|
typer.secho(
|
|
143
310
|
"Nenhuma StorageClass encontrada no cluster.",
|
|
144
311
|
fg=typer.colors.YELLOW,
|
|
@@ -153,11 +320,14 @@ def _ensure_storage_class(ctx: ExecutionContext) -> str:
|
|
|
153
320
|
fg=typer.colors.RED,
|
|
154
321
|
)
|
|
155
322
|
raise typer.Exit(1)
|
|
156
|
-
|
|
323
|
+
|
|
157
324
|
if not _install_local_path_provisioner(ctx):
|
|
158
325
|
raise typer.Exit(1)
|
|
159
|
-
|
|
160
|
-
|
|
326
|
+
|
|
327
|
+
if _create_raijin_local_path_sc(ctx):
|
|
328
|
+
_set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
|
|
329
|
+
return RAIJIN_LOCAL_PATH_SC_NAME
|
|
330
|
+
|
|
161
331
|
_set_default_storage_class(ctx, "local-path")
|
|
162
332
|
return "local-path"
|
|
163
333
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: raijin-server
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.40
|
|
4
4
|
Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
|
|
5
5
|
Home-page: https://example.com/raijin-server
|
|
6
6
|
Author: Equipe Raijin
|
|
@@ -46,6 +46,7 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
|
|
|
46
46
|
- Segurança: [SECURITY.md](SECURITY.md)
|
|
47
47
|
- Acesso SSH (Windows): [docs/SSH_WINDOWS.md](docs/SSH_WINDOWS.md)
|
|
48
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)
|
|
49
50
|
|
|
50
51
|
## Destaques
|
|
51
52
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
raijin_server/__init__.py,sha256=
|
|
1
|
+
raijin_server/__init__.py,sha256=PET19zpBabvgsdbOZwr8T9CyQlc69zOhgFzYRP5DDI8,95
|
|
2
2
|
raijin_server/cli.py,sha256=2m7q1znMLbBdnUwN6oOUrCZXEqC2e7SfbjYkymbP4lQ,37884
|
|
3
3
|
raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
|
|
4
4
|
raijin_server/healthchecks.py,sha256=lzXdFw6S0hOYbUKbqksh4phb04lXgXdTspP1Dsz4dx8,15401
|
|
@@ -22,7 +22,7 @@ raijin_server/modules/kong.py,sha256=eDSagvEP9_BCs9pZ-pCVs1BDdlYOoJfY5PnUSiTvvgc
|
|
|
22
22
|
raijin_server/modules/kubernetes.py,sha256=9E6zV0zGQWZW92NVpxwYctpi-4JDmi6YzF3tKRI4HlU,13343
|
|
23
23
|
raijin_server/modules/loki.py,sha256=aNiUpnOFppZMXoQwYhn7IoPMzwUz4aHi6pbiqj1PRjc,5022
|
|
24
24
|
raijin_server/modules/metallb.py,sha256=uUuklc_RsQ-W2qDVRMQAxQm9HKGEqso444b1IwBpM6w,8554
|
|
25
|
-
raijin_server/modules/minio.py,sha256=
|
|
25
|
+
raijin_server/modules/minio.py,sha256=XvWg4XJ2URZhiJYHrqf1Eg5tvLGXMxu45Rr_9C58SP4,18915
|
|
26
26
|
raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
|
|
27
27
|
raijin_server/modules/observability_dashboards.py,sha256=fVz0WEOQrUTF5rJ__Nu_onyBuwL_exFmysWMmg8AE9w,7319
|
|
28
28
|
raijin_server/modules/observability_ingress.py,sha256=Fh1rlFWueBNHnOkHuoHYyhILmpO-iQXINybSUYbYsHQ,5738
|
|
@@ -38,9 +38,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
|
|
|
38
38
|
raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
|
|
39
39
|
raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
|
|
40
40
|
raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
|
|
41
|
-
raijin_server-0.2.
|
|
42
|
-
raijin_server-0.2.
|
|
43
|
-
raijin_server-0.2.
|
|
44
|
-
raijin_server-0.2.
|
|
45
|
-
raijin_server-0.2.
|
|
46
|
-
raijin_server-0.2.
|
|
41
|
+
raijin_server-0.2.40.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
|
|
42
|
+
raijin_server-0.2.40.dist-info/METADATA,sha256=gpXIeSzpsrBImaDzxLWQgddp1QZa3rOJmn3fZJ18HfA,22851
|
|
43
|
+
raijin_server-0.2.40.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
44
|
+
raijin_server-0.2.40.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
|
|
45
|
+
raijin_server-0.2.40.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
|
|
46
|
+
raijin_server-0.2.40.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|