feat(backup): prefix backup filenames with date and time (#5606)

* feat(backup): add YYYY-MM-DD_ date prefix to backup filenames

Refs #5584

* feat(backup): prefix backup filenames with date and time

* fix(backup): put host before date in backup filename

Backup filenames now read {host}_{date}{ext} (e.g. panel.example.com_2026-06-27_000000.db) instead of {date}_{host}{ext}, so files group by server first then sort chronologically within each server.
This commit is contained in:
Nikan Zeyaei
2026-06-27 13:38:20 +03:30
committed by GitHub
parent 4c177f0cf1
commit 1bad2fcba1
2 changed files with 47 additions and 7 deletions
+17 -7
View File
@@ -1298,18 +1298,28 @@ func (s *ServerService) GetDb() ([]byte, error) {
// BackupFilename returns the filename for a database backup, named after the
// panel's address so a downloaded or Telegram-sent backup identifies the server
// it came from. requestHost is the browser's address: the getDb handler passes
// c.Request.Host so a panel download is named after whatever address the user
// reached the panel with, no Listen Domain needed. The Telegram bot has no
// request and passes "", falling back to the configured Listen Domain (webDomain)
// and then the public IP. The extension is .dump on PostgreSQL and .db on SQLite;
// the base falls back to "x-ui" when no address is known.
// it came from, followed by the current date and time (_YYYY-MM-DD_HHMMSS) so
// files accumulated in Telegram chat history group by server then sort
// chronologically and same-day backups stay distinct. requestHost is the
// browser's address: the getDb handler passes c.Request.Host so a panel download
// is named after whatever address the user reached the panel with, no Listen
// Domain needed. The Telegram bot has no request and passes "", falling back to
// the configured Listen Domain (webDomain) and then the public IP. The extension
// is .dump on PostgreSQL and .db on SQLite; the base falls back to "x-ui" when
// no address is known.
func (s *ServerService) BackupFilename(requestHost string) string {
ext := ".db"
if database.IsPostgres() {
ext = ".dump"
}
return s.backupHost(requestHost) + ext
return s.backupHost(requestHost) + backupDateSuffix(time.Now()) + ext
}
// backupDateSuffix returns the _YYYY-MM-DD_HHMMSS chronological suffix appended
// after the host in backup filenames. Uses server-local time for consistency
// with the timestamp printed in the Telegram backup message body.
func backupDateSuffix(now time.Time) string {
return "_" + now.Format("2006-01-02_150405")
}
// backupHost picks the address used to name backup files: the browser's request