backup: no full backup holds the Postfix queue
Owner, 2026-10-11: the queue goes out of the command's archive too. The commit that made the panel's backup work left the queue in the archive of selfpost-backup, which runs as root and can read it. But that copy was never the queue: the archive is made while the instance runs, Postfix moves messages between the queue's directories all the time, and a message on its way could be in the archive twice or not at all. One rule now - QueueDir is left out of every archive - and Params.Unprivileged is only about a certs/ file the panel may not open. What is not carried over is mail still waiting for delivery; a restored instance builds an empty queue (the e2e restore scenario starts one). To keep the queue: stop the instance and tar the project directory, as the guide's methods 3 and 4 already describe. Guide: the description of a full backup, methods 1 and 2 and the comparison table. Help follows the design commit before this one. go vet ./internal/backup/: ok go test ./internal/backup/ ./cmd/... ./internal/web/...: ok Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -112,7 +112,6 @@ func TestCreateIncludesStateExcludesTransient(t *testing.T) {
|
||||
DataArchivePrefix + "opendkim/keys/example.com/selfpost.private",
|
||||
DataArchivePrefix + "sasl/sasldb2",
|
||||
DataArchivePrefix + "postfix/sender_login_maps",
|
||||
DataArchivePrefix + "postfix/queue/deferred/sample",
|
||||
ComposeFileName,
|
||||
EnvFileName,
|
||||
CertsDirName + "/fullchain.pem",
|
||||
@@ -129,6 +128,7 @@ func TestCreateIncludesStateExcludesTransient(t *testing.T) {
|
||||
DataArchivePrefix + "selfpost.db-shm",
|
||||
DataArchivePrefix + "log/mail.log",
|
||||
DataArchivePrefix + "log/mail.log.1",
|
||||
DataArchivePrefix + "postfix/queue/deferred/sample",
|
||||
} {
|
||||
if _, ok := files[name]; ok {
|
||||
t.Errorf("archive should not contain %s", name)
|
||||
@@ -236,8 +236,8 @@ func TestCheckRestoreWrongFormatRejected(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// The panel's archive: no Postfix queue, everything else as before, and Check
|
||||
// agrees that it can be made.
|
||||
// The panel's archive: like any other it has no Postfix queue, the rest is
|
||||
// there, and Check agrees that it can be made.
|
||||
func TestCreateUnprivilegedLeavesTheQueueOut(t *testing.T) {
|
||||
dataDir, dbPath, deployRoot := seedDataDir(t)
|
||||
p := Params{DataDir: dataDir, DBPath: dbPath, Version: "1.2.3", DeployRoot: deployRoot, Unprivileged: true}
|
||||
|
||||
Reference in New Issue
Block a user