# docker/postgres/postgresql.conf — tuning PostgreSQL 18 (ADR-007/ADR-008)
# Sem porta publicada; só a rede interna do Compose.

listen_addresses = '*'

# PostgreSQL 18: I/O assíncrono por worker (io_method)
io_method = worker

# Memória (ajustar conforme o host; valores conservadores para 1 instância)
shared_buffers = 256MB
effective_cache_size = 768MB
work_mem = 8MB
maintenance_work_mem = 64MB

# Custo de I/O (SSD/NVMe)
random_page_cost = 1.1
effective_io_concurrency = 200

jit = on
track_io_timing = on

# ---------------------------------------------------------------- WAL (ADR-007)
# ADR-007 exige `wal_compression=on`, `max_wal_size` e `checkpoint_timeout` — os TRÊS
# faltavam. O WAL é o que o PITR (ADR-042) consome: sem `archive_command` ele não
# existia, e sem `max_wal_size`/`checkpoint_timeout` o checkpoint dispara por volume de
# WAL (com `archive_timeout = 300` do bloco PITR, o intervalo também é o tempo).
# `wal_compression = on` (pglz) reduz o volume do WAL — que é o custo de I/O do
# arquivamento. `max_wal_size` = 1 GB = 4× o `shared_buffers` (faixa usual: 1×–4×);
# `min_wal_size` = 128 MB é o piso recycled entre checkpoints.
# `checkpoint_completion_target = 0.9` espalha a escrita do checkpoint (o I/O termina
# aos 90% do intervalo, sem estourar o prazo) — o padrão (0.9) fica explícito.
wal_compression = on
max_wal_size = 1GB
min_wal_size = 128MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9

# Observabilidade (ADR-024)
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
log_min_duration_statement = 500ms
log_line_prefix = '%m [%p] %q%u@%d '

# ---------------------------------------------------------------- Diagnóstico (ADR-024)
# O log **técnico** do banco (ADR-024) responde às 4 perguntas que o `pg_stat_*` não
# responde: onde travou (lock wait), o que vazou para disco (temp file), como o
# checkpoint foi e quanto o autovacuum gastou. `log_connections`/`log_disconnections`
# ficam **fora**: são ruído (volume alto, informação redundante) e o volume de log na
# cota do WHM é um problema real (spec 17 / SK-10).
log_lock_waits = on
log_temp_files = 10MB
log_checkpoints = on
log_autovacuum_min_duration = 1s

timezone = 'America/Sao_Paulo'

# ---------------------------------------------------------------- PITR (F6.I2.T2)
# Recuperação pontual (ADR-042): o WAL é arquivado para poder restaurar o cluster até um instante
# exato — o backup lógico (`pg_dump`) volta ao início do dump, o WAL volta ao ponto do incidente.
# O arquivo fica **dentro do PGDATA** (mesma máquina) para funcionar em qualquer host sem volume
# extra; em produção aponte `archive_command`/`wal-g` para o storage S3 (ADR-030) — decisão de
# operação documentada em `wiki/runbooks/deploy-e-recuperacao.md` §3.
wal_level = replica
archive_mode = on
archive_timeout = 300
archive_command = 'mkdir -p "$PGDATA/wal_archive" && test ! -f "$PGDATA/wal_archive/%f" && cp %p "$PGDATA/wal_archive/%f"'
