fix(tls): sem watcher nao ha veredito, e o README passa a explicar os modos

Com TLS_MODE=acme o certificado e emitido por este servico, nao vigiado em
disco, portanto nao ha watcher para estar saudavel. O painel reportava false e
mostrava "indisponivel" em permanencia, ao lado de um certificado perfeitamente
valido. Passa a ser null, e a pagina nao mostra veredito nenhum.

O README ganha uma seccao sobre os dois modos de certificado. O modo traefik
falha de duas maneiras silenciosas -- sem router para o PRIMARY_MAIL_HOST o
nome nunca chega ao acme.json, e o acme.json fica em 600 do root, ilegivel para
o utilizador nao-root do contentor. Nos dois casos o HTTPS continua a funcionar
porque quem o serve e o proxy, enquanto as portas de correio caem no
autoassinado e sao recusadas por qualquer cliente que verifique. Foi
exactamente o que aconteceu nesta instalacao.

Actualizado tambem o que ja nao esta por acabar: a resposta de ausencia, a
assinatura e as regras Sieve sao consumidas, e a reconciliacao de DNS conduz o
estado em vez de o relatar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Opus 5 committed 2026-08-24 11:59:11 -03:00
1 parent 1e7c6a118c
commit 7f8d9b7ff1
7 files changed
+119 -29

No files matched your search

+2 -1
View File
@@ -161,7 +161,8 @@
"search": "Search",
"status": "Status",
"unavailable": "Unavailable",
"userPortal": "Webmail"
"userPortal": "Webmail",
"notApplicable": "Not applicable"
},
"errors": {
"forbidden": "You do not have access to this",
+2 -1
View File
@@ -161,7 +161,8 @@
"search": "Buscar",
"status": "Estado",
"unavailable": "No disponible",
"userPortal": "Webmail"
"userPortal": "Webmail",
"notApplicable": "No aplicable"
},
"errors": {
"forbidden": "No tiene acceso a esto",
+2 -1
View File
@@ -161,7 +161,8 @@
"search": "Buscar",
"status": "Status",
"unavailable": "Indisponível",
"userPortal": "Webmail"
"userPortal": "Webmail",
"notApplicable": "Nao aplicavel"
},
"errors": {
"forbidden": "Você não tem acesso a isto",
@@ -318,12 +318,23 @@ export default function AdminSecurityPage() {
<div className="flex flex-col gap-1 rounded-xl bg-dark-card p-3.5 shadow-edge">
<div className="text-xs text-slate-400">{t("admin.watcherHealthy")}</div>
{/* Null means there is no watcher to judge - the certificate
is issued by this server rather than read from disk - so no
verdict is shown instead of a standing false alarm. */}
<div
className={`text-[15px] font-medium ${
tlsStatus.watcher_healthy ? "text-indigo-400" : "text-amber-400"
tlsStatus.watcher_healthy === null || tlsStatus.watcher_healthy === undefined
? "text-slate-400"
: tlsStatus.watcher_healthy
? "text-indigo-400"
: "text-amber-400"
}`}
>
{tlsStatus.watcher_healthy ? t("ui.healthy") : t("common.unavailable")}
{tlsStatus.watcher_healthy === null || tlsStatus.watcher_healthy === undefined
? t("common.notApplicable")
: tlsStatus.watcher_healthy
? t("ui.healthy")
: t("common.unavailable")}
</div>
<div className="text-[11.5px] text-slate-500">
{t("admin.lastReload")}:{" "}