feat(conga,dev): worker and scheduler reports, summer dev runs serve

- queue:work and schedule:run print a startup summary and a shutdown
  report on a terminal, log them as records otherwise, and return nil
  after a clean stop
- schedule:run --once ends with 'Ran N due entries (M failed)'
- summer dev runs bin/<app> serve with the forwarded global options,
  reports through Output, stops the old server before starting the new
  one and prints a dev report on Ctrl+C (exit 0)
- lagoon.DatabaseLabel describes a DSN without its secrets
- Long help and examples for queue:work, schedule:run, dev, docs:serve
This commit is contained in:
Jakub Zych
2026-10-21 13:04:27 +02:00
parent c38dc1fe48
commit 168d65cd1b
15 changed files with 319 additions and 81 deletions

View File

@@ -18,7 +18,6 @@ import (
"git.golem15.com/golem15/summercms/modules/diary"
"git.golem15.com/golem15/summercms/modules/lagoon"
"git.golem15.com/golem15/summercms/modules/party"
"github.com/jackc/pgx/v5/pgconn"
)
// serveLog is the logger of serve's startup summary and shutdown report.
@@ -108,7 +107,7 @@ func buildFacts(app *backpack.App, in factInputs) summaryFacts {
Environment: "unknown",
Addr: in.addr,
URL: serveURL(in.addr),
Database: databaseFact(configString(app, "database.dsn")),
Database: lagoon.DatabaseLabel(configString(app, "database.dsn")),
Pending: len(in.pending),
MigrateCmd: in.bin + " migrate",
Mail: driverFact(app, "mail.driver", "memory"),
@@ -155,31 +154,6 @@ func driverFact(app *backpack.App, key, def string) string {
return def
}
// databaseFact is host:port/name parsed from dsn with pgconn.ParseConfig,
// never the user or password. A DSN that does not parse is "configured",
// an empty one "not configured".
func databaseFact(dsn string) string {
dsn = strings.TrimSpace(dsn)
if dsn == "" {
return "not configured"
}
cfg, err := pgconn.ParseConfig(dsn)
if err != nil || cfg.Host == "" {
return "configured"
}
host := cfg.Host
if strings.HasPrefix(host, "/") {
host = "socket " + host
} else if strings.Contains(host, ":") {
host = "[" + host + "]"
}
fact := host + ":" + strconv.Itoa(int(cfg.Port))
if cfg.Database != "" {
fact += "/" + cfg.Database
}
return fact
}
// migrations is the migration line: "up to date", "N pending — run ..." or
// "unknown".
func (f summaryFacts) migrations() (string, bool) {