Início rápido¶
Este guia leva um banco Postgres que já roda no seu cluster de nenhum backup a uma restauração testada em cerca de dez
minutos. Você precisa de acesso kubectl e helm ao cluster, de um bucket compatível com S3 com credenciais e do
age na sua máquina.
Sem um cluster à mão?
Primeiro experimente o console e a CLI com um servidor de demonstração: um comando, sem Kubernetes, sem banco de dados.
1. Instalar o Tenax¶
helm install tenax oci://registry.example.com/helm/tenax --version 0.1.0 \
-n tenax-system --create-namespace \
--set image.repository=registry.example.com/tenax/tenax --set image.tag=v0.1.0 \
--set 'targetNamespaces={team-a}' \
--set examplePolicies.enabled=true --set examplePolicies.store=main
targetNamespaces lista os namespaces cujos bancos o Tenax protege; lá o Tenax recebe um Role para ler os secrets
de credenciais tenax-* e nada mais. examplePolicies cria as políticas compartilhadas prod, dev e
critical. Todos os valores estão descritos em Valores do Helm.
2. Chaves e o bucket¶
Gere o par de chaves que criptografa todos os backups. Guarde uma cópia offline de tenax-backups.key: sem ela
nenhum backup pode ser restaurado.
age-keygen -o tenax-backups.key # prints "Public key: age1…"
kubectl -n tenax-system create secret generic tenax-age-identity \
--from-literal=identity="$(grep AGE-SECRET-KEY tenax-backups.key)"
kubectl -n tenax-system create secret generic tenax-s3 \
--from-literal=accessKeyId=AKIA… --from-literal=secretAccessKey=…
apiVersion: tenax.run/v1alpha1
kind: BackupStore
metadata:
name: main
spec:
s3:
endpoint: https://s3.us-east-1.amazonaws.com
region: us-east-1
bucket: db-backups
credentialsSecret: { namespace: tenax-system, name: tenax-s3 }
encryption:
ageRecipients: [age1qxyz…] # the public key from age-keygen
identitySecret: { namespace: tenax-system, name: tenax-age-identity }
kubectl apply -f store.yaml e depois kubectl get backupstores: main fica Ready assim que o Tenax alcança o
bucket e as chaves são lidas corretamente.
3. O usuário do banco¶
O Tenax se conecta com um único usuário, tenax. Crie-o com o SQL de Usuários do banco e
depois guarde a senha dele ao lado do banco:
kubectl -n team-a create secret generic tenax-postgres --from-literal=username=tenax --from-literal=password=…
Para restaurar qualquer segundo, permita também que ele faça replicação: adicione
host replication tenax all scram-sha-256 ao pg_hba.conf e recarregue. Você pode fazer isso depois. Até lá o
Tenax faz backups lógicos e a condição Replication dele diz o que adicionar.
4. Declarar o alvo¶
apiVersion: tenax.run/v1alpha1
kind: BackupTarget
metadata:
name: app
namespace: team-a
labels:
tenax.run/org: acme
tenax.run/project: shop
tenax.run/env: prod
spec:
engine: postgres
endpoint: { host: postgres, port: 5432 }
databases: [app]
policy: prod # nightly fulls, 7-day point-in-time window
credentials:
secretRef: { name: tenax-postgres }
checks:
- name: orders-not-empty
database: app
sql: select count(*) > 0 from orders
Em até um minuto o Tenax inicia um streamer para o alvo e faz o primeiro backup completo por conta própria
(motivo chain-restart). Se o usuário ainda não puder fazer replicação, o alvo mostra Replication=False com a
correção, e os backups são lógicos até você aplicá-la:
5. Restaurar, de propósito¶
tenax login --server https://tenax.example.com # or TENAX_SERVER + port-forward, see Console, CLI and access
tenax targets
tenax restore team-a/app --at "$(date -u -d '-10 min' +%FT%TZ)" --wait
tenax query <sandbox> -e "select count(*) from orders"
A restauração executa suas checagens antes de reportar sucesso. O sandbox se exclui sozinho quando o TTL expira. Próximos passos:
- Backups e a janela de restauração explica o que é a janela e o que a mantém sem lacunas.
- Verificação transforma este teste manual em um teste semanal com alertas.
- Monitoramento configura os alertas e o dashboard.