Produção e Operação
Objetivo
Preparar o ambiente para deploy em produção com segurança e monitoramento.
Checklist de Produção
Docker Compose para Produção
# docker-compose.prod.yml
version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: inji-verify-db
restart: always
environment:
POSTGRES_DB: inji_verify
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- "127.0.0.1:5432:5432" # Apenas localhost
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d inji_verify"]
interval: 5s
timeout: 5s
retries: 10
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
inji-verify-service:
image: injistack/inji-verify-service:0.17.0
container_name: inji-verify-service
restart: always
ports:
- "127.0.0.1:8080:8080" # Apenas localhost — Nginx faz o proxy
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_NAME: inji_verify
DATABASE_SCHEMA: public
DATABASE_USERNAME: ${DB_USER}
DATABASE_PASSWORD: ${DB_PASSWORD}
INJI_VP_SUBMISSION_BASE_URL: https://verify.seu-dominio.com.br/v1/verify
INJI_DID_VERIFY_URI: did:web:verify.seu-dominio.com.br:v1:verify
INJI_DID_VERIFY_PUBLIC_KEY_URI: did:web:verify.seu-dominio.com.br:v1:verify#key-0
SPRING_JPA_HIBERNATE_DDL_AUTO: update
MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: "*"
MANAGEMENT_ENDPOINT_MAPPINGS_ENABLED: "true"
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
deploy:
resources:
limits:
memory: 2G
cpus: '2'
volumes:
pgdata:
Importante
Note 127.0.0.1:8080:8080 e 127.0.0.1:5432:5432 — isso garante que ambos os serviços só aceitam conexões locais. O Nginx faz o proxy HTTPS para o mundo externo.
Nginx como Reverse Proxy
# /etc/nginx/sites-available/verificaidade
server {
listen 443 ssl;
server_name verify.seu-dominio.com.br;
ssl_certificate /etc/letsencrypt/live/verify.seu-dominio.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/verify.seu-dominio.com.br/privkey.pem;
# INJI Verify Service
location /v1/verify/ {
proxy_pass http://localhost:8080/v1/verify/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Long-polling precisa de timeout maior
proxy_read_timeout 60s;
}
}
server {
listen 80;
server_name verify.seu-dominio.com.br;
return 301 https://$server_name$request_uri;
}
sudo ln -s /etc/nginx/sites-available/verificaidade /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxCertificado SSL com Let’s Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d verify.seu-dominio.com.brMonitoramento
Health Check
curl -s https://verify.seu-dominio.com.br/v1/verify/actuator/healthScript de monitoramento
#!/bin/bash
# monitor.sh — executar via cron a cada minuto
HEALTH=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/v1/verify/actuator/health)
if [ "$HEALTH" != "200" ]; then
echo "$(date) ALERTA: INJI Verify Service indisponível (HTTP $HEALTH)" \
>> /var/log/verificaidade-monitor.log
fi# Adicionar ao cron
crontab -e
# * * * * * /home/ubuntu/monitor.shBackup do PostgreSQL
#!/bin/bash
# backup-db.sh
BACKUP_DIR=/home/ubuntu/backups
mkdir -p $BACKUP_DIR
docker exec inji-verify-db pg_dump -U ${DB_USER} inji_verify \
| gzip > $BACKUP_DIR/inji_verify_$(date +%Y%m%d_%H%M%S).sql.gz
# Manter apenas últimos 7 dias
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -deleteAtualização do Service
cd ~/verificaidade
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
curl -s http://localhost:8080/v1/verify/actuator/health
Aviso
Teste atualizações em ambiente de homologação antes de aplicar em produção.
Próximo passo
Consulte a API Reference para detalhes dos endpoints.