Pular para conteúdo

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=…
store.yaml
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

target.yaml
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:

kubectl -n team-a get backuptargets,backups

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: