mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-09-11 13:36:55 +08:00
Compare commits
4 Commits
improve-he
...
npm-publis
Author | SHA1 | Date | |
---|---|---|---|
|
e4aedeb7af | ||
|
642136780f | ||
|
80d5f6840b | ||
|
d76a515cbf |
@@ -1,3 +1,5 @@
|
||||
# Should be very similar to .npmignore, but the syntax is a bit different
|
||||
|
||||
/.idea
|
||||
/node_modules
|
||||
/data*
|
||||
@@ -12,9 +14,8 @@
|
||||
**/.gitignore
|
||||
**/docker-compose*
|
||||
**/[Dd]ockerfile*
|
||||
LICENSE
|
||||
README.md
|
||||
.editorconfig
|
||||
.vs
|
||||
.vscode
|
||||
.eslint*
|
||||
.stylelint*
|
||||
@@ -32,22 +33,15 @@ tsconfig.json
|
||||
/tmp
|
||||
/babel.config.js
|
||||
/ecosystem.config.js
|
||||
/extra/healthcheck.exe
|
||||
/extra/healthcheck
|
||||
extra/exe-builder
|
||||
/public
|
||||
|
||||
|
||||
### .gitignore content (commented rules are duplicated)
|
||||
|
||||
#node_modules
|
||||
.DS_Store
|
||||
#dist
|
||||
dist-ssr
|
||||
*.local
|
||||
#.idea
|
||||
|
||||
#/data
|
||||
#!/data/.gitkeep
|
||||
#.vscode
|
||||
|
||||
### End of .gitignore content
|
||||
# .dockerignore only, not in .npmignore
|
||||
/extra/healthcheck.exe
|
||||
/extra/healthcheck
|
||||
LICENSE
|
||||
README.md
|
||||
|
@@ -113,7 +113,7 @@ module.exports = {
|
||||
"error",
|
||||
{ "noOptionalParamNames": true }
|
||||
],
|
||||
"jsdoc/require-throws": "warn",
|
||||
"jsdoc/require-throws": "error",
|
||||
"jsdoc/require-jsdoc": [
|
||||
"error",
|
||||
{
|
||||
@@ -124,20 +124,19 @@ module.exports = {
|
||||
}
|
||||
],
|
||||
"jsdoc/no-blank-block-descriptions": "error",
|
||||
"jsdoc/require-returns-description": "warn",
|
||||
"jsdoc/require-returns-check": [
|
||||
"error",
|
||||
{ "reportMissingReturnForUndefinedTypes": false }
|
||||
],
|
||||
"jsdoc/require-returns": [
|
||||
"warn",
|
||||
"error",
|
||||
{
|
||||
"forceRequireReturn": true,
|
||||
"forceReturnsWithAsync": true
|
||||
}
|
||||
],
|
||||
"jsdoc/require-param-type": "warn",
|
||||
"jsdoc/require-param-description": "warn"
|
||||
"jsdoc/require-param-type": "error",
|
||||
"jsdoc/require-param-description": "error"
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
|
33
.github/workflows/auto-test.yml
vendored
33
.github/workflows/auto-test.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
paths-ignore:
|
||||
- '*.md'
|
||||
pull_request:
|
||||
branches: [ master, 2.0.X ]
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- '*.md'
|
||||
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ ARMv7 ]
|
||||
node: [ 14, 20 ]
|
||||
node: [ 14.21.3, 20.5.0 ]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
@@ -78,21 +78,20 @@ jobs:
|
||||
- run: npm install
|
||||
- run: npm run lint
|
||||
|
||||
# TODO: Temporarily disable, as it cannot pass the test in 2.0.0 yet
|
||||
# e2e-tests:
|
||||
# needs: [ check-linters ]
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - run: git config --global core.autocrlf false # Mainly for Windows
|
||||
# - uses: actions/checkout@v3
|
||||
#
|
||||
# - name: Use Node.js 14
|
||||
# uses: actions/setup-node@v3
|
||||
# with:
|
||||
# node-version: 14
|
||||
# - run: npm install
|
||||
# - run: npm run build
|
||||
# - run: npm run cy:test
|
||||
e2e-tests:
|
||||
needs: [ check-linters ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false # Mainly for Windows
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Use Node.js 14
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 14
|
||||
- run: npm install
|
||||
- run: npm run build
|
||||
- run: npm run cy:test
|
||||
|
||||
frontend-unit-tests:
|
||||
needs: [ check-linters ]
|
||||
|
3
.github/workflows/json-yaml-validate.yml
vendored
3
.github/workflows/json-yaml-validate.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: json-yaml-validate
|
||||
name: json-yaml-validate
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -6,7 +6,6 @@ on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 2.0.X
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
|
45
.npmignore
Normal file
45
.npmignore
Normal file
@@ -0,0 +1,45 @@
|
||||
# Should be very similar to .dockerignore, but the syntax is a bit different
|
||||
|
||||
/.idea
|
||||
/node_modules
|
||||
/data
|
||||
/cypress
|
||||
/out
|
||||
/test
|
||||
/kubernetes
|
||||
/.do
|
||||
/.dockerignore
|
||||
/private
|
||||
/.git
|
||||
/.gitignore
|
||||
/docker-compose*
|
||||
/[Dd]ockerfile*
|
||||
.editorconfig
|
||||
.vs
|
||||
.vscode
|
||||
.eslint*
|
||||
.stylelint*
|
||||
/.devcontainer
|
||||
/.github
|
||||
yarn.lock
|
||||
app.json
|
||||
CODE_OF_CONDUCT.md
|
||||
CONTRIBUTING.md
|
||||
CNAME
|
||||
install.sh
|
||||
SECURITY.md
|
||||
tsconfig.json
|
||||
.env
|
||||
/tmp
|
||||
/babel.config.js
|
||||
/ecosystem.config.js
|
||||
extra/exe-builder
|
||||
/public
|
||||
|
||||
.DS_Store
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
## .npmignore only, not in .dockerignore
|
||||
/docker
|
||||
/extra/healthcheck*
|
@@ -214,7 +214,7 @@ Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely,
|
||||
|
||||
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
|
||||
|
||||
If for security / bug / other reasons, a library must be updated, breaking changes need to be checked by the person proposing the change.
|
||||
If for maybe security reasons, a library must be updated. Then you must need to check if there are any breaking changes.
|
||||
|
||||
## Translations
|
||||
|
||||
|
@@ -2,10 +2,6 @@
|
||||
|
||||
https://knexjs.org/guide/migrations.html#knexfile-in-other-languages
|
||||
|
||||
## Basic rules
|
||||
- All tables must have a primary key named `id`
|
||||
- Filename format: `YYYY-MM-DD-HHMM-patch-name.js`
|
||||
- Avoid native SQL syntax, use knex methods, because Uptime Kuma supports multiple databases
|
||||
|
||||
## Template
|
||||
|
||||
@@ -25,17 +21,19 @@ exports.down = function(knex) {
|
||||
|
||||
## Example
|
||||
|
||||
Filename: 2023-06-30-1348-create-user-and-product.js
|
||||
YYYY-MM-DD-HHMM-create-users-products.js
|
||||
|
||||
2023-06-30-1348-create-users-products.js
|
||||
|
||||
```js
|
||||
exports.up = function(knex) {
|
||||
return knex.schema
|
||||
.createTable('user', function (table) {
|
||||
.createTable('users', function (table) {
|
||||
table.increments('id');
|
||||
table.string('first_name', 255).notNullable();
|
||||
table.string('last_name', 255).notNullable();
|
||||
})
|
||||
.createTable('product', function (table) {
|
||||
.createTable('products', function (table) {
|
||||
table.increments('id');
|
||||
table.decimal('price').notNullable();
|
||||
table.string('name', 1000).notNullable();
|
||||
@@ -49,8 +47,8 @@ exports.up = function(knex) {
|
||||
|
||||
exports.down = function(knex) {
|
||||
return knex.schema
|
||||
.dropTable("product")
|
||||
.dropTable("user");
|
||||
.dropTable("products")
|
||||
.dropTable("users");
|
||||
};
|
||||
```
|
||||
|
||||
|
75
extra/cli.js
Normal file
75
extra/cli.js
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env node
|
||||
const path = require("path");
|
||||
const args = require("args-parser")(process.argv);
|
||||
|
||||
// Set the data directory
|
||||
if (!process.env.DATA_DIR) {
|
||||
if (process.platform === "win32") {
|
||||
process.env.DATA_DIR = process.env.LOCALAPPDATA + "\\uptime-kuma\\";
|
||||
} else if (process.platform === "linux") {
|
||||
process.env.DATA_DIR = process.env.HOME + "/.local/share/uptime-kuma/";
|
||||
} else if (process.platform === "darwin") {
|
||||
// TODO: Not sure if this is the correct path for macOS
|
||||
process.env.DATA_DIR = process.env.HOME + "/Library/Preferences/uptime-kuma/";
|
||||
} else {
|
||||
console.error("Unable to detect app data directory on platform: " + process.platform);
|
||||
console.error("Please set the DATA_DIR environment variable or `--data-dir=` to the directory where you want to store your data.");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Change the working directory to the root of the project, so it can read the dist folder
|
||||
process.chdir(path.join(__dirname, ".."));
|
||||
|
||||
if (args.run) {
|
||||
require("../server/server");
|
||||
|
||||
} else if (args.installService) {
|
||||
|
||||
if (process.platform === "win32") {
|
||||
let Service = require("node-windows").Service;
|
||||
|
||||
// Create a new service object
|
||||
let svc = new Service({
|
||||
name: "Uptime Kuma",
|
||||
description: "Uptime Kuma is an easy-to-use self-hosted monitoring tool.",
|
||||
script: "C:\\path\\to\\helloworld.js",
|
||||
nodeOptions: [
|
||||
"--harmony",
|
||||
"--max_old_space_size=4096"
|
||||
]
|
||||
//, workingDirectory: '...'
|
||||
//, allowServiceLogon: true
|
||||
});
|
||||
|
||||
// Listen for the "install" event, which indicates the
|
||||
// process is available as a service.
|
||||
svc.on("install", function () {
|
||||
svc.start();
|
||||
});
|
||||
|
||||
svc.install();
|
||||
} else if (process.platform === "linux") {
|
||||
|
||||
} else {
|
||||
console.error("Unable to install service on platform: " + process.platform);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
} else if (args.version || args.v) {
|
||||
const version = require("../package.json").version;
|
||||
console.log("Uptime Kuma version: " + version);
|
||||
|
||||
} else {
|
||||
console.log(`Usage: uptime-kuma [options]
|
||||
|
||||
Options:
|
||||
--install-service Install Uptime Kuma service (Windows and Linux only)
|
||||
--uninstall-service Uninstall Uptime Kuma service
|
||||
--run Run Uptime Kuma directly in the terminal
|
||||
--data-dir="your path" Set the data directory
|
||||
--version Print the version
|
||||
--help Print this help
|
||||
`);
|
||||
}
|
||||
|
16
index.html
16
index.html
@@ -9,24 +9,8 @@
|
||||
<meta name="theme-color" id="theme-color" content="" />
|
||||
<meta name="description" content="Uptime Kuma monitoring tool" />
|
||||
<title>Uptime Kuma</title>
|
||||
<style>
|
||||
.noscript-message {
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
max-width: 500px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<div class="noscript-message">
|
||||
Sorry, you don't seem to have JavaScript enabled or your browser
|
||||
doesn't support it.<br />This website requires JavaScript to function.
|
||||
Please enable JavaScript in your browser settings to continue.
|
||||
</div>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
|
18
package-lock.json
generated
18
package-lock.json
generated
@@ -53,6 +53,7 @@
|
||||
"nanoid": "~3.3.4",
|
||||
"node-cloudflared-tunnel": "~1.0.9",
|
||||
"node-radius-client": "~1.0.0",
|
||||
"node-windows": "^1.0.0-beta.8",
|
||||
"nodemailer": "~6.6.5",
|
||||
"nostr-tools": "^1.13.1",
|
||||
"notp": "~2.0.3",
|
||||
@@ -76,6 +77,9 @@
|
||||
"thirty-two": "~1.0.2",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"bin": {
|
||||
"uptime-kuma": "extra/cli.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@actions/github": "~5.0.1",
|
||||
"@babel/eslint-parser": "^7.22.7",
|
||||
@@ -14642,6 +14646,15 @@
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/node-windows": {
|
||||
"version": "1.0.0-beta.8",
|
||||
"resolved": "https://registry.npmjs.org/node-windows/-/node-windows-1.0.0-beta.8.tgz",
|
||||
"integrity": "sha512-uLekXnSeem3nW5escID224Fd0U/1VtvE796JpSpOY+c73Cslz/Qn2WUHRJyPQJEMrNGAy/FMRFjjhh4z1alZTA==",
|
||||
"dependencies": {
|
||||
"xml": "1.0.1",
|
||||
"yargs": "^17.5.1"
|
||||
}
|
||||
},
|
||||
"node_modules/nodemailer": {
|
||||
"version": "6.6.5",
|
||||
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
|
||||
@@ -19016,6 +19029,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/xml": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
|
||||
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw=="
|
||||
},
|
||||
"node_modules/xmlbuilder": {
|
||||
"version": "8.2.2",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
|
||||
|
15
package.json
15
package.json
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"description": "Uptime Kuma is an easy-to-use self-hosted monitoring tool",
|
||||
"version": "1.23.0-beta.1",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -9,7 +10,11 @@
|
||||
"engines": {
|
||||
"node": "14 || 16 || 18 || >= 20.4.0"
|
||||
},
|
||||
"bin": {
|
||||
"uptime-kuma": "./extra/cli.js"
|
||||
},
|
||||
"scripts": {
|
||||
"uptime-kuma": "node ./extra/cli.js",
|
||||
"install-legacy": "npm install",
|
||||
"update-legacy": "npm update",
|
||||
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
|
||||
@@ -55,8 +60,8 @@
|
||||
"simple-dns-server": "node extra/simple-dns-server.js",
|
||||
"simple-mqtt-server": "node extra/simple-mqtt-server.js",
|
||||
"update-language-files": "cd extra/update-language-files && node index.js && cross-env-shell eslint ../../src/languages/$npm_config_language.js --fix",
|
||||
"release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
|
||||
"release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
|
||||
"release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js && npm run publish-to-npm",
|
||||
"release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts && npm run publish-to-npm-beta",
|
||||
"git-remove-tag": "git tag -d",
|
||||
"build-dist-and-restart": "npm run build && npm run start-server-dev",
|
||||
"start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
|
||||
@@ -68,7 +73,10 @@
|
||||
"deploy-demo-server": "node extra/deploy-demo-server.js",
|
||||
"sort-contributors": "node extra/sort-contributors.js",
|
||||
"quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2",
|
||||
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate"
|
||||
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate",
|
||||
"publish-to-npm-dev": "npm run build && npm publish --tag dev",
|
||||
"publish-to-npm-beta": "npm publish --tag beta",
|
||||
"publish-to-npm": "npm publish"
|
||||
},
|
||||
"dependencies": {
|
||||
"@grpc/grpc-js": "~1.7.3",
|
||||
@@ -115,6 +123,7 @@
|
||||
"nanoid": "~3.3.4",
|
||||
"node-cloudflared-tunnel": "~1.0.9",
|
||||
"node-radius-client": "~1.0.0",
|
||||
"node-windows": "^1.0.0-beta.8",
|
||||
"nodemailer": "~6.6.5",
|
||||
"nostr-tools": "^1.13.1",
|
||||
"notp": "~2.0.3",
|
||||
|
@@ -133,9 +133,6 @@ class Database {
|
||||
log.info("db", `Data Dir: ${Database.dataDir}`);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static readDBConfig() {
|
||||
let dbConfig;
|
||||
|
||||
@@ -152,9 +149,6 @@ class Database {
|
||||
return dbConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dbConfig
|
||||
*/
|
||||
static writeDBConfig(dbConfig) {
|
||||
fs.writeFileSync(path.join(Database.dataDir, "db-config.json"), JSON.stringify(dbConfig, null, 4));
|
||||
}
|
||||
@@ -282,10 +276,6 @@ class Database {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param testMode
|
||||
* @param noLog
|
||||
*/
|
||||
static async initSQLite(testMode, noLog) {
|
||||
await R.exec("PRAGMA foreign_keys = ON");
|
||||
if (testMode) {
|
||||
@@ -311,9 +301,6 @@ class Database {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static async initMariaDB() {
|
||||
log.debug("db", "Checking if MariaDB database exists...");
|
||||
|
||||
@@ -350,6 +337,7 @@ class Database {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
static async rollbackLatestPatch() {
|
||||
@@ -640,9 +628,6 @@ class Database {
|
||||
await R.exec("VACUUM");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static sqlHourOffset() {
|
||||
if (this.dbConfig.client === "sqlite3") {
|
||||
return "DATETIME('now', ? || ' hours')";
|
||||
|
@@ -24,6 +24,7 @@ class EmbeddedMariaDB {
|
||||
started = false;
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {EmbeddedMariaDB}
|
||||
*/
|
||||
static getInstance() {
|
||||
@@ -33,9 +34,6 @@ class EmbeddedMariaDB {
|
||||
return EmbeddedMariaDB.instance;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static hasInstance() {
|
||||
return !!EmbeddedMariaDB.instance;
|
||||
}
|
||||
@@ -102,9 +100,6 @@ class EmbeddedMariaDB {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
stop() {
|
||||
if (this.childProcess) {
|
||||
this.childProcess.kill("SIGINT");
|
||||
@@ -112,9 +107,6 @@ class EmbeddedMariaDB {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
initDB() {
|
||||
if (!fs.existsSync(this.mariadbDataDir)) {
|
||||
log.info("mariadb", `Embedded MariaDB: ${this.mariadbDataDir} is not found, create one now.`);
|
||||
@@ -145,9 +137,6 @@ class EmbeddedMariaDB {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
async initDBAfterStarted() {
|
||||
const connection = mysql.createConnection({
|
||||
socketPath: this.socketPath,
|
||||
|
@@ -39,14 +39,6 @@ class Heartbeat extends BeanModel {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Find the msg from the `msg` table and get the msg_id
|
||||
* @param value
|
||||
*/
|
||||
set msg(value) {
|
||||
throw new Error("Not implemented yet")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = Heartbeat;
|
||||
|
@@ -291,9 +291,6 @@ class Monitor extends BeanModel {
|
||||
return JSON.parse(this.accepted_statuscodes_json);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
getGameDigGivenPortOnly() {
|
||||
return Boolean(this.gamedigGivenPortOnly);
|
||||
}
|
||||
|
@@ -21,7 +21,7 @@ class AliyunSMS extends NotificationProvider {
|
||||
status: this.statusToString(heartbeatJSON["status"]),
|
||||
msg: heartbeatJSON["msg"],
|
||||
});
|
||||
if (await this.sendSms(notification, msgBody)) {
|
||||
if (this.sendSms(notification, msgBody)) {
|
||||
return okMsg;
|
||||
}
|
||||
} else {
|
||||
@@ -31,7 +31,7 @@ class AliyunSMS extends NotificationProvider {
|
||||
status: "",
|
||||
msg: msg,
|
||||
});
|
||||
if (await this.sendSms(notification, msgBody)) {
|
||||
if (this.sendSms(notification, msgBody)) {
|
||||
return okMsg;
|
||||
}
|
||||
}
|
||||
@@ -76,8 +76,7 @@ class AliyunSMS extends NotificationProvider {
|
||||
if (result.data.Message === "OK") {
|
||||
return true;
|
||||
}
|
||||
|
||||
throw new Error(result.data.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -23,10 +23,6 @@ class SetupDatabase {
|
||||
|
||||
server;
|
||||
|
||||
/**
|
||||
* @param args
|
||||
* @param server
|
||||
*/
|
||||
constructor(args, server) {
|
||||
this.server = server;
|
||||
|
||||
@@ -76,17 +72,10 @@ class SetupDatabase {
|
||||
return this.needSetup;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
isEnabledEmbeddedMariaDB() {
|
||||
return process.env.UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB === "1";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param hostname
|
||||
* @param port
|
||||
*/
|
||||
start(hostname, port) {
|
||||
return new Promise((resolve) => {
|
||||
const app = express();
|
||||
|
@@ -68,7 +68,8 @@ export default {
|
||||
|
||||
/**
|
||||
* Calculates the amount of beats of padding needed to fill the length of shortBeatList.
|
||||
* @returns {number} The amount of beats of padding needed to fill the length of shortBeatList.
|
||||
*
|
||||
* @return {number} The amount of beats of padding needed to fill the length of shortBeatList.
|
||||
*/
|
||||
numPadding() {
|
||||
if (!this.beatList) {
|
||||
@@ -148,7 +149,7 @@ export default {
|
||||
|
||||
/**
|
||||
* Returns the style object for positioning the time element.
|
||||
* @returns {object} The style object containing the CSS properties for positioning the time element.
|
||||
* @return {Object} The style object containing the CSS properties for positioning the time element.
|
||||
*/
|
||||
timeStyle() {
|
||||
return {
|
||||
@@ -158,7 +159,8 @@ export default {
|
||||
|
||||
/**
|
||||
* Calculates the time elapsed since the first valid beat.
|
||||
* @returns {string} The time elapsed in minutes or hours.
|
||||
*
|
||||
* @return {string} The time elapsed in minutes or hours.
|
||||
*/
|
||||
timeSinceFirstBeat() {
|
||||
const firstValidBeat = this.shortBeatList.at(this.numPadding);
|
||||
@@ -172,7 +174,8 @@ export default {
|
||||
|
||||
/**
|
||||
* Calculates the elapsed time since the last valid beat was registered.
|
||||
* @returns {string} The elapsed time in a minutes, hours or "now".
|
||||
*
|
||||
* @return {string} The elapsed time in a minutes, hours or "now".
|
||||
*/
|
||||
timeSinceLastBeat() {
|
||||
const lastValidBeat = this.shortBeatList.at(-1);
|
||||
|
@@ -120,7 +120,8 @@ export default {
|
||||
|
||||
/**
|
||||
* Returns a sorted list of monitors based on the applied filters and search text.
|
||||
* @returns {Array} The sorted list of monitors.
|
||||
*
|
||||
* @return {Array} The sorted list of monitors.
|
||||
*/
|
||||
sortedMonitorList() {
|
||||
let result = Object.values(this.$root.monitorList);
|
||||
@@ -221,7 +222,8 @@ export default {
|
||||
|
||||
/**
|
||||
* Determines if any filters are active.
|
||||
* @returns {boolean} True if any filter is active, false otherwise.
|
||||
*
|
||||
* @return {boolean} True if any filter is active, false otherwise.
|
||||
*/
|
||||
filtersActive() {
|
||||
return this.filterState.status != null || this.filterState.active != null || this.filterState.tags != null || this.searchText !== "";
|
||||
|
@@ -109,10 +109,10 @@
|
||||
"Last Result": "Letztes Ergebnis",
|
||||
"pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
|
||||
"clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
|
||||
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Prüfintervalle für diesen Monitor löschen möchtest?",
|
||||
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
|
||||
"Clear Data": "Lösche Daten",
|
||||
"Events": "Ereignisse",
|
||||
"Heartbeats": "Prüfintervalle",
|
||||
"Heartbeats": "Statistiken",
|
||||
"confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
|
||||
"Create your admin account": "Erstelle dein Admin-Konto",
|
||||
"Repeat Password": "Passwort erneut eingeben",
|
||||
@@ -380,12 +380,12 @@
|
||||
"alertaAlertState": "Alarmstatus",
|
||||
"alertaRecoverState": "Wiederherstellungsstatus",
|
||||
"deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
|
||||
"Proxies": "Proxys",
|
||||
"Proxies": "Proxies",
|
||||
"default": "Standard",
|
||||
"enabled": "Aktiviert",
|
||||
"setAsDefault": "Als Standard setzen",
|
||||
"deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
|
||||
"proxyDescription": "Proxys müssen einem Monitor zugewiesen werden, um zu funktionieren.",
|
||||
"proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
|
||||
"enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
|
||||
"setAsDefaultProxyDescription": "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
|
||||
"Certificate Chain": "Zertifikatskette",
|
||||
@@ -815,25 +815,5 @@
|
||||
"Badge Preview": "Badge Vorschau",
|
||||
"tailscalePingWarning": "Um den Tailscale Ping Monitor nutzen zu können, musst du Uptime Kuma ohne Docker installieren und den Tailscale Client auf dem Server installieren.",
|
||||
"Server URL should not contain the nfty topic": "Die Server-URL sollte das nfty-Thema nicht enthalten",
|
||||
"pushDeerServerDescription": "Leer lassen um den offiziellen Server zu verwenden",
|
||||
"FlashDuty Severity": "Schweregrad",
|
||||
"nostrSender": "Privater Schlüssel des Absenders (nsec)",
|
||||
"nostrRecipientsHelp": "npub-Format, eine pro Zeile",
|
||||
"noOrBadCertificate": "Kein/schlechtes Zertifikat",
|
||||
"wayToGetFlashDutyKey": "Gehe zu Channel -> (Wähle einen Channel) -> Integrationen -> Neue Integration hinzufügen', füge ein 'Custom Event' hinzu, um eine Push-Adresse zu erhalten, und kopiere den Integrationsschlüssel in die Adresse. Für weitere Informationen besuche bitte",
|
||||
"nostrRelays": "Nostr relays",
|
||||
"nostrRelaysHelp": "Eine Relay-URL pro Zeile",
|
||||
"nostrRecipients": "Öffentliche Schlüssel des Empfängers (npub)",
|
||||
"gamedigGuessPort": "Gamedig: Guess Port",
|
||||
"Request Timeout": "Zeitüberschreitung der Anfrage",
|
||||
"styleElapsedTimeShowNoLine": "Anzeigen (keine Zeile)",
|
||||
"styleElapsedTimeShowWithLine": "Anzeigen (mit Zeile)",
|
||||
"Select": "Auswählen",
|
||||
"selectedMonitorCount": "Ausgewählt: {0}",
|
||||
"PushDeer Server": "PushDeer Server",
|
||||
"showCertificateExpiry": "Ablauf des Zertifikats anzeigen",
|
||||
"gamedigGuessPortDescription": "Der vom Valve Server Query Protocol verwendete Port kann sich vom Port des Clients unterscheiden. Versuche dies, wenn der Monitor keine Verbindung zum Server herstellen kann.",
|
||||
"timeoutAfter": "Zeitüberschreitung nach {0} Sekunden",
|
||||
"styleElapsedTime": "Verstrichene Zeit unter der Prüfintervallleiste",
|
||||
"Check/Uncheck": "Aktivieren/Deaktivieren"
|
||||
"pushDeerServerDescription": "Leer lassen, um den offiziellen Server zu verwenden"
|
||||
}
|
||||
|
@@ -109,10 +109,10 @@
|
||||
"Last Result": "Letztes Ergebnis",
|
||||
"pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
|
||||
"clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
|
||||
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Prüfintervalle für diesen Monitor löschen möchtest?",
|
||||
"clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
|
||||
"Clear Data": "Lösche Daten",
|
||||
"Events": "Ereignisse",
|
||||
"Heartbeats": "Prüfintervalle",
|
||||
"Heartbeats": "Statistiken",
|
||||
"confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
|
||||
"Create your admin account": "Erstelle dein Admin-Konto",
|
||||
"Repeat Password": "Passwort erneut eingeben",
|
||||
@@ -385,7 +385,7 @@
|
||||
"enabled": "Aktiviert",
|
||||
"setAsDefault": "Als Standard setzen",
|
||||
"deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
|
||||
"proxyDescription": "Proxys müssen einem Monitor zugewiesen werden, um zu funktionieren.",
|
||||
"proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
|
||||
"enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
|
||||
"setAsDefaultProxyDescription": "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
|
||||
"Certificate Chain": "Zertifikatskette",
|
||||
@@ -818,25 +818,5 @@
|
||||
"jsonQueryDescription": "Führe eine JSON-Abfrage gegen die Antwort durch und prüfe den erwarteten Wert (der Rückgabewert wird zum Vergleich in eine Zeichenkette umgewandelt). Auf <a href='https://jsonata.org/'>jsonata.org</a> findest du die Dokumentation zur Abfragesprache. <a href='https://try.jsonata.org/'>Hier</a> kannst du Abfragen üben.",
|
||||
"tailscalePingWarning": "Um den Tailscale Ping Monitor nutzen zu können, musst du Uptime Kuma ohne Docker installieren und den Tailscale Client auf dem Server installieren.",
|
||||
"Server URL should not contain the nfty topic": "Die Server-URL sollte das nfty-Thema nicht enthalten",
|
||||
"pushDeerServerDescription": "Leer lassen um den offiziellen Server zu verwenden",
|
||||
"FlashDuty Severity": "Schweregrad",
|
||||
"nostrRelays": "Nostr relays",
|
||||
"gamedigGuessPort": "Gamedig: Guess Port",
|
||||
"Request Timeout": "Zeitüberschreitung der Anfrage",
|
||||
"styleElapsedTimeShowNoLine": "Anzeigen (keine Zeile)",
|
||||
"Select": "Auswählen",
|
||||
"selectedMonitorCount": "Ausgewählt: {0}",
|
||||
"PushDeer Server": "PushDeer Server",
|
||||
"nostrRelaysHelp": "Eine Relay-URL pro Zeile",
|
||||
"nostrSender": "Privater Schlüssel des Absenders (nsec)",
|
||||
"gamedigGuessPortDescription": "Der vom Valve Server Query Protocol verwendete Port kann sich vom Port des Clients unterscheiden. Versuche dies, wenn der Monitor keine Verbindung zum Server herstellen kann.",
|
||||
"wayToGetFlashDutyKey": "Gehe zu Channel -> (Wähle einen Channel) -> Integrationen -> Neue Integration hinzufügen', füge ein 'Custom Event' hinzu, um eine Push-Adresse zu erhalten, und kopiere den Integrationsschlüssel in die Adresse. Für weitere Informationen besuche bitte",
|
||||
"timeoutAfter": "Zeitüberschreitung nach {0} Sekunden",
|
||||
"styleElapsedTimeShowWithLine": "Anzeigen (mit Zeile)",
|
||||
"styleElapsedTime": "Verstrichene Zeit unter der Prüfintervallleiste",
|
||||
"Check/Uncheck": "Aktivieren/Deaktivieren",
|
||||
"nostrRecipients": "Öffentliche Schlüssel des Empfängers (npub)",
|
||||
"nostrRecipientsHelp": "npub-Format, eine pro Zeile",
|
||||
"showCertificateExpiry": "Ablauf des Zertifikats anzeigen",
|
||||
"noOrBadCertificate": "Kein/schlechtes Zertifikat"
|
||||
"pushDeerServerDescription": "Leer lassen, um den offiziellen Server zu verwenden"
|
||||
}
|
||||
|
@@ -159,7 +159,7 @@
|
||||
"Show URI": "Mostra URI",
|
||||
"Tags": "Etichette",
|
||||
"Add New below or Select...": "Aggiungi oppure scegli…",
|
||||
"Tag with this name already exist.": "Un'etichetta con questo nome esiste già.",
|
||||
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
|
||||
"Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
|
||||
"color": "colore",
|
||||
"value (optional)": "descrizione (opzionale)",
|
||||
@@ -213,7 +213,7 @@
|
||||
"smtpBCC": "CCn",
|
||||
"discord": "Discord",
|
||||
"Discord Webhook URL": "URL Webhook di Discord",
|
||||
"wayToGetDiscordURL": "Puoi ottenerlo andando su Impostazioni server -> Integrazioni -> Visualizza webhook -> Nuovo webhook",
|
||||
"wayToGetDiscordURL": "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
|
||||
"Bot Display Name": "Nome del Bot",
|
||||
"Prefix Custom Message": "Prefisso per il messaggio personalizzato",
|
||||
"Hello @everyone is...": "Ciao a {'@'}everyone …",
|
||||
@@ -384,7 +384,7 @@
|
||||
"resendDisabled": "Reinvio disabilitato",
|
||||
"Resend Notification if Down X times consequently": "Reinvia la notifica se Down X volte di seguito",
|
||||
"Add New Status Page": "Aggiungi nuova pagina di stato",
|
||||
"webhookAdditionalHeadersDesc": "Imposta intestazioni aggiuntive inviate con il webhook. Ogni intestazione deve essere definita come chiave/valore JSON.",
|
||||
"webhookAdditionalHeadersDesc": "Imposta gli header aggiuntivi inviati nel webhook.",
|
||||
"topicExplanation": "MQTT topic da controllare",
|
||||
"successMessage": "Messaggio con successo",
|
||||
"successMessageExplanation": "Messaggio MQTT considerato come successo",
|
||||
@@ -417,196 +417,5 @@
|
||||
"Affected Monitors": "Monitoraggi interessati",
|
||||
"Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
|
||||
"Valid": "Valido",
|
||||
"Certificate Expiry Notification": "Notifica scadenza certificato",
|
||||
"styleElapsedTimeShowWithLine": "Mostra (con linea)",
|
||||
"webhookBodyPresetOption": "Predefinito - {0}",
|
||||
"webhookBodyCustomOption": "Corpo personalizzato",
|
||||
"topic": "Topic",
|
||||
"selectedMonitorCount": "Selezionato: {0}",
|
||||
"Check/Uncheck": "Seleziona/Deseleziona",
|
||||
"Proxies": "Proxy",
|
||||
"Stop": "Fermare",
|
||||
"startOrEndWithOnly": "Inizia o termina solo con {0}",
|
||||
"No consecutive dashes": "Nessun trattino consecutivo",
|
||||
"HTTP Basic Auth": "Autenticazione di base HTTP",
|
||||
"Reverse Proxy": "Proxy inverso",
|
||||
"Backup": "Backup",
|
||||
"About": "Di",
|
||||
"wayToGetCloudflaredURL": "(Scarica cloudflared da {0})",
|
||||
"cloudflareWebsite": "Sito web di Cloudflare",
|
||||
"Message:": "Messaggio:",
|
||||
"Don't know how to get the token? Please read the guide:": "Non sai come ottenere il token? Si prega di leggere la guida:",
|
||||
"Trust Proxy": "Proxy di fiducia",
|
||||
"Other Software": "Altro Software",
|
||||
"For example: nginx, Apache and Traefik.": "Ad esempio: nginx, Apache e Traefik.",
|
||||
"Please read": "Si prega di leggere",
|
||||
"Subject:": "Soggetto:",
|
||||
"Valid To:": "Valido per:",
|
||||
"Days Remaining:": "Giorni rimanenti:",
|
||||
"Issuer:": "Emittente",
|
||||
"Fingerprint:": "Impronta digitale:",
|
||||
"No status pages": "Nessuna pagina di stato",
|
||||
"Domain Name Expiry Notification": "Notifica di scadenza del nome di dominio",
|
||||
"Date Created": "Data di creazione",
|
||||
"Slug": "Slug",
|
||||
"Show Powered By": "Mostra Alimentato da",
|
||||
"Domain Names": "Nomi di dominio",
|
||||
"signedInDispDisabled": "Autenticazione disabilitata.",
|
||||
"RadiusSecret": "Radius Segreto",
|
||||
"RadiusCalledStationId": "Identificativo della stazione chiamata",
|
||||
"RadiusCallingStationId": "Id stazione chiamante",
|
||||
"RadiusCallingStationIdDescription": "Identificativo del dispositivo chiamante",
|
||||
"API Username": "Nome utente dell'API",
|
||||
"API Key": "Chiave dell'API",
|
||||
"Show update if available": "Mostra aggiornamento se disponibile",
|
||||
"RadiusSecretDescription": "Segreto condiviso tra client e server",
|
||||
"Also check beta release": "Controlla anche la versione beta",
|
||||
"Check how to config it for WebSocket": "Controlla come configurarlo per WebSocket",
|
||||
"Steam Game Server": "Server di gioco Steam",
|
||||
"Most likely causes:": "Cause più probabili:",
|
||||
"The resource is no longer available.": "La risorsa non è più disponibile.",
|
||||
"What you can try:": "Cosa puoi provare:",
|
||||
"Retype the address.": "Ridigita l'indirizzo.",
|
||||
"Go back to the previous page.": "Torna alla pagina precedente.",
|
||||
"Coming Soon": "Prossimamente",
|
||||
"Connection String": "Stringa di connessione",
|
||||
"Query": "Richiesta",
|
||||
"settingsCertificateExpiry": "Scadenza certificato TLS",
|
||||
"deleteDockerHostMsg": "Sei sicuro di voler eliminare questo host docker per tutti i monitor?",
|
||||
"tcp": "TCP / HTTP",
|
||||
"Docker Container": "Contenitore Docker",
|
||||
"Container Name / ID": "Nome/ID contenitore",
|
||||
"Docker Host": "Host Docker",
|
||||
"Docker Hosts": "Host Docker",
|
||||
"Domain": "Dominio",
|
||||
"Workstation": "Postazione di lavoro",
|
||||
"Packet Size": "Dimensione del pacchetto",
|
||||
"Setup Docker Host": "Configurare l'host Docker",
|
||||
"telegramSendSilently": "Invia silenziosamente",
|
||||
"telegramSendSilentlyDescription": "Invia il messaggio in silenzio. Gli utenti riceveranno una notifica senza audio.",
|
||||
"telegramProtectContent": "Proteggi inoltro/salvataggio",
|
||||
"disableCloudflaredNoAuthMsg": "Sei in modalità No Auth, non è richiesta una password.",
|
||||
"wayToGetLineNotifyToken": "Puoi ottenere un token di accesso da {0}",
|
||||
"Examples": "Esempi",
|
||||
"Long-Lived Access Token": "Token di accesso di lunga durata",
|
||||
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Il token di accesso di lunga durata può essere creato facendo clic sul nome del tuo profilo (in basso a sinistra) e scorrendo verso il basso, quindi fai clic su Crea token. ",
|
||||
"Notification Service": "Servizio di notifica",
|
||||
"default: notify all devices": "default: notifica a tutti i dispositivi",
|
||||
"Automations can optionally be triggered in Home Assistant:": "Le automazioni possono essere facoltativamente attivate in Home Assistant:",
|
||||
"Trigger type:": "Tipo di attivazione:",
|
||||
"Event type:": "Tipo di evento:",
|
||||
"Event data:": "Dati dell'evento:",
|
||||
"Then choose an action, for example switch the scene to where an RGB light is red.": "Quindi scegli un'azione, ad esempio cambia la scena in cui una luce RGB è rossa.",
|
||||
"Frontend Version": "Versione front-end",
|
||||
"Frontend Version do not match backend version!": "La versione del frontend non corrisponde alla versione del backend!",
|
||||
"backupOutdatedWarning": "Deprecato: poiché sono state aggiunte molte funzionalità e questa funzionalità di backup è un po' trascurata, non può generare o ripristinare un backup completo.",
|
||||
"backupRecommend": "Eseguire invece il backup diretto del volume o della cartella dei dati (./data/).",
|
||||
"Optional": "Opzionale",
|
||||
"sameAsServerTimezone": "Uguale al fuso orario del server",
|
||||
"startDateTime": "Data/ora di inizio",
|
||||
"endDateTime": "Data/ora di fine",
|
||||
"cronExpression": "Espressione Cron",
|
||||
"cronSchedule": "Programma: ",
|
||||
"recurringInterval": "Intervallo",
|
||||
"Recurring": "Ricorrente",
|
||||
"strategyManual": "Attivo/Inattivo manualmente",
|
||||
"warningTimezone": "Sta usando il fuso orario del server",
|
||||
"weekdayShortMon": "Lun",
|
||||
"weekdayShortTue": "Mar",
|
||||
"weekdayShortWed": "Mer",
|
||||
"weekdayShortThu": "Gio",
|
||||
"weekdayShortSat": "Sab",
|
||||
"weekdayShortSun": "Dom",
|
||||
"dayOfWeek": "Giorno della settimana",
|
||||
"dayOfMonth": "Giorno del mese",
|
||||
"lastDay": "Ultimo giorno",
|
||||
"lastDay1": "Ultimo giorno del mese",
|
||||
"lastDay3": "3° ultimo giorno del mese",
|
||||
"lastDay4": "4° ultimo giorno del mese",
|
||||
"No Maintenance": "Nessuna manutenzione",
|
||||
"pauseMaintenanceMsg": "Sei sicuro di voler mettere in pausa?",
|
||||
"maintenanceStatus-inactive": "Inattivo",
|
||||
"maintenanceStatus-scheduled": "Programmato",
|
||||
"maintenanceStatus-ended": "Conclusa",
|
||||
"maintenanceStatus-unknown": "Sconosciuto",
|
||||
"Display Timezone": "Mostra fuso orario",
|
||||
"Server Timezone": "Fuso orario del server",
|
||||
"statusPageMaintenanceEndDate": "Fine",
|
||||
"IconUrl": "URL dell'icona",
|
||||
"Enable DNS Cache": "Abilita la cache DNS per i monitor HTTP(s).",
|
||||
"Enable": "Abilitare",
|
||||
"Disable": "Disattivare",
|
||||
"chromeExecutableAutoDetect": "Trovato automaticamente",
|
||||
"dnsCacheDescription": "Potrebbe non funzionare in alcuni ambienti IPv6, disabilitalo in caso di problemi.",
|
||||
"Single Maintenance Window": "Singola finestra di manutenzione",
|
||||
"Maintenance Time Window of a Day": "Finestra temporale di manutenzione di un giorno",
|
||||
"Effective Date Range": "Intervallo di date effettivo (facoltativo)",
|
||||
"Schedule Maintenance": "Pianificare la manutenzione",
|
||||
"Edit Maintenance": "Modifica Manutenzione",
|
||||
"Date and Time": "Data e ora",
|
||||
"DateTime Range": "Intervallo DataOra",
|
||||
"loadingError": "Impossibile recuperare i dati, riprova più tardi.",
|
||||
"plugin": "Plug-in | Plugin",
|
||||
"install": "Installare",
|
||||
"installing": "Installazione",
|
||||
"uninstall": "Disinstalla",
|
||||
"confirmUninstallPlugin": "Sei sicuro di voler disinstallare questo plugin?",
|
||||
"notificationRegional": "Regionale",
|
||||
"Clone": "Clone",
|
||||
"cloneOf": "Clone di {0}",
|
||||
"wayToGetZohoCliqURL": "Puoi scoprire come creare un URL webhook {0}.",
|
||||
"dataRetentionTimeError": "Il periodo di conservazione deve essere pari o superiore a 0",
|
||||
"infiniteRetention": "Impostare su 0 per la conservazione infinita.",
|
||||
"enableGRPCTls": "Consenti l'invio di richieste gRPC con connessione TLS",
|
||||
"grpcMethodDescription": "Il nome del metodo viene convertito nel formato cammelCase come sayHello, check, ecc.",
|
||||
"styleElapsedTimeShowNoLine": "Mostra (nessuna riga)",
|
||||
"Add New Tag": "Aggiungi nuova etichetta",
|
||||
"webhookCustomBodyDesc": "Definire un corpo HTTP personalizzato per la richiesta. Le variabili modello {msg}, {heartbeat}, {monitor} sono accettate.",
|
||||
"Select": "Selezionare",
|
||||
"Accept characters:": "Accetta caratteri:",
|
||||
"The slug is already taken. Please choose another slug.": "La lumaca è già slug. Scegli un'altra slug.",
|
||||
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connessione corrente potrebbe andare persa se ti stai connettendo tramite Cloudflare Tunnel. Sei sicuro di volerlo fermare? Digita la tua password attuale per confermarla.",
|
||||
"Footer Text": "Testo piè di pagina",
|
||||
"signedInDisp": "Accesso eseguito come {0}",
|
||||
"RadiusCalledStationIdDescription": "Identificativo del dispositivo chiamato",
|
||||
"Clone Monitor": "Monitoraggio clonazione",
|
||||
"styleElapsedTime": "Tempo trascorso sotto la barra del battito cardiaco",
|
||||
"enableProxyDescription": "Questo proxy non avrà effetto sulle richieste di monitoraggio fino a quando non viene attivato. È possibile controllare la disabilitazione temporanea del proxy da tutti i monitor in base allo stato di attivazione.",
|
||||
"Using a Reverse Proxy?": "Utilizzo di un proxy inverso?",
|
||||
"There might be a typing error in the address.": "Potrebbe esserci un errore di battitura nell'indirizzo.",
|
||||
"certificationExpiryDescription": "HTTPS monitora la notifica di attivazione quando il certificato TLS scade tra:",
|
||||
"tailscalePingWarning": "Per utilizzare il monitor Tailscale Ping, è necessario installare Uptime Kuma senza Docker e installare anche il client Tailscale sul server.",
|
||||
"telegramMessageThreadID": "(Facoltativo) ID thread messaggio",
|
||||
"telegramMessageThreadIDDescription": "Facoltativo Identificatore univoco per il thread del messaggio di destinazione (argomento) del forum; solo per i supergruppi del forum",
|
||||
"telegramProtectContentDescription": "Se abilitato, i messaggi del bot in Telegram saranno protetti dall'inoltro e dal salvataggio.",
|
||||
"trustProxyDescription": "Fidati delle intestazioni 'X-Forwarded-*'. Se vuoi ottenere l'IP client corretto e il tuo Uptime Kuma è dietro un proxy come Nginx o Apache, dovresti abilitarlo.",
|
||||
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Un elenco di servizi di notifica è disponibile in Home Assistant in \"Strumenti per sviluppatori> Servizi\" cerca \"notifica\" per trovare il nome del tuo dispositivo/telefono.",
|
||||
"invalidCronExpression": "Espressione Cron non valida: {0}",
|
||||
"lastDay2": "2° ultimo giorno del mese",
|
||||
"maintenanceStatus-under-maintenance": "In manutenzione",
|
||||
"chromeExecutable": "Cromo/cromo eseguibile",
|
||||
"chromeExecutableDescription": "Per gli utenti Docker, se Chromium non è ancora installato, potrebbero essere necessari alcuni minuti per l'installazione e la visualizzazione del risultato del test. Richiede 1 GB di spazio su disco.",
|
||||
"uninstalling": "Disinstallazione",
|
||||
"confirmDeleteTagMsg": "Sei sicuro di voler eliminare questo tag? I monitor associati a questo tag non verranno eliminati.",
|
||||
"Request Timeout": "Richiedi timeout",
|
||||
"timeoutAfter": "Timeout dopo {0} secondi",
|
||||
"Resend Notification if Down X times consecutively": "Invia di nuovo la notifica se giù X volte consecutivamente",
|
||||
"Proxy": "Proxy",
|
||||
"or": "o",
|
||||
"statusPageRefreshIn": "Aggiorna tra: {0}",
|
||||
"HTTP Headers": "Intestazioni HTTP",
|
||||
"Custom": "Personalizzato",
|
||||
"Connection Type": "Tipo di connessione",
|
||||
"Docker Daemon": "Deamon Docker",
|
||||
"socket": "Socket",
|
||||
"Home Assistant URL": "URL dell'assistente domestico",
|
||||
"weekdayShortFri": "Ven",
|
||||
"Home": "Accoglienza",
|
||||
"Invert Keyword": "Inverti parola chiave",
|
||||
"filterActive": "Attiva",
|
||||
"filterActivePaused": "In pausa",
|
||||
"Cannot connect to the socket server": "Impossibile connettersi al server socket",
|
||||
"Reconnecting...": "Riconnessione...",
|
||||
"Expected Value": "Valore atteso",
|
||||
"Json Query": "Query Json"
|
||||
"Certificate Expiry Notification": "Notifica scadenza certificato"
|
||||
}
|
||||
|
@@ -43,7 +43,7 @@
|
||||
"Delete": "Удалить",
|
||||
"Current": "Текущий",
|
||||
"Uptime": "Аптайм",
|
||||
"Cert Exp.": "Сертификат ист.",
|
||||
"Cert Exp.": "Сертификат истекает",
|
||||
"day": "день | дней",
|
||||
"-day": "-дней",
|
||||
"hour": "час",
|
||||
@@ -542,7 +542,7 @@
|
||||
"Container Name / ID": "Название контейнера / ID",
|
||||
"Docker Host": "Хост Docker",
|
||||
"Docker Hosts": "Хосты Docker",
|
||||
"ntfy Topic": "Тема ntfy",
|
||||
"ntfy Topic": "тема ntfy",
|
||||
"Domain": "Домен",
|
||||
"Workstation": "Рабочая станция",
|
||||
"disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.",
|
||||
@@ -639,7 +639,7 @@
|
||||
"Server Timezone": "Часовой пояс сервера",
|
||||
"statusPageMaintenanceEndDate": "Конец",
|
||||
"IconUrl": "URL иконки",
|
||||
"Enable DNS Cache": "Включить DNS кэш для мониторов HTTP(S)",
|
||||
"Enable DNS Cache": "Включить DNS кэш",
|
||||
"Enable": "Включить",
|
||||
"Disable": "Отключить",
|
||||
"Single Maintenance Window": "Единое окно техбслуживания",
|
||||
@@ -825,27 +825,5 @@
|
||||
"filterActive": "Активный",
|
||||
"filterActivePaused": "На паузе",
|
||||
"Invert Keyword": "Инвертировать ключевое слово",
|
||||
"tailscalePingWarning": "Для того чтобы использовать монитор Tailscale Ping, необходимо установить Uptime Kuma без Docker, а также установить на сервер клиент Tailscale.",
|
||||
"PushDeer Server": "Сервер PushDeer",
|
||||
"pushDeerServerDescription": "Оставьте пустым для использования официального сервера",
|
||||
"showCertificateExpiry": "Показывать истекающий сертификат",
|
||||
"Request Timeout": "Тайм-Аут запроса",
|
||||
"timeoutAfter": "Тайм-Аут через {0} секунд",
|
||||
"Select": "Выбрать",
|
||||
"selectedMonitorCount": "Выбрано: {0}",
|
||||
"Check/Uncheck": "Отметить/Снять",
|
||||
"gamedigGuessPort": "Gamedig: Угадай порт",
|
||||
"styleElapsedTime": "Прошедшее время под полосой частоты опроса",
|
||||
"noOrBadCertificate": "Отсутствие сертификата",
|
||||
"gamedigGuessPortDescription": "Порт, используемый протоколом Valve Server Query Protocol, может отличаться от порта клиента. Попробуйте это сделать, если монитор не может подключиться к серверу.",
|
||||
"nostrSender": "Закрытый ключ отправителя (nsec)",
|
||||
"wayToGetFlashDutyKey": "Вы можете перейти на страницу \"Канал\" -> (Выберите канал) -> \"Интеграции\" -> \"Добавить новую страницу интеграции\", добавить \"Пользовательское событие\", чтобы получить push-адрес, скопировать ключ интеграции в адрес. Для получения дополнительной информации, пожалуйста, посетите",
|
||||
"styleElapsedTimeShowNoLine": "Показать (Без линии)",
|
||||
"styleElapsedTimeShowWithLine": "Показать (С линией)",
|
||||
"Server URL should not contain the nfty topic": "URL сервера не должен содержать тему nfty",
|
||||
"nostrRecipients": "Открытые ключи получателей (npub)",
|
||||
"nostrRecipientsHelp": "формат npub, по одному в строке",
|
||||
"FlashDuty Severity": "Серьёзность",
|
||||
"nostrRelays": "Реле Nostr",
|
||||
"nostrRelaysHelp": "Один URL-адрес ретрансляции в каждой строке"
|
||||
"tailscalePingWarning": "Для того чтобы использовать монитор Tailscale Ping, необходимо установить Uptime Kuma без Docker, а также установить на сервер клиент Tailscale."
|
||||
}
|
||||
|
@@ -833,10 +833,5 @@
|
||||
"Check/Uncheck": "İşaretle/İşareti Kaldır",
|
||||
"pushDeerServerDescription": "Resmi sunucuyu kullanmak için boş bırakın",
|
||||
"Request Timeout": "İstek zaman aşımına uğradı",
|
||||
"timeoutAfter": "{0} saniye sonra zaman aşımı",
|
||||
"gamedigGuessPort": "Gamedig: Ziyaretçi Portu",
|
||||
"gamedigGuessPortDescription": "Valve Server Sorgu Protokolü tarafından kullanılan bağlantı noktası, istemci bağlantı noktasından farklı olabilir. Monitör sunucunuza bağlanamıyorsa bunu deneyin.",
|
||||
"styleElapsedTimeShowNoLine": "Göster (Satır Yok)",
|
||||
"styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre",
|
||||
"styleElapsedTimeShowWithLine": "Göster (Satır ile birlikte)"
|
||||
"timeoutAfter": "{0} saniye sonra zaman aşımı"
|
||||
}
|
||||
|
@@ -835,10 +835,5 @@
|
||||
"pushDeerServerDescription": "留空则使用官方服务器",
|
||||
"PushDeer Server": "PushDeer 服务器",
|
||||
"timeoutAfter": "{0} 秒后超时",
|
||||
"Request Timeout": "请求超时",
|
||||
"gamedigGuessPortDescription": "Valve 服务器查询协议使用的端口可能与客户端端口不同。如果监控器无法连接到服务器,请尝试此方法。",
|
||||
"gamedigGuessPort": "Gamedig: 自动检测端口号",
|
||||
"styleElapsedTimeShowWithLine": "显示(带连接线)",
|
||||
"styleElapsedTimeShowNoLine": "显示(不带连接线)",
|
||||
"styleElapsedTime": "在监控项详情的心跳栏下显示起止时间"
|
||||
"Request Timeout": "请求超时"
|
||||
}
|
||||
|
@@ -23,17 +23,17 @@
|
||||
</div>
|
||||
|
||||
<div class="form-floating mt-3">
|
||||
<input id="floatingInput" v-model="username" type="text" class="form-control" :placeholder="$t('Username')" required data-cy="username-input">
|
||||
<input id="floatingInput" v-model="username" type="text" class="form-control" placeholder="Username" required data-cy="username-input">
|
||||
<label for="floatingInput">{{ $t("Username") }}</label>
|
||||
</div>
|
||||
|
||||
<div class="form-floating mt-3">
|
||||
<input id="floatingPassword" v-model="password" type="password" class="form-control" :placeholder="$t('Password')" required data-cy="password-input">
|
||||
<input id="floatingPassword" v-model="password" type="password" class="form-control" placeholder="Password" required data-cy="password-input">
|
||||
<label for="floatingPassword">{{ $t("Password") }}</label>
|
||||
</div>
|
||||
|
||||
<div class="form-floating mt-3">
|
||||
<input id="repeat" v-model="repeatPassword" type="password" class="form-control" :placeholder="$t('Repeat Password')" required data-cy="password-repeat-input">
|
||||
<input id="repeat" v-model="repeatPassword" type="password" class="form-control" placeholder="Repeat Password" required data-cy="password-repeat-input">
|
||||
<label for="repeat">{{ $t("Repeat Password") }}</label>
|
||||
</div>
|
||||
|
||||
|
Reference in New Issue
Block a user