raijin-server 0.3.6__py3-none-any.whl → 0.3.8__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 +2 -8
- raijin_server/healthchecks.py +1 -55
- raijin_server/minio_utils.py +562 -0
- raijin_server/modules/__init__.py +1 -2
- raijin_server/modules/harbor.py +10 -26
- raijin_server/modules/secrets.py +86 -72
- raijin_server/modules/velero.py +49 -2
- raijin_server/validators.py +1 -1
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/METADATA +1 -1
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/RECORD +15 -15
- raijin_server/modules/apokolips_demo.py +0 -414
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/WHEEL +0 -0
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/entry_points.txt +0 -0
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/licenses/LICENSE +0 -0
- {raijin_server-0.3.6.dist-info → raijin_server-0.3.8.dist-info}/top_level.txt +0 -0
raijin_server/modules/harbor.py
CHANGED
|
@@ -25,6 +25,7 @@ from raijin_server.utils import (
|
|
|
25
25
|
run_cmd,
|
|
26
26
|
write_file,
|
|
27
27
|
)
|
|
28
|
+
from raijin_server.minio_utils import get_or_create_minio_user
|
|
28
29
|
|
|
29
30
|
HARBOR_NAMESPACE = "harbor"
|
|
30
31
|
|
|
@@ -65,34 +66,17 @@ def _uninstall_harbor(ctx: ExecutionContext, namespace: str) -> None:
|
|
|
65
66
|
|
|
66
67
|
|
|
67
68
|
def _get_minio_credentials(ctx: ExecutionContext) -> tuple[str, str]:
|
|
68
|
-
"""Obtem credenciais do MinIO
|
|
69
|
-
typer.echo("Obtendo credenciais do MinIO...")
|
|
69
|
+
"""Obtem ou cria credenciais específicas do MinIO para Harbor.
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
Esta função cria um usuário MinIO dedicado para o Harbor com acesso
|
|
72
|
+
restrito apenas aos buckets: harbor-registry, harbor-chartmuseum, harbor-jobservice.
|
|
73
|
+
"""
|
|
74
|
+
return get_or_create_minio_user(
|
|
75
|
+
ctx=ctx,
|
|
76
|
+
app_name="harbor",
|
|
77
|
+
buckets=["harbor-registry", "harbor-chartmuseum", "harbor-jobservice"],
|
|
78
|
+
namespace=HARBOR_NAMESPACE,
|
|
75
79
|
)
|
|
76
|
-
|
|
77
|
-
if result.returncode == 0 and result.stdout:
|
|
78
|
-
access_key = base64.b64decode(result.stdout.strip()).decode("utf-8")
|
|
79
|
-
|
|
80
|
-
result = run_cmd(
|
|
81
|
-
["kubectl", "-n", "minio", "get", "secret", "minio-credentials", "-o", "jsonpath={.data.secretkey}"],
|
|
82
|
-
ctx,
|
|
83
|
-
check=False,
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
if result.returncode == 0 and result.stdout:
|
|
87
|
-
secret_key = base64.b64decode(result.stdout.strip()).decode("utf-8")
|
|
88
|
-
return access_key, secret_key
|
|
89
|
-
|
|
90
|
-
# Fallback para prompt manual
|
|
91
|
-
typer.secho("Não foi possível obter credenciais automaticamente.", fg=typer.colors.YELLOW)
|
|
92
|
-
access_key = typer.prompt("MinIO Access Key", default="thor")
|
|
93
|
-
secret_key = typer.prompt("MinIO Secret Key", default="rebel1on", hide_input=True)
|
|
94
|
-
|
|
95
|
-
return access_key, secret_key
|
|
96
80
|
|
|
97
81
|
|
|
98
82
|
def _wait_for_pods_ready(ctx: ExecutionContext, namespace: str, timeout: int = 300) -> bool:
|
raijin_server/modules/secrets.py
CHANGED
|
@@ -24,6 +24,7 @@ from raijin_server.utils import (
|
|
|
24
24
|
run_cmd,
|
|
25
25
|
write_file,
|
|
26
26
|
)
|
|
27
|
+
from raijin_server.minio_utils import get_or_create_minio_user
|
|
27
28
|
|
|
28
29
|
VAULT_NAMESPACE = "vault"
|
|
29
30
|
ESO_NAMESPACE = "external-secrets"
|
|
@@ -124,43 +125,30 @@ def _wait_for_pods_ready(ctx: ExecutionContext, namespace: str, label: str, time
|
|
|
124
125
|
|
|
125
126
|
|
|
126
127
|
def _get_minio_credentials(ctx: ExecutionContext) -> tuple[str, str]:
|
|
127
|
-
"""Obtem credenciais do MinIO
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
ctx,
|
|
134
|
-
|
|
128
|
+
"""Obtem ou cria credenciais específicas do MinIO para Vault.
|
|
129
|
+
|
|
130
|
+
Esta função cria um usuário MinIO dedicado para o Vault com acesso
|
|
131
|
+
restrito apenas ao bucket 'vault-storage'.
|
|
132
|
+
"""
|
|
133
|
+
return get_or_create_minio_user(
|
|
134
|
+
ctx=ctx,
|
|
135
|
+
app_name="vault",
|
|
136
|
+
buckets=["vault-storage"],
|
|
137
|
+
namespace=VAULT_NAMESPACE,
|
|
135
138
|
)
|
|
136
|
-
|
|
137
|
-
if result.returncode == 0 and result.stdout:
|
|
138
|
-
access_key = base64.b64decode(result.stdout.strip()).decode("utf-8")
|
|
139
|
-
|
|
140
|
-
result = run_cmd(
|
|
141
|
-
["kubectl", "-n", "minio", "get", "secret", "minio-credentials", "-o", "jsonpath={.data.secretkey}"],
|
|
142
|
-
ctx,
|
|
143
|
-
check=False,
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
if result.returncode == 0 and result.stdout:
|
|
147
|
-
secret_key = base64.b64decode(result.stdout.strip()).decode("utf-8")
|
|
148
|
-
return access_key, secret_key
|
|
149
|
-
|
|
150
|
-
# Fallback para prompt manual
|
|
151
|
-
typer.secho("Não foi possível obter credenciais automaticamente.", fg=typer.colors.YELLOW)
|
|
152
|
-
access_key = typer.prompt("MinIO Access Key", default="thor")
|
|
153
|
-
secret_key = typer.prompt("MinIO Secret Key", default="rebel1on", hide_input=True)
|
|
154
|
-
|
|
155
|
-
return access_key, secret_key
|
|
156
139
|
|
|
157
140
|
|
|
158
|
-
def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tuple[str,
|
|
159
|
-
"""Inicializa o Vault e retorna root token e unseal
|
|
160
|
-
typer.echo("\
|
|
141
|
+
def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tuple[str, str]:
|
|
142
|
+
"""Inicializa o Vault com 1 key/1 threshold e retorna root token e unseal key."""
|
|
143
|
+
typer.echo("\nInicializando Vault...")
|
|
161
144
|
|
|
145
|
+
# Usa 1 key com threshold 1 para simplificar (produção pode usar 5/3)
|
|
162
146
|
result = run_cmd(
|
|
163
|
-
[
|
|
147
|
+
[
|
|
148
|
+
"kubectl", "-n", vault_ns, "exec", "vault-0", "--",
|
|
149
|
+
"vault", "operator", "init",
|
|
150
|
+
"-key-shares=1", "-key-threshold=1", "-format=json"
|
|
151
|
+
],
|
|
164
152
|
ctx,
|
|
165
153
|
check=False,
|
|
166
154
|
)
|
|
@@ -172,28 +160,60 @@ def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tup
|
|
|
172
160
|
import json
|
|
173
161
|
init_data = json.loads(result.stdout)
|
|
174
162
|
root_token = init_data["root_token"]
|
|
175
|
-
|
|
163
|
+
unseal_key = init_data["unseal_keys_b64"][0]
|
|
176
164
|
|
|
177
165
|
# Salva keys localmente
|
|
178
166
|
vault_keys_path = Path("/etc/vault/keys.json")
|
|
179
167
|
vault_keys_path.parent.mkdir(parents=True, exist_ok=True)
|
|
180
168
|
vault_keys_path.write_text(json.dumps(init_data, indent=2))
|
|
181
169
|
typer.secho(f"\n✓ Vault keys salvas em {vault_keys_path}", fg=typer.colors.GREEN)
|
|
170
|
+
|
|
171
|
+
# Salva credenciais em secret K8s para uso do ESO
|
|
172
|
+
_save_vault_credentials_to_k8s(ctx, vault_ns, root_token, unseal_key)
|
|
173
|
+
|
|
182
174
|
typer.secho("⚠️ IMPORTANTE: Guarde essas keys em local seguro!", fg=typer.colors.YELLOW, bold=True)
|
|
183
175
|
|
|
184
|
-
return root_token,
|
|
176
|
+
return root_token, unseal_key
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _save_vault_credentials_to_k8s(ctx: ExecutionContext, vault_ns: str, root_token: str, unseal_key: str) -> None:
|
|
180
|
+
"""Salva credenciais do Vault em secret K8s."""
|
|
181
|
+
typer.echo("Salvando credenciais do Vault em secret K8s...")
|
|
182
|
+
|
|
183
|
+
# Codifica em base64
|
|
184
|
+
token_b64 = base64.b64encode(root_token.encode()).decode()
|
|
185
|
+
key_b64 = base64.b64encode(unseal_key.encode()).decode()
|
|
186
|
+
|
|
187
|
+
secret_yaml = f"""apiVersion: v1
|
|
188
|
+
kind: Secret
|
|
189
|
+
metadata:
|
|
190
|
+
name: vault-init-credentials
|
|
191
|
+
namespace: {vault_ns}
|
|
192
|
+
type: Opaque
|
|
193
|
+
data:
|
|
194
|
+
root-token: {token_b64}
|
|
195
|
+
unseal-key: {key_b64}
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
secret_path = Path("/tmp/raijin-vault-credentials.yaml")
|
|
199
|
+
write_file(secret_path, secret_yaml, ctx)
|
|
200
|
+
|
|
201
|
+
run_cmd(
|
|
202
|
+
["kubectl", "apply", "-f", str(secret_path)],
|
|
203
|
+
ctx,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
typer.secho("✓ Credenciais salvas em secret vault-init-credentials.", fg=typer.colors.GREEN)
|
|
185
207
|
|
|
186
208
|
|
|
187
|
-
def _unseal_vault(ctx: ExecutionContext, vault_ns: str,
|
|
188
|
-
"""Destrava o Vault usando
|
|
209
|
+
def _unseal_vault(ctx: ExecutionContext, vault_ns: str, unseal_key: str) -> None:
|
|
210
|
+
"""Destrava o Vault usando a unseal key."""
|
|
189
211
|
typer.echo("\nDesbloqueando Vault...")
|
|
190
212
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
ctx,
|
|
196
|
-
)
|
|
213
|
+
run_cmd(
|
|
214
|
+
["kubectl", "-n", vault_ns, "exec", "vault-0", "--", "vault", "operator", "unseal", unseal_key],
|
|
215
|
+
ctx,
|
|
216
|
+
)
|
|
197
217
|
|
|
198
218
|
typer.secho("✓ Vault desbloqueado.", fg=typer.colors.GREEN)
|
|
199
219
|
|
|
@@ -279,23 +299,21 @@ def _create_secretstore_example(ctx: ExecutionContext, vault_ns: str, eso_ns: st
|
|
|
279
299
|
"""Cria exemplo de ClusterSecretStore e ExternalSecret."""
|
|
280
300
|
typer.echo("\nCriando exemplo de ClusterSecretStore...")
|
|
281
301
|
|
|
282
|
-
secretstore_yaml = f"""apiVersion: external-secrets.io/
|
|
302
|
+
secretstore_yaml = f"""apiVersion: external-secrets.io/v1
|
|
283
303
|
kind: ClusterSecretStore
|
|
284
304
|
metadata:
|
|
285
305
|
name: vault-backend
|
|
286
306
|
spec:
|
|
287
307
|
provider:
|
|
288
308
|
vault:
|
|
289
|
-
server: "http://vault.{vault_ns}.svc
|
|
309
|
+
server: "http://vault.{vault_ns}.svc:8200"
|
|
290
310
|
path: "secret"
|
|
291
311
|
version: "v2"
|
|
292
312
|
auth:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
name: "external-secrets"
|
|
298
|
-
namespace: "{eso_ns}"
|
|
313
|
+
tokenSecretRef:
|
|
314
|
+
namespace: "{vault_ns}"
|
|
315
|
+
name: "vault-init-credentials"
|
|
316
|
+
key: "root-token"
|
|
299
317
|
"""
|
|
300
318
|
|
|
301
319
|
secretstore_path = Path("/tmp/raijin-vault-secretstore.yaml")
|
|
@@ -327,7 +345,7 @@ def _create_example_secret(ctx: ExecutionContext, vault_ns: str, root_token: str
|
|
|
327
345
|
typer.secho("✓ Secret 'secret/example' criado no Vault.", fg=typer.colors.GREEN)
|
|
328
346
|
|
|
329
347
|
# Cria ExternalSecret de exemplo
|
|
330
|
-
external_secret_yaml = """apiVersion: external-secrets.io/
|
|
348
|
+
external_secret_yaml = """apiVersion: external-secrets.io/v1
|
|
331
349
|
kind: ExternalSecret
|
|
332
350
|
metadata:
|
|
333
351
|
name: example-secret
|
|
@@ -396,7 +414,7 @@ def run(ctx: ExecutionContext) -> None:
|
|
|
396
414
|
)
|
|
397
415
|
node_ip = result.stdout.strip() if result.returncode == 0 else "192.168.1.81"
|
|
398
416
|
|
|
399
|
-
minio_host = typer.prompt("MinIO host", default=
|
|
417
|
+
minio_host = typer.prompt("MinIO host (interno)", default="minio.minio.svc:9000")
|
|
400
418
|
access_key, secret_key = _get_minio_credentials(ctx)
|
|
401
419
|
|
|
402
420
|
# ========== HashiCorp Vault ==========
|
|
@@ -410,16 +428,8 @@ def run(ctx: ExecutionContext) -> None:
|
|
|
410
428
|
if cleanup:
|
|
411
429
|
_uninstall_vault(ctx, vault_ns)
|
|
412
430
|
|
|
413
|
-
#
|
|
414
|
-
|
|
415
|
-
run_cmd(
|
|
416
|
-
[
|
|
417
|
-
"mc", "mb", "--ignore-existing",
|
|
418
|
-
f"minio/vault-storage"
|
|
419
|
-
],
|
|
420
|
-
ctx,
|
|
421
|
-
check=False,
|
|
422
|
-
)
|
|
431
|
+
# Credenciais são obtidas automaticamente via get_or_create_minio_user
|
|
432
|
+
# que já cria o bucket 'vault-storage' e o usuário 'vault-user'
|
|
423
433
|
|
|
424
434
|
vault_values_yaml = f"""server:
|
|
425
435
|
ha:
|
|
@@ -494,15 +504,14 @@ injector:
|
|
|
494
504
|
if not ctx.dry_run:
|
|
495
505
|
_wait_for_pods_ready(ctx, vault_ns, "app.kubernetes.io/name=vault", timeout=180)
|
|
496
506
|
|
|
497
|
-
# Inicializa Vault
|
|
498
|
-
root_token,
|
|
507
|
+
# Inicializa Vault (retorna root_token e unseal_key)
|
|
508
|
+
root_token, unseal_key = _initialize_vault(ctx, vault_ns, node_ip)
|
|
499
509
|
|
|
500
510
|
# Destrava Vault
|
|
501
|
-
_unseal_vault(ctx, vault_ns,
|
|
511
|
+
_unseal_vault(ctx, vault_ns, unseal_key)
|
|
502
512
|
|
|
503
513
|
# Configura Vault
|
|
504
514
|
_enable_kv_secrets(ctx, vault_ns, root_token)
|
|
505
|
-
_configure_kubernetes_auth(ctx, vault_ns, root_token)
|
|
506
515
|
|
|
507
516
|
# ========== External Secrets Operator ==========
|
|
508
517
|
typer.secho("\n== External Secrets Operator ==", fg=typer.colors.CYAN, bold=True)
|
|
@@ -570,8 +579,7 @@ resources:
|
|
|
570
579
|
if not ctx.dry_run:
|
|
571
580
|
_wait_for_pods_ready(ctx, eso_ns, "app.kubernetes.io/name=external-secrets", timeout=120)
|
|
572
581
|
|
|
573
|
-
#
|
|
574
|
-
_create_eso_policy_and_role(ctx, vault_ns, root_token, eso_ns)
|
|
582
|
+
# Cria ClusterSecretStore (usa tokenSecretRef, não precisa de Kubernetes auth)
|
|
575
583
|
_create_secretstore_example(ctx, vault_ns, eso_ns, node_ip)
|
|
576
584
|
_create_example_secret(ctx, vault_ns, root_token)
|
|
577
585
|
|
|
@@ -587,7 +595,7 @@ resources:
|
|
|
587
595
|
|
|
588
596
|
typer.echo("\n2. Criar ExternalSecret:")
|
|
589
597
|
typer.echo(" kubectl apply -f - <<EOF")
|
|
590
|
-
typer.echo(" apiVersion: external-secrets.io/
|
|
598
|
+
typer.echo(" apiVersion: external-secrets.io/v1")
|
|
591
599
|
typer.echo(" kind: ExternalSecret")
|
|
592
600
|
typer.echo(" metadata:")
|
|
593
601
|
typer.echo(" name: myapp-secret")
|
|
@@ -607,8 +615,14 @@ resources:
|
|
|
607
615
|
typer.echo("\n3. Secret será sincronizado automaticamente!")
|
|
608
616
|
typer.echo(" kubectl get secret myapp-secret -o yaml")
|
|
609
617
|
|
|
618
|
+
typer.secho("\n=== Recuperar Credenciais ===", fg=typer.colors.CYAN)
|
|
619
|
+
typer.echo("Via arquivo local:")
|
|
620
|
+
typer.echo(" cat /etc/vault/keys.json")
|
|
621
|
+
typer.echo("\nVia Kubernetes Secret:")
|
|
622
|
+
typer.echo(f" kubectl -n {vault_ns} get secret vault-init-credentials -o jsonpath='{{.data.root-token}}' | base64 -d")
|
|
623
|
+
typer.echo(f" kubectl -n {vault_ns} get secret vault-init-credentials -o jsonpath='{{.data.unseal-key}}' | base64 -d")
|
|
624
|
+
|
|
610
625
|
typer.secho("\n⚠️ IMPORTANTE:", fg=typer.colors.YELLOW, bold=True)
|
|
611
|
-
typer.echo(
|
|
612
|
-
typer.echo("-
|
|
613
|
-
typer.echo("- Após reboot do Vault, use: kubectl -n vault exec vault-0 -- vault operator unseal")
|
|
626
|
+
typer.echo("- Faça backup das credenciais em local seguro!")
|
|
627
|
+
typer.echo(f"- Após reboot do Vault, use: kubectl -n {vault_ns} exec vault-0 -- vault operator unseal <unseal-key>")
|
|
614
628
|
|
raijin_server/modules/velero.py
CHANGED
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
"""Backup e restore com Velero (production-ready)."""
|
|
2
2
|
|
|
3
3
|
import time
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import typer
|
|
6
7
|
|
|
7
8
|
from raijin_server.utils import ExecutionContext, ensure_tool, require_root, run_cmd
|
|
9
|
+
from raijin_server.minio_utils import get_or_create_minio_user
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _create_velero_credentials_file(ctx: ExecutionContext) -> str:
|
|
13
|
+
"""Cria arquivo de credenciais para Velero com usuário MinIO dedicado.
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
Caminho para o arquivo de credenciais
|
|
17
|
+
"""
|
|
18
|
+
typer.echo("\nConfigurando credenciais MinIO para Velero...")
|
|
19
|
+
|
|
20
|
+
# Cria usuário MinIO específico para Velero
|
|
21
|
+
access_key, secret_key = get_or_create_minio_user(
|
|
22
|
+
ctx=ctx,
|
|
23
|
+
app_name="velero",
|
|
24
|
+
buckets=["velero-backups"],
|
|
25
|
+
namespace="velero",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
# Cria arquivo de credenciais no formato esperado pelo Velero
|
|
29
|
+
credentials_path = Path("/etc/velero/credentials")
|
|
30
|
+
credentials_path.parent.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
|
|
32
|
+
credentials_content = f"""[default]
|
|
33
|
+
aws_access_key_id = {access_key}
|
|
34
|
+
aws_secret_access_key = {secret_key}
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
if not ctx.dry_run:
|
|
38
|
+
credentials_path.write_text(credentials_content)
|
|
39
|
+
# Protege o arquivo
|
|
40
|
+
credentials_path.chmod(0o600)
|
|
41
|
+
typer.secho(f" ✓ Credenciais salvas em {credentials_path}", fg=typer.colors.GREEN)
|
|
42
|
+
|
|
43
|
+
return str(credentials_path)
|
|
8
44
|
|
|
9
45
|
|
|
10
46
|
def _check_existing_velero(ctx: ExecutionContext) -> bool:
|
|
@@ -91,8 +127,19 @@ def run(ctx: ExecutionContext) -> None:
|
|
|
91
127
|
provider = typer.prompt("Provider (aws, azure, gcp)", default="aws")
|
|
92
128
|
bucket = typer.prompt("Bucket para backups", default="velero-backups")
|
|
93
129
|
region = typer.prompt("Region", default="us-east-1")
|
|
94
|
-
s3_url = typer.prompt("S3 URL (para MinIO usar http://minio.minio.svc:9000)", default="
|
|
95
|
-
|
|
130
|
+
s3_url = typer.prompt("S3 URL (para MinIO usar http://minio.minio.svc:9000)", default="http://minio.minio.svc:9000")
|
|
131
|
+
|
|
132
|
+
# Cria credenciais automaticamente usando usuário MinIO dedicado
|
|
133
|
+
use_auto_credentials = typer.confirm(
|
|
134
|
+
"Criar credenciais MinIO automaticamente (usuário dedicado)?",
|
|
135
|
+
default=True,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
if use_auto_credentials:
|
|
139
|
+
secret_file = _create_velero_credentials_file(ctx)
|
|
140
|
+
else:
|
|
141
|
+
secret_file = typer.prompt("Arquivo de credenciais (secret-file)", default="/etc/velero/credentials")
|
|
142
|
+
|
|
96
143
|
use_restic = typer.confirm("Habilitar Restic/Kopia para backups de PV?", default=True)
|
|
97
144
|
schedule = typer.prompt("Schedule cron para backups (ex: '0 2 * * *')", default="0 2 * * *")
|
|
98
145
|
|
raijin_server/validators.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
raijin_server/__init__.py,sha256=
|
|
2
|
-
raijin_server/cli.py,sha256=
|
|
1
|
+
raijin_server/__init__.py,sha256=IWpKGUd_KknUfa2XJ_Xu7M_xVWCdNyixW7AMO96xWkY,94
|
|
2
|
+
raijin_server/cli.py,sha256=WvZaPJ5AVjhzzs_jLLe2QGvVEH_VphRwnUkTMEgycbI,37320
|
|
3
3
|
raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
|
|
4
|
-
raijin_server/healthchecks.py,sha256=
|
|
4
|
+
raijin_server/healthchecks.py,sha256=UHSRyeKTsCGeL_4dxDSGZ1t8164Q7wYTi1c3ZiU0cro,13536
|
|
5
|
+
raijin_server/minio_utils.py,sha256=NQxIGoVf4-eM8rNwEHdd4QFnEIh2OxY3DyOiFkznsYs,18299
|
|
5
6
|
raijin_server/module_manager.py,sha256=Wmhj603CN0XGUVr7_Fo8CHzKd9yIbS9x5BJLqDj78kw,10259
|
|
6
7
|
raijin_server/utils.py,sha256=9RnGnPoUTYOpMVRLNa4P4lIQrJNQLkSkPUxycZRGv78,20827
|
|
7
|
-
raijin_server/validators.py,sha256=
|
|
8
|
-
raijin_server/modules/__init__.py,sha256=
|
|
9
|
-
raijin_server/modules/apokolips_demo.py,sha256=8ltsXRbVDwlDwLMIvh02NG-FeAfBWw_v6lh7IGOyNqs,13725
|
|
8
|
+
raijin_server/validators.py,sha256=LvxAIq7F8CSIihdfCCDlDtVd6WPBBntiBHuD8fuM2kg,11713
|
|
9
|
+
raijin_server/modules/__init__.py,sha256=UOv7c7UpxZq-JRZM0i55LGfI3LyucZhTL4lypeHs2Jw,858
|
|
10
10
|
raijin_server/modules/bootstrap.py,sha256=oVIGNRW_JbgY8zXNHGAIP0vGbbHNHyQexthxo5zhbcw,9762
|
|
11
11
|
raijin_server/modules/calico.py,sha256=TTPF1bLFdAKb3IVOqFqRxNblULkRmMMRylsIBp4w8I8,6700
|
|
12
12
|
raijin_server/modules/cert_manager.py,sha256=XkFlXJjiP4_9It_PJaFcVYMS-QKTzzFAt839QQ9qNsg,50223
|
|
@@ -14,7 +14,7 @@ raijin_server/modules/essentials.py,sha256=2xUXCyCQtFGd2DnCKV81N1R6bEJqH8zaet8mL
|
|
|
14
14
|
raijin_server/modules/firewall.py,sha256=h6AISqiZeTinVT7BjmQIS872qRAFZJLg7meqlth3cfw,757
|
|
15
15
|
raijin_server/modules/full_install.py,sha256=M4SV4OA-r41xhpMmZQvUieRugiq0faLa4f0N499ksd4,15035
|
|
16
16
|
raijin_server/modules/grafana.py,sha256=8YbKG-UL19lwTkH1-ZxpUetOZd-CLI4_kPsuZblNaWI,18080
|
|
17
|
-
raijin_server/modules/harbor.py,sha256=
|
|
17
|
+
raijin_server/modules/harbor.py,sha256=hFD8x5K4m0unzVBiDOT_yBzDDfbuPW_2SNVrjSCXhGc,21324
|
|
18
18
|
raijin_server/modules/hardening.py,sha256=4hz3ifkMhPlXa2n7gPxN0gitQgzALZ-073vuU3LM4RI,1616
|
|
19
19
|
raijin_server/modules/harness.py,sha256=uWTxTVJlY_VB6xi4ftMtTSaIb96HA8WJQS-RbyxU45M,5391
|
|
20
20
|
raijin_server/modules/internal_dns.py,sha256=Jynngq0TEEUo3jkAR4m8F1ihF10rkQuKHVP-gZYyDFY,15191
|
|
@@ -28,10 +28,10 @@ raijin_server/modules/minio.py,sha256=ZoxugJvvuGLzViDfEzrVCRZUevoiFwcEy0PNyn0My4
|
|
|
28
28
|
raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
|
|
29
29
|
raijin_server/modules/prometheus.py,sha256=lyhaqLIfMl0GtQ2b2Hre7_A47HrHBB5gspmnWtwXZ4Y,21880
|
|
30
30
|
raijin_server/modules/sanitize.py,sha256=_RnWn1DUuNrzx3NnKEbMvf5iicgjiN_ubwT59e0rYWY,6040
|
|
31
|
-
raijin_server/modules/secrets.py,sha256=
|
|
31
|
+
raijin_server/modules/secrets.py,sha256=3QzvFd4qH1hyOtbu3Cxyu4JUaYgWssxI-oZ4gS3HIP4,19924
|
|
32
32
|
raijin_server/modules/ssh_hardening.py,sha256=Zd0dlylUBr01SkrI1CS05-0DB9xIto5rWH1bUVs80ow,5422
|
|
33
33
|
raijin_server/modules/traefik.py,sha256=omziywss4o-8t64Kj-upLqbXdFYm2JwqOoOukDUmqxY,5008
|
|
34
|
-
raijin_server/modules/velero.py,sha256=
|
|
34
|
+
raijin_server/modules/velero.py,sha256=nH7WI145OOK-DZo_ZjNegEnwkppi8h98DeQaB5A_kVg,7161
|
|
35
35
|
raijin_server/modules/vpn.py,sha256=qWyROiHx2-FzMqhfpmzslrdfRBTewd53ylUq90wR7SQ,9149
|
|
36
36
|
raijin_server/modules/vpn_client.py,sha256=SjWzSQKLSJCpjz7Y1i1dFaNfPOVIQXFwgD9uM3GYaIY,30035
|
|
37
37
|
raijin_server/scripts/__init__.py,sha256=deduGfHf8BMVWred4ux5LfBDT2NJ5XYeJAt2sDEU4qs,53
|
|
@@ -39,9 +39,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
|
|
|
39
39
|
raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
|
|
40
40
|
raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
|
|
41
41
|
raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
|
|
42
|
-
raijin_server-0.3.
|
|
43
|
-
raijin_server-0.3.
|
|
44
|
-
raijin_server-0.3.
|
|
45
|
-
raijin_server-0.3.
|
|
46
|
-
raijin_server-0.3.
|
|
47
|
-
raijin_server-0.3.
|
|
42
|
+
raijin_server-0.3.8.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
|
|
43
|
+
raijin_server-0.3.8.dist-info/METADATA,sha256=5QdtvUtfp7Qq_OaevRKA2WoU7i6NViAOG58h3wI5vmw,8829
|
|
44
|
+
raijin_server-0.3.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
45
|
+
raijin_server-0.3.8.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
|
|
46
|
+
raijin_server-0.3.8.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
|
|
47
|
+
raijin_server-0.3.8.dist-info/RECORD,,
|