Instalar o Tatuzim Server

Este guia cobre o setup detalhado do hub (Tatuzim Server + step-ca) em containers. Pra um passo a passo mais condensado, ver Inicio Rapido.

Requisitos

  • Linux (Ubuntu 24.04+ ou Debian 12+)
  • Docker 24.0+ + Docker Compose v2.x
  • jq (apt install jq)
  • Dominio publico apontando pro host (ex: tatuzim.dev.borlot.com.br)
  • Reverse proxy com Let's Encrypt (Traefik, Caddy, nginx + acme.sh)

1. Clone do repo

git clone https://github.com/devborlot/tatuzim
cd tatuzim

2. Configurar `.env`

cat > .env << 'EOF'
# Senha do step-ca (gera root + intermediate)
STEP_CA_PASSWORD=COLOQUE-UMA-SENHA-FORTE-AQUI

# Passphrase do vault Tatuzim (Argon2id KDF)
TATUZIM_MASTER_PASSPHRASE=COLOQUE-OUTRA-SENHA-FORTE-AQUI
EOF
chmod 600 .env

Importante: guarde essas duas senhas em password manager. Sem elas, voce perde o vault.

3. Subir step-ca primeiro

step-ca precisa estar rodando antes do Tatuzim Server (que vai pedir certs pra ele).

docker compose up -d step-ca
sleep 10

# Verificar
docker logs dev_stepca_tatuzim | tail
curl -sk https://localhost:9000/health
# Esperado: {"status":"ok"}

4. Capturar provisioner JWK

O Tatuzim Server precisa assinar tokens (OTT) que o step-ca aceita. Pra isso usa o JWK do provisioner:

PROV_KID=$(docker exec dev_stepca_tatuzim step ca provisioner list | jq -r '.[0].key.kid')
ENC_KEY=$(docker exec dev_stepca_tatuzim step ca provisioner list | jq -r '.[0].encryptedKey')
PROV_KEY=$(docker exec -i dev_stepca_tatuzim sh -c \
    "echo '$ENC_KEY' | step crypto jwe decrypt --password-file /run/secrets/ca_password")

# Adiciona ao .env
echo "TATUZIM_STEPCA_PROVISIONER_KID=$PROV_KID" >> .env
echo "TATUZIM_STEPCA_PROVISIONER_KEY=$(echo "$PROV_KEY" | jq -c .)" >> .env

echo "OK — kid: $PROV_KID"

5. Extrair root CA

mkdir -p certs
docker exec dev_stepca_tatuzim cat /home/step/certs/root_ca.crt > certs/root_ca.pem
chmod 0644 certs/root_ca.pem

Esse certs/root_ca.pem:

  • Sera montado no container do Tatuzim Server (pra confiar no step-ca via HTTPS)
  • Sera distribuido pros agents (pra confiar no server mTLS) — copia pra /etc/tatuzim-agent/stepca-root.pem em cada VPS

6. Editar `docker-compose.yml` (CN do server + Traefik)

O server precisa do CN correto pra auto-bootstrap do TLS cert:

environment:
  - TATUZIM_SERVER_CN=tatuzim.dev.borlot.com.br   # <-- seu dominio

E o Traefik label aponta pro mesmo dominio:

labels:
  - "traefik.http.routers.tatuzim_enroll.rule=Host(`tatuzim.dev.borlot.com.br`)"

Tambem confirme que a porta 8443 (mTLS) esta exposta:

ports:
  - "8443:8443"

7. Subir o Tatuzim Server

docker compose up -d tatuzim-server
docker logs -f dev_tatuzim_server

Saida esperada:

[entrypoint] Vault not initialized at /var/lib/tatuzim, running init...
Vault initialized at /var/lib/tatuzim
[entrypoint] Starting tatuzim-server...
INFO tatuzim_server: vault unsealed
INFO tatuzim_server: schema verified
INFO tatuzim_server: stepca client ready
INFO tatuzim_server::server_identity: requesting fresh server cert from step-ca cn=tatuzim.dev.borlot.com.br
INFO tatuzim_server::server_identity: server cert saved path=/var/lib/tatuzim/server.crt
INFO tatuzim_server: health endpoint listening addr=0.0.0.0:8080
INFO tatuzim_server: enroll endpoint listening addr=0.0.0.0:8444
INFO tatuzim_server: mTLS endpoint listening (strict) addr=0.0.0.0:8443

8. Validar publicamente

Health (via Traefik)

# Enroll endpoint exposto via Traefik
curl -X POST https://tatuzim.dev.borlot.com.br/v1/enroll -d '{}'
# Esperado: {"error":"token_not_found"} (HTTP 401)

mTLS (porta 8443 direta)

# Verifica que server apresenta cert do step-ca
echo | openssl s_client -connect tatuzim.dev.borlot.com.br:8443 \
    -servername tatuzim.dev.borlot.com.br 2>/dev/null | \
    openssl x509 -noout -subject -issuer

Esperado:

subject=CN=tatuzim.dev.borlot.com.br
issuer=O=Tatuzim Dev CA, CN=Tatuzim Dev CA Intermediate CA

9. Backup do vault

Apos o setup, faca backup do vault:

docker exec dev_tatuzim_server tar czf - /var/lib/tatuzim/config.json /var/lib/tatuzim/db.enc \
    > tatuzim-vault-backup-$(date +%Y%m%d).tgz
gpg --symmetric tatuzim-vault-backup-*.tgz  # opcional, mas recomendado

Sem config.json + db.enc + passphrase mestra, voce nao consegue recuperar.

Ver Backup & Recovery pra detalhes.

Producao vs Dev

Aspecto Dev Producao
Passphrase em .env OK Pref. systemd-creds ou keyring
Step-ca root CA online OK Mover root pra USB/HSM apos init
Traefik wildcard cert OK Idem
Porta 8443 exposta na internet OK Pref. so via WireGuard
docker-compose.yml rodado manualmente OK systemd unit + auto-restart

Proximos passos

By Borlot.com.br on 23/05/2026