This commit resolves duplicate key errors that occur when multiple monitors
attempt to insert statistics simultaneously into stat_* tables.
The fix addresses three interconnected issues:
1. **Circular Dependency Resolution**: database.js imports UptimeCalculator at
module level, but UptimeCalculator needs Database.dbConfig. Fixed by using
local imports in UptimeCalculator methods to ensure Database.dbConfig is
properly initialized when accessed.
2. **Database Configuration Initialization**: Database.dbConfig was not set
in the catch block when db-config.json is missing, causing undefined access
errors. Fixed by ensuring Database.dbConfig is always set.
3. **Schema Column Naming Mismatch**: RedBean ORM uses camelCase (pingMin/pingMax)
but Knex migrations create snake_case columns (ping_min/ping_max). Fixed by
using correct snake_case column names in SQL queries.
4. **Atomic Upsert Operations**: Implemented database-specific upsert logic:
- SQLite: INSERT ... ON CONFLICT DO UPDATE
- MariaDB: INSERT ... ON DUPLICATE KEY UPDATE
The solution maintains backward compatibility by falling back to R.store()
when upsert fails, ensuring no data loss while eliminating race conditions
for users with many monitors (200+).
Fixes#5357
* feat: Add timeoutMs field
* chore: Update Languages (incl. ko-KR)
* Revert "chore: Update Languages (incl. ko-KR)"
This reverts commit 349331a00b.
* chore: Update ko-KR selectively
* chore: Update en selectively
* Merge manually
* Reorder and show only if http related monitors
* fix: Update Korean translation
* fix: Rename timeoutMs to timeout, rename label, make DOUBLE
* fix: Change minimum step to 0.1, matching DOUBLE type
* Put the sql patch at the end
* Update EditMonitor.vue
* Colocate timeout with retry, fix clampTimeout logic, show default on 0
* Update src/pages/EditMonitor.vue to remove a comment
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* Fix merge issue
* Update the timeout value while finished editing the interval value
---------
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* ✨ feat: json-query monitor added
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: import warning error
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: br tag and remove comment
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: supporting compare string with other types
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: switch to a better lib for json query
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: better description on json query and using `v-html` in jsonQueryDescription element to fix `a` tags
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: result variable in error message
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: typos in json query description
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* 📝 docs: `HTTP(s) Json Query` added to monitor list in `README.md`
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
* 🐛 fix: needed white space in `README.md`
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* Nostr dm notifications (#3051)
* Add nostr DM notification provider
* require crypto for node 18 compatibility
* remove whitespace
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* move closer to where it is used
* simplify success or failure logic
* don't clobber the non-alert msg
* Update server/notification-providers/nostr.js
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* polyfills required for node <= 18
* resolve linter warnings
* missing comma
---------
Co-authored-by: Frank Elsinga <frank@elsinga.de>
* Drop nostr
* Rebuild package-lock.json
* Lint
---------
Signed-off-by: Muhammed Hussein Karimi <info@karimi.dev>
Co-authored-by: Frank Elsinga <frank@elsinga.de>
Co-authored-by: zappityzap <128872140+zappityzap@users.noreply.github.com>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>