bullpane 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  ```sh
6
6
  npx bullpane --redis redis://localhost:6379
7
+ # or, for BullMQ 6's Postgres backend
8
+ npx bullpane --postgres postgres://user:pass@localhost:5432/app
7
9
  ```
8
10
 
9
11
  Open <http://localhost:3000>. That is the whole install: no database to set up, no account, no login.
@@ -14,24 +16,26 @@ Open <http://localhost:3000>. That is the whole install: no database to set up,
14
16
 
15
17
  ## What you get
16
18
 
17
- - Every queue on a Redis, with counts, success rate and what needs attention.
19
+ - Every queue on a Redis, or in BullMQ 6's Postgres backend, with counts, success rate and what needs attention.
18
20
  - Jobs by state, search inside job data, job detail with data, return value, stack trace and logs.
19
21
  - Retry, promote, remove and bulk actions through the official `bullmq` API. Pause, resume, clean, drain.
20
22
  - Job schedulers, flows (parent/child trees), stalled jobs, Redis health.
21
23
  - BullMQ Pro groups: per-group concurrency, rate limits and paused groups.
22
24
  - Safe on a busy production Redis: no `KEYS`, one round trip per read, payloads truncated inside Redis.
23
25
 
24
- Works with BullMQ 4, 5 and 6 on Redis, Redis Cluster and Valkey, and with BullMQ Pro.
26
+ Works with BullMQ 4, 5 and 6 on Redis, Redis Cluster and Valkey, with BullMQ 6 on Postgres (behind PgBouncer too), and with BullMQ Pro.
25
27
 
26
28
  **Pro** (USD 39/month, one installation, unlimited users) adds login with roles, SSO, alerts to Slack or webhooks, folders, a flow graph, an audit log and an MCP server for Claude and other AI clients.
27
29
 
28
30
  ## Options
29
31
 
30
32
  ```
31
- npx bullpane [--redis <url>] [options]
33
+ npx bullpane [--redis <url> | --postgres <url>] [options]
32
34
 
33
35
  --redis <url> Redis your BullMQ workers use, added as a connection
34
36
  --prefix <prefix> BullMQ prefix of that connection (default: bull)
37
+ --postgres <url> Postgres of BullMQ 6's Postgres backend, added as a connection
38
+ --schema <schema> Schema of that connection (default: bullmq)
35
39
  --port <port> HTTP port (default: 3000)
36
40
  --host <host> Interface to listen on (default: 127.0.0.1)
37
41
  --data-dir <dir> Where the SQLite database lives (default: ~/.bullpane)
package/bin/bullpane.mjs CHANGED
@@ -18,12 +18,15 @@ const { version } = JSON.parse(readFileSync(path.join(root, "package.json"), "ut
18
18
  const HELP = `Bullpane ${version} — self-hosted dashboard for BullMQ and BullMQ Pro
19
19
 
20
20
  Usage
21
- npx bullpane [--redis <url>] [options]
21
+ npx bullpane [--redis <url> | --postgres <url>] [options]
22
22
 
23
23
  Options
24
24
  --redis <url> Redis your BullMQ workers use, added as a connection
25
25
  (e.g. redis://localhost:6379). More can be added in the UI.
26
26
  --prefix <prefix> BullMQ prefix of that connection (default: bull)
27
+ --postgres <url> Postgres of BullMQ 6's Postgres backend, added as a
28
+ connection (e.g. postgres://user:pass@localhost:5432/app)
29
+ --schema <schema> Schema BullMQ created its tables in (default: bullmq)
27
30
  --port <port> HTTP port (default: 3000, or $PORT)
28
31
  --host <host> Interface to listen on (default: 127.0.0.1). The free
29
32
  edition has no login: only use 0.0.0.0 on a private network.
@@ -41,6 +44,8 @@ try {
41
44
  options: {
42
45
  redis: { type: "string" },
43
46
  prefix: { type: "string" },
47
+ postgres: { type: "string" },
48
+ schema: { type: "string" },
44
49
  port: { type: "string" },
45
50
  host: { type: "string" },
46
51
  "data-dir": { type: "string" },
@@ -82,6 +87,28 @@ set("WEB_DIST", undefined, path.join(root, "web"));
82
87
  set("PUBLIC_URL", undefined, `http://localhost:${env.PORT}`);
83
88
  set("NODE_ENV", undefined, "production");
84
89
 
90
+ if (args.redis && args.postgres) {
91
+ console.error("--redis and --postgres are one connection each: pass one, add the other in the UI");
92
+ process.exit(2);
93
+ }
94
+
95
+ /** host:port, never the password */
96
+ const nameFrom = (url) => {
97
+ const u = new URL(url);
98
+ return `${u.hostname}${u.port ? `:${u.port}` : ""}`;
99
+ };
100
+
101
+ if (args.postgres) {
102
+ let name;
103
+ try {
104
+ name = nameFrom(args.postgres);
105
+ } catch {
106
+ console.error(`--postgres must be a URL like postgres://user:pass@localhost:5432/app`);
107
+ process.exit(2);
108
+ }
109
+ env.BULLPANE_CONNECTIONS = JSON.stringify([{ name, kind: "postgres", url: args.postgres, prefix: args.schema ?? "bullmq" }]);
110
+ }
111
+
85
112
  if (args.redis) {
86
113
  let name = "Redis";
87
114
  try {