mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-06-07 13:32:35 +02:00
Merge branch 'master' into docker-update
This commit is contained in:
commit
1e5718f3c6
27 changed files with 275 additions and 143 deletions
|
@ -2,6 +2,8 @@
|
||||||
/dist
|
/dist
|
||||||
/node_modules
|
/node_modules
|
||||||
/data
|
/data
|
||||||
|
/test
|
||||||
|
/kubernetes
|
||||||
/.do
|
/.do
|
||||||
**/.dockerignore
|
**/.dockerignore
|
||||||
**/.git
|
**/.git
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
root: true,
|
||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
commonjs: true,
|
commonjs: true,
|
||||||
|
|
10
README.md
10
README.md
|
@ -107,11 +107,13 @@ If you love this project, please consider giving me a ⭐.
|
||||||
|
|
||||||
## 🗣️ Discussion
|
## 🗣️ Discussion
|
||||||
|
|
||||||
You can also discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues).
|
### Issues Page
|
||||||
|
You can discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues).
|
||||||
|
|
||||||
Alternatively, you can discuss in my original post on reddit: https://www.reddit.com/r/selfhosted/comments/oi7dc7/uptime_kuma_a_fancy_selfhosted_monitoring_tool_an/
|
### Subreddit
|
||||||
|
My Reddit account: louislamlam
|
||||||
I think the real "Discussion" tab is hard to use, as it is reddit-like flow, I always missed new comments.
|
You can mention me if you ask question on Reddit.
|
||||||
|
https://www.reddit.com/r/UptimeKuma/
|
||||||
|
|
||||||
## Contribute
|
## Contribute
|
||||||
|
|
||||||
|
|
17
dockerfile
17
dockerfile
|
@ -10,19 +10,19 @@ RUN apt update && \
|
||||||
npm install mapbox/node-sqlite3#593c9d --build-from-source
|
npm install mapbox/node-sqlite3#593c9d --build-from-source
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm install --legacy-peer-deps && npm run build && npm prune --production
|
RUN npm install --legacy-peer-deps && \
|
||||||
|
npm run build && \
|
||||||
|
npm prune --production && \
|
||||||
|
chmod +x /app/extra/entrypoint.sh
|
||||||
|
|
||||||
|
|
||||||
FROM node:14-buster-slim AS release
|
FROM node:14-buster-slim AS release
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install Apprise,
|
# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv
|
||||||
# add sqlite3 cli for debugging in the future
|
|
||||||
# iputils-ping for ping
|
|
||||||
RUN apt update && \
|
RUN apt update && \
|
||||||
apt --yes install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
|
apt --yes install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
|
||||||
sqlite3 \
|
sqlite3 iputils-ping util-linux dumb-init && \
|
||||||
iputils-ping \
|
|
||||||
dumb-init && \
|
|
||||||
pip3 --no-cache-dir install apprise && \
|
pip3 --no-cache-dir install apprise && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
@ -32,7 +32,8 @@ COPY --from=build /app /app
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
VOLUME ["/app/data"]
|
VOLUME ["/app/data"]
|
||||||
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
|
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
|
||||||
CMD ["/usr/bin/dumb-init", "node", "server/server.js"]
|
ENTRYPOINT ["/usr/bin/dumb-init", "-v", "--", "extra/entrypoint.sh"]
|
||||||
|
CMD ["node", "server/server.js"]
|
||||||
|
|
||||||
FROM release AS nightly
|
FROM release AS nightly
|
||||||
RUN npm run mark-as-nightly
|
RUN npm run mark-as-nightly
|
||||||
|
|
|
@ -4,22 +4,25 @@ WORKDIR /app
|
||||||
|
|
||||||
# split the sqlite install here, so that it can caches the arm prebuilt
|
# split the sqlite install here, so that it can caches the arm prebuilt
|
||||||
RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev git && \
|
RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev git && \
|
||||||
ln -s /usr/bin/python3 /usr/bin/python && \
|
ln -s /usr/bin/python3 /usr/bin/python && \
|
||||||
npm install mapbox/node-sqlite3#593c9d && \
|
npm install mapbox/node-sqlite3#593c9d && \
|
||||||
apk del .build-deps && \
|
apk del .build-deps && \
|
||||||
rm -f /usr/bin/python
|
rm -f /usr/bin/python
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm install --legacy-peer-deps && npm run build && npm prune --production
|
RUN npm install --legacy-peer-deps && \
|
||||||
|
npm run build && \
|
||||||
|
npm prune --production && \
|
||||||
|
chmod +x /app/extra/entrypoint.sh
|
||||||
|
|
||||||
|
|
||||||
FROM node:14-alpine3.12 AS release
|
FROM node:14-alpine3.12 AS release
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install apprise
|
# Install apprise, iputils for non-root ping, setpriv
|
||||||
RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib dumb-init && \
|
RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
|
||||||
pip3 --no-cache-dir install apprise && \
|
pip3 --no-cache-dir install apprise && \
|
||||||
rm -rf /root/.cache
|
rm -rf /root/.cache
|
||||||
|
|
||||||
# Copy app files from build layer
|
# Copy app files from build layer
|
||||||
COPY --from=build /app /app
|
COPY --from=build /app /app
|
||||||
|
@ -27,7 +30,8 @@ COPY --from=build /app /app
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
VOLUME ["/app/data"]
|
VOLUME ["/app/data"]
|
||||||
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
|
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
|
||||||
CMD ["/usr/bin/dumb-init", "node", "server/server.js"]
|
ENTRYPOINT ["/usr/bin/dumb-init", "-v", "--", "extra/entrypoint.sh"]
|
||||||
|
CMD ["node", "server/server.js"]
|
||||||
|
|
||||||
FROM release AS nightly
|
FROM release AS nightly
|
||||||
RUN npm run mark-as-nightly
|
RUN npm run mark-as-nightly
|
||||||
|
|
21
extra/entrypoint.sh
Normal file
21
extra/entrypoint.sh
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
# set -e Exit the script if an error happens
|
||||||
|
set -e
|
||||||
|
PUID=${PUID=1000}
|
||||||
|
PGID=${PGID=1000}
|
||||||
|
|
||||||
|
files_ownership () {
|
||||||
|
# -h Changes the ownership of an encountered symbolic link and not that of the file or directory pointed to by the symbolic link.
|
||||||
|
# -R Recursively descends the specified directories
|
||||||
|
# -c Like verbose but report only when a change is made
|
||||||
|
chown -hRc "$PUID":"$PGID" /app/data
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "==> Performing startup jobs and maintenance tasks"
|
||||||
|
files_ownership
|
||||||
|
|
||||||
|
echo "==> Starting application with user $PUID group $PGID"
|
||||||
|
|
||||||
|
# --clear-groups Clear supplementary groups.
|
||||||
|
exec setpriv --reuid "$PUID" --regid "$PGID" --clear-groups "$@"
|
|
@ -1,4 +1,4 @@
|
||||||
// Need to use es6 to read language files
|
// Need to use ES6 to read language files
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
@ -14,6 +14,7 @@ const copyRecursiveSync = function (src, dest) {
|
||||||
let exists = fs.existsSync(src);
|
let exists = fs.existsSync(src);
|
||||||
let stats = exists && fs.statSync(src);
|
let stats = exists && fs.statSync(src);
|
||||||
let isDirectory = exists && stats.isDirectory();
|
let isDirectory = exists && stats.isDirectory();
|
||||||
|
|
||||||
if (isDirectory) {
|
if (isDirectory) {
|
||||||
fs.mkdirSync(dest);
|
fs.mkdirSync(dest);
|
||||||
fs.readdirSync(src).forEach(function (childItemName) {
|
fs.readdirSync(src).forEach(function (childItemName) {
|
||||||
|
@ -24,8 +25,9 @@ const copyRecursiveSync = function (src, dest) {
|
||||||
fs.copyFileSync(src, dest);
|
fs.copyFileSync(src, dest);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
console.log(process.argv)
|
|
||||||
const baseLangCode = process.argv[2] || "zh-HK";
|
console.log("Arguments:", process.argv)
|
||||||
|
const baseLangCode = process.argv[2] || "en";
|
||||||
console.log("Base Lang: " + baseLangCode);
|
console.log("Base Lang: " + baseLangCode);
|
||||||
fs.rmdirSync("./languages", { recursive: true });
|
fs.rmdirSync("./languages", { recursive: true });
|
||||||
copyRecursiveSync("../../src/languages", "./languages");
|
copyRecursiveSync("../../src/languages", "./languages");
|
||||||
|
@ -33,46 +35,50 @@ copyRecursiveSync("../../src/languages", "./languages");
|
||||||
const en = (await import("./languages/en.js")).default;
|
const en = (await import("./languages/en.js")).default;
|
||||||
const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
|
const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
|
||||||
const files = fs.readdirSync("./languages");
|
const files = fs.readdirSync("./languages");
|
||||||
console.log(files);
|
console.log("Files:", files);
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
if (file.endsWith(".js")) {
|
if (!file.endsWith(".js")) {
|
||||||
console.log("Processing " + file);
|
console.log("Skipping " + file)
|
||||||
const lang = await import("./languages/" + file);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let obj;
|
console.log("Processing " + file);
|
||||||
|
const lang = await import("./languages/" + file);
|
||||||
|
|
||||||
if (lang.default) {
|
let obj;
|
||||||
console.log("is js module");
|
|
||||||
obj = lang.default;
|
if (lang.default) {
|
||||||
} else {
|
obj = lang.default;
|
||||||
console.log("empty file");
|
} else {
|
||||||
obj = {
|
console.log("Empty file");
|
||||||
languageName: "<Your Language name in your language (not in English)>"
|
obj = {
|
||||||
};
|
languageName: "<Your Language name in your language (not in English)>"
|
||||||
}
|
};
|
||||||
|
}
|
||||||
// En first
|
|
||||||
for (const key in en) {
|
// En first
|
||||||
if (! obj[key]) {
|
for (const key in en) {
|
||||||
obj[key] = en[key];
|
if (! obj[key]) {
|
||||||
}
|
obj[key] = en[key];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseLang !== en) {
|
||||||
// Base second
|
// Base second
|
||||||
for (const key in baseLang) {
|
for (const key in baseLang) {
|
||||||
if (! obj[key]) {
|
if (! obj[key]) {
|
||||||
obj[key] = key;
|
obj[key] = key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const code = "export default " + util.inspect(obj, {
|
|
||||||
depth: null,
|
|
||||||
});
|
|
||||||
|
|
||||||
fs.writeFileSync(`../../src/languages/${file}`, code);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const code = "export default " + util.inspect(obj, {
|
||||||
|
depth: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(`../../src/languages/${file}`, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.rmdirSync("./languages", { recursive: true });
|
fs.rmdirSync("./languages", { recursive: true });
|
||||||
console.log("Done, fix the format by eslint now");
|
console.log("Done. Fixing formatting by ESLint...");
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
|
||||||
|
<link rel="manifest" href="manifest.json" />
|
||||||
<meta name="theme-color" id="theme-color" content="" />
|
<meta name="theme-color" id="theme-color" content="" />
|
||||||
<meta name="description" content="Uptime Kuma monitoring tool" />
|
<meta name="description" content="Uptime Kuma monitoring tool" />
|
||||||
<title>Uptime Kuma</title>
|
<title>Uptime Kuma</title>
|
||||||
|
|
|
@ -34,8 +34,10 @@
|
||||||
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
|
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
|
||||||
"test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .",
|
"test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .",
|
||||||
"test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .",
|
"test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .",
|
||||||
|
"test-nodejs16": "docker build --progress plain -f test/ubuntu-nodejs16.dockerfile .",
|
||||||
"simple-dns-server": "node extra/simple-dns-server.js",
|
"simple-dns-server": "node extra/simple-dns-server.js",
|
||||||
"update-language-files": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix"
|
"update-language-files_old": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix",
|
||||||
|
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||||
|
|
BIN
public/icon-192x192.png
Normal file
BIN
public/icon-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
BIN
public/icon-512x512.png
Normal file
BIN
public/icon-512x512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
19
public/manifest.json
Normal file
19
public/manifest.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Uptime Kuma",
|
||||||
|
"short_name": "Uptime Kuma",
|
||||||
|
"start_url": "/",
|
||||||
|
"background_color": "#fff",
|
||||||
|
"display": "standalone",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "icon-512x512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -55,7 +55,7 @@
|
||||||
<div class="w-50 pe-2">
|
<div class="w-50 pe-2">
|
||||||
<input v-model="newDraftTag.name" class="form-control"
|
<input v-model="newDraftTag.name" class="form-control"
|
||||||
:class="{'is-invalid': validateDraftTag.nameInvalid}"
|
:class="{'is-invalid': validateDraftTag.nameInvalid}"
|
||||||
:placeholder="$t('name')"
|
:placeholder="$t('Name')"
|
||||||
@keydown.enter.prevent="onEnter"
|
@keydown.enter.prevent="onEnter"
|
||||||
/>
|
/>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# How to translate
|
# How to translate
|
||||||
|
|
||||||
1. Fork this repo.
|
1. Fork this repo.
|
||||||
2. Create a language file. (e.g. `zh-TW.js`) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
|
2. Create a language file (e.g. `zh-TW.js`). The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
|
||||||
3. `npm run update-language-files --base-lang=de-DE`
|
3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
|
||||||
4. Your language file should be filled in. You can translate now.
|
4. Your language file should be filled in. You can translate now.
|
||||||
5. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
|
5. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
|
||||||
6. Import your language file in `src/i18n.js` and add it to `languageList` constant.
|
6. Import your language file in `src/i18n.js` and add it to `languageList` constant.
|
||||||
|
|
|
@ -113,9 +113,6 @@ export default {
|
||||||
"Create your admin account": "Erstelle dein Admin Konto",
|
"Create your admin account": "Erstelle dein Admin Konto",
|
||||||
"Repeat Password": "Wiederhole das Passwort",
|
"Repeat Password": "Wiederhole das Passwort",
|
||||||
"Resource Record Type": "Resource Record Type",
|
"Resource Record Type": "Resource Record Type",
|
||||||
"Export": "Export",
|
|
||||||
"Import": "Import",
|
|
||||||
"Import/Export Backup": "Import/Export Backup",
|
|
||||||
Export: "Export",
|
Export: "Export",
|
||||||
Import: "Import",
|
Import: "Import",
|
||||||
respTime: "Antw. Zeit (ms)",
|
respTime: "Antw. Zeit (ms)",
|
||||||
|
@ -133,8 +130,8 @@ export default {
|
||||||
"Clear all statistics": "Lösche alle Statistiken",
|
"Clear all statistics": "Lösche alle Statistiken",
|
||||||
importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
|
importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
|
||||||
"Skip existing": "Vorhandene überspringen",
|
"Skip existing": "Vorhandene überspringen",
|
||||||
"Overwrite": "Überschreiben",
|
Overwrite: "Überschreiben",
|
||||||
"Options": "Optionen",
|
Options: "Optionen",
|
||||||
confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import Option ausgewählt ist.",
|
confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import Option ausgewählt ist.",
|
||||||
"Keep both": "Beide behalten",
|
"Keep both": "Beide behalten",
|
||||||
twoFAVerifyLabel: "Bitte trage deinen Token ein um zu verifizieren das 2FA funktioniert",
|
twoFAVerifyLabel: "Bitte trage deinen Token ein um zu verifizieren das 2FA funktioniert",
|
||||||
|
@ -151,7 +148,6 @@ export default {
|
||||||
Inactive: "Inaktiv",
|
Inactive: "Inaktiv",
|
||||||
Token: "Token",
|
Token: "Token",
|
||||||
"Show URI": "URI Anzeigen",
|
"Show URI": "URI Anzeigen",
|
||||||
"Clear all statistics": "Lösche alle Statistiken",
|
|
||||||
Tags: "Tags",
|
Tags: "Tags",
|
||||||
"Add New below or Select...": "Füge neuen hinzu oder wähle aus...",
|
"Add New below or Select...": "Füge neuen hinzu oder wähle aus...",
|
||||||
"Tag with this name already exist.": "Ein Tag mit dem Namen existiert bereits.",
|
"Tag with this name already exist.": "Ein Tag mit dem Namen existiert bereits.",
|
||||||
|
@ -167,4 +163,8 @@ export default {
|
||||||
Purple: "Lila",
|
Purple: "Lila",
|
||||||
Pink: "Pink",
|
Pink: "Pink",
|
||||||
"Search...": "Suchen...",
|
"Search...": "Suchen...",
|
||||||
|
"Heartbeat Retry Interval": "Takt-Wiederholungsintervall",
|
||||||
|
retryCheckEverySecond: "Versuche alle {0} Sekunden",
|
||||||
|
"Import Backup": "Import Backup",
|
||||||
|
"Export Backup": "Export Backup",
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,8 +139,8 @@ export default {
|
||||||
alertWrongFileType: "Please select a JSON file.",
|
alertWrongFileType: "Please select a JSON file.",
|
||||||
"Clear all statistics": "Clear all Statistics",
|
"Clear all statistics": "Clear all Statistics",
|
||||||
"Skip existing": "Skip existing",
|
"Skip existing": "Skip existing",
|
||||||
"Overwrite": "Overwrite",
|
Overwrite: "Overwrite",
|
||||||
"Options": "Options",
|
Options: "Options",
|
||||||
"Keep both": "Keep both",
|
"Keep both": "Keep both",
|
||||||
"Verify Token": "Verify Token",
|
"Verify Token": "Verify Token",
|
||||||
"Setup 2FA": "Setup 2FA",
|
"Setup 2FA": "Setup 2FA",
|
||||||
|
@ -152,7 +152,6 @@ export default {
|
||||||
Inactive: "Inactive",
|
Inactive: "Inactive",
|
||||||
Token: "Token",
|
Token: "Token",
|
||||||
"Show URI": "Show URI",
|
"Show URI": "Show URI",
|
||||||
"Clear all statistics": "Clear all Statistics",
|
|
||||||
Tags: "Tags",
|
Tags: "Tags",
|
||||||
"Add New below or Select...": "Add New below or Select...",
|
"Add New below or Select...": "Add New below or Select...",
|
||||||
"Tag with this name already exist.": "Tag with this name already exist.",
|
"Tag with this name already exist.": "Tag with this name already exist.",
|
||||||
|
|
|
@ -32,7 +32,7 @@ export default {
|
||||||
Up: "Funcional",
|
Up: "Funcional",
|
||||||
Down: "Caído",
|
Down: "Caído",
|
||||||
Pending: "Pendiente",
|
Pending: "Pendiente",
|
||||||
Unknown: "Desconociso",
|
Unknown: "Desconocido",
|
||||||
Pause: "Pausa",
|
Pause: "Pausa",
|
||||||
Name: "Nombre",
|
Name: "Nombre",
|
||||||
Status: "Estado",
|
Status: "Estado",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
export default {
|
export default {
|
||||||
languageName: "Italiano (Italian)",
|
languageName: "Italiano (Italian)",
|
||||||
checkEverySecond: "controlla ogni {0} secondi",
|
checkEverySecond: "controlla ogni {0} secondi",
|
||||||
|
retryCheckEverySecond: "Riprova ogni {0} secondi.",
|
||||||
"Avg.": "Media",
|
"Avg.": "Media",
|
||||||
retriesDescription: "Tentativi da fare prima che il servizio venga marcato come \"giù\" e che una notifica venga inviata.",
|
retriesDescription: "Tentativi da fare prima che il servizio venga marcato come \"giù\" e che una notifica venga inviata.",
|
||||||
ignoreTLSError: "Ignora gli errori TLS/SSL per i siti in HTTPS.",
|
ignoreTLSError: "Ignora gli errori TLS/SSL per i siti in HTTPS.",
|
||||||
|
@ -20,6 +21,8 @@ export default {
|
||||||
clearEventsMsg: "Si è certi di voler eliminare tutti gli eventi per questo servizio?",
|
clearEventsMsg: "Si è certi di voler eliminare tutti gli eventi per questo servizio?",
|
||||||
clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
|
clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
|
||||||
confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?",
|
confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?",
|
||||||
|
importHandleDescription: "Selezionare 'Ignora gli esistenti' si vuole ignorare l'importazione dei monitoraggi o delle notifiche con lo stesso nome. 'Sovrascrivi' eliminerà ogni monitoraggio e notifica esistente.",
|
||||||
|
confirmImportMsg: "Si è certi di voler importare il backup? Essere certi di aver selezionato l'opzione corretta di importazione.",
|
||||||
twoFAVerifyLabel: "Scrivi il token per verificare che l'autenticazione a due fattori funzioni",
|
twoFAVerifyLabel: "Scrivi il token per verificare che l'autenticazione a due fattori funzioni",
|
||||||
tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
|
tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
|
||||||
confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
|
confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
|
||||||
|
@ -68,6 +71,7 @@ export default {
|
||||||
Port: "Porta",
|
Port: "Porta",
|
||||||
"Heartbeat Interval": "Intervallo di controllo",
|
"Heartbeat Interval": "Intervallo di controllo",
|
||||||
Retries: "Tentativi",
|
Retries: "Tentativi",
|
||||||
|
"Heartbeat Retry Interval": "Intervallo tra un tentativo di controllo e l'altro",
|
||||||
Advanced: "Avanzate",
|
Advanced: "Avanzate",
|
||||||
"Upside Down Mode": "Modalità capovolta",
|
"Upside Down Mode": "Modalità capovolta",
|
||||||
"Max. Redirects": "Redirezionamenti massimi",
|
"Max. Redirects": "Redirezionamenti massimi",
|
||||||
|
@ -115,7 +119,8 @@ export default {
|
||||||
"Last Result": "Ultimo risultato",
|
"Last Result": "Ultimo risultato",
|
||||||
"Create your admin account": "Crea l'account amministratore",
|
"Create your admin account": "Crea l'account amministratore",
|
||||||
"Repeat Password": "Ripeti Password",
|
"Repeat Password": "Ripeti Password",
|
||||||
"Import/Export Backup": "Importa/Esporta Backup",
|
"Import Backup": "Importa Backup",
|
||||||
|
"Export Backup": "Esporta Backup",
|
||||||
Export: "Esporta",
|
Export: "Esporta",
|
||||||
Import: "Importa",
|
Import: "Importa",
|
||||||
respTime: "Tempo di Risposta (ms)",
|
respTime: "Tempo di Risposta (ms)",
|
||||||
|
@ -127,12 +132,16 @@ export default {
|
||||||
Events: "Eventi",
|
Events: "Eventi",
|
||||||
Heartbeats: "Controlli",
|
Heartbeats: "Controlli",
|
||||||
"Auto Get": "Auto Get",
|
"Auto Get": "Auto Get",
|
||||||
"Also apply to existing monitors": "Also apply to existing monitors",
|
|
||||||
backupDescription: "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
|
backupDescription: "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
|
||||||
backupDescription2: "P.S.: lo storico e i dati relativi agli eventi non saranno inclusi.",
|
backupDescription2: "P.S.: lo storico e i dati relativi agli eventi non saranno inclusi.",
|
||||||
backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, tenere quindi in un luogo sicuro.",
|
backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, tenere quindi in un luogo sicuro.",
|
||||||
alertNoFile: "Selezionare il file da importare.",
|
alertNoFile: "Selezionare il file da importare.",
|
||||||
alertWrongFileType: "Selezionare un file JSON.",
|
alertWrongFileType: "Selezionare un file JSON.",
|
||||||
|
"Clear all statistics": "Pulisci tutte le statistiche",
|
||||||
|
"Skip existing": "Ignora gli esistenti",
|
||||||
|
Overwrite: "Sovrascrivi",
|
||||||
|
Options: "Opzioni",
|
||||||
|
"Keep both": "Mantieni entrambi",
|
||||||
"Verify Token": "Verifica Token",
|
"Verify Token": "Verifica Token",
|
||||||
"Setup 2FA": "Imposta l'autenticazione a due fattori",
|
"Setup 2FA": "Imposta l'autenticazione a due fattori",
|
||||||
"Enable 2FA": "Abilita l'autenticazione a due fattori",
|
"Enable 2FA": "Abilita l'autenticazione a due fattori",
|
||||||
|
@ -143,7 +152,6 @@ export default {
|
||||||
Inactive: "Disattivata",
|
Inactive: "Disattivata",
|
||||||
Token: "Token",
|
Token: "Token",
|
||||||
"Show URI": "Mostra URI",
|
"Show URI": "Mostra URI",
|
||||||
"Clear all statistics": "Pulisci tutte le statistiche",
|
|
||||||
Tags: "Etichette",
|
Tags: "Etichette",
|
||||||
"Add New below or Select...": "Aggiungine una oppure scegli...",
|
"Add New below or Select...": "Aggiungine una oppure scegli...",
|
||||||
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
|
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
|
||||||
|
|
|
@ -115,7 +115,6 @@ export default {
|
||||||
"Last Result": "Laatste resultaat",
|
"Last Result": "Laatste resultaat",
|
||||||
"Create your admin account": "Maak uw beheerdersaccount aan",
|
"Create your admin account": "Maak uw beheerdersaccount aan",
|
||||||
"Repeat Password": "Herhaal wachtwoord",
|
"Repeat Password": "Herhaal wachtwoord",
|
||||||
"Import/Export Backup": "Backup importeren/exporteren",
|
|
||||||
Export: "Exporteren",
|
Export: "Exporteren",
|
||||||
Import: "Importeren",
|
Import: "Importeren",
|
||||||
respTime: "resp. tijd (ms)",
|
respTime: "resp. tijd (ms)",
|
||||||
|
|
|
@ -110,37 +110,62 @@ export default {
|
||||||
respTime: "Czas odp. (ms)",
|
respTime: "Czas odp. (ms)",
|
||||||
notAvailableShort: "N/A",
|
notAvailableShort: "N/A",
|
||||||
Create: "Stwórz",
|
Create: "Stwórz",
|
||||||
clearEventsMsg: "Are you sure want to delete all events for this monitor?",
|
clearEventsMsg: "Jesteś pewien, że chcesz usunąć wszystkie monitory dla tej strony?",
|
||||||
clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
|
clearHeartbeatsMsg: "Jesteś pewien, że chcesz usunąć wszystkie bicia serca dla tego monitora?",
|
||||||
confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
|
confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
|
||||||
"Clear Data": "Clear Data",
|
"Clear Data": "Usuń dane",
|
||||||
Events: "Events",
|
Events: "Wydarzenia",
|
||||||
Heartbeats: "Heartbeats",
|
Heartbeats: "Bicia serca",
|
||||||
"Auto Get": "Auto Get",
|
"Auto Get": "Pobierz automatycznie",
|
||||||
enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
|
enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
|
||||||
"Default enabled": "Default enabled",
|
"Default enabled": "Domyślnie włączone",
|
||||||
"Also apply to existing monitors": "Also apply to existing monitors",
|
"Also apply to existing monitors": "Również zastosuj do obecnych monitorów",
|
||||||
Export: "Export",
|
Export: "Eksportuj",
|
||||||
Import: "Import",
|
Import: "Importuj",
|
||||||
backupDescription: "You can backup all monitors and all notifications into a JSON file.",
|
backupDescription: "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
|
||||||
backupDescription2: "PS: History and event data is not included.",
|
backupDescription2: "PS: Historia i dane zdarzeń nie są uwzględniane.",
|
||||||
backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
|
backupDescription3: "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
|
||||||
alertNoFile: "Please select a file to import.",
|
alertNoFile: "Proszę wybrać plik do importu.",
|
||||||
alertWrongFileType: "Please select a JSON file.",
|
alertWrongFileType: "Proszę wybrać plik JSON.",
|
||||||
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
|
twoFAVerifyLabel: "Proszę podaj swój token 2FA, aby sprawdzić czy 2FA działa",
|
||||||
tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
|
tokenValidSettingsMsg: "Token jest poprawny! Możesz teraz zapisać ustawienia 2FA.",
|
||||||
confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
|
confirmEnableTwoFAMsg: "Jesteś pewien że chcesz włączyć 2FA?",
|
||||||
confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
|
confirmDisableTwoFAMsg: "Jesteś pewien że chcesz wyłączyć 2FA?",
|
||||||
"Apply on all existing monitors": "Apply on all existing monitors",
|
"Apply on all existing monitors": "Zastosuj do wszystki obecnych monitorów",
|
||||||
"Verify Token": "Verify Token",
|
"Verify Token": "Weryfikuj token",
|
||||||
"Setup 2FA": "Setup 2FA",
|
"Setup 2FA": "Konfiguracja 2FA",
|
||||||
"Enable 2FA": "Enable 2FA",
|
"Enable 2FA": "Włącz 2FA",
|
||||||
"Disable 2FA": "Disable 2FA",
|
"Disable 2FA": "Wyłącz 2FA",
|
||||||
"2FA Settings": "2FA Settings",
|
"2FA Settings": "Ustawienia 2FA",
|
||||||
"Two Factor Authentication": "Two Factor Authentication",
|
"Two Factor Authentication": "Uwierzytelnienie dwuskładnikowe",
|
||||||
Active: "Active",
|
Active: "Włączone",
|
||||||
Inactive: "Inactive",
|
Inactive: "Wyłączone",
|
||||||
Token: "Token",
|
Token: "Token",
|
||||||
"Show URI": "Show URI",
|
"Show URI": "Pokaż URI",
|
||||||
"Clear all statistics": "Clear all Statistics",
|
"Clear all statistics": "Wyczyść wszystkie statystyki",
|
||||||
|
retryCheckEverySecond: "Ponawiaj co {0} sekund.",
|
||||||
|
importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
|
||||||
|
confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
|
||||||
|
"Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
|
||||||
|
"Import Backup": "Importuj kopię zapasową",
|
||||||
|
"Export Backup": "Eksportuj kopię zapasową",
|
||||||
|
"Skip existing": "Pomiń istniejące",
|
||||||
|
Overwrite: "Nadpisz",
|
||||||
|
Options: "Opcje",
|
||||||
|
"Keep both": "Zachowaj oba",
|
||||||
|
Tags: "Tagi",
|
||||||
|
"Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
|
||||||
|
"Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
|
||||||
|
"Tag with this value already exist.": "Tag o tej wartości już istnieje.",
|
||||||
|
color: "kolor",
|
||||||
|
"value (optional)": "wartość (opcjonalnie)",
|
||||||
|
Gray: "Szary",
|
||||||
|
Red: "Czerwony",
|
||||||
|
Orange: "Pomarańczowy",
|
||||||
|
Green: "Zielony",
|
||||||
|
Blue: "Niebieski",
|
||||||
|
Indigo: "Indygo",
|
||||||
|
Purple: "Fioletowy",
|
||||||
|
Pink: "Różowy",
|
||||||
|
"Search...": "Szukaj...",
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,40 +107,65 @@ export default {
|
||||||
"Last Result": "Последний результат",
|
"Last Result": "Последний результат",
|
||||||
"Create your admin account": "Создайте аккаунт администратора",
|
"Create your admin account": "Создайте аккаунт администратора",
|
||||||
"Repeat Password": "Повторите пароль",
|
"Repeat Password": "Повторите пароль",
|
||||||
respTime: "Resp. Time (ms)",
|
respTime: "Время ответа (мс)",
|
||||||
notAvailableShort: "N/A",
|
notAvailableShort: "Н/Д",
|
||||||
Create: "Create",
|
Create: "Создать",
|
||||||
clearEventsMsg: "Are you sure want to delete all events for this monitor?",
|
clearEventsMsg: "Вы действительно хотите удалить всю статистику событий данного монитора?",
|
||||||
clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
|
clearHeartbeatsMsg: "Вы действительно хотите удалить всю статистику опросов данного монитора?",
|
||||||
confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
|
confirmClearStatisticsMsg: "Вы действительно хотите удалить ВСЮ статистику?",
|
||||||
"Clear Data": "Clear Data",
|
"Clear Data": "Очистить статистику",
|
||||||
Events: "Events",
|
Events: "События",
|
||||||
Heartbeats: "Heartbeats",
|
Heartbeats: "Опросы",
|
||||||
"Auto Get": "Auto Get",
|
"Auto Get": "Авто-получение",
|
||||||
enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
|
enableDefaultNotificationDescription: "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
|
||||||
"Default enabled": "Default enabled",
|
"Default enabled": "Использовать по умолчанию",
|
||||||
"Also apply to existing monitors": "Also apply to existing monitors",
|
"Also apply to existing monitors": "Применить к существующим мониторам",
|
||||||
Export: "Export",
|
Export: "Экспорт",
|
||||||
Import: "Import",
|
Import: "Импорт",
|
||||||
backupDescription: "You can backup all monitors and all notifications into a JSON file.",
|
backupDescription: "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
|
||||||
backupDescription2: "PS: History and event data is not included.",
|
backupDescription2: "P.S.: История и события сохранены не будут.",
|
||||||
backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
|
backupDescription3: "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте.",
|
||||||
alertNoFile: "Please select a file to import.",
|
alertNoFile: "Выберите файл для импорта.",
|
||||||
alertWrongFileType: "Please select a JSON file.",
|
alertWrongFileType: "Выберите JSON-файл.",
|
||||||
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
|
twoFAVerifyLabel: "Пожалуйста, введите свой токен, чтобы проверить работу 2FA",
|
||||||
tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
|
tokenValidSettingsMsg: "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
|
||||||
confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
|
confirmEnableTwoFAMsg: "Вы действительно хотите включить 2FA?",
|
||||||
confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
|
confirmDisableTwoFAMsg: "Вы действительно хотите выключить 2FA?",
|
||||||
"Apply on all existing monitors": "Apply on all existing monitors",
|
"Apply on all existing monitors": "Применить ко всем существующим мониторам",
|
||||||
"Verify Token": "Verify Token",
|
"Verify Token": "Проверить токен",
|
||||||
"Setup 2FA": "Setup 2FA",
|
"Setup 2FA": "Настройка 2FA",
|
||||||
"Enable 2FA": "Enable 2FA",
|
"Enable 2FA": "Включить 2FA",
|
||||||
"Disable 2FA": "Disable 2FA",
|
"Disable 2FA": "Выключить 2FA",
|
||||||
"2FA Settings": "2FA Settings",
|
"2FA Settings": "Настройки 2FA",
|
||||||
"Two Factor Authentication": "Two Factor Authentication",
|
"Two Factor Authentication": "Двухфакторная аутентификация",
|
||||||
Active: "Active",
|
Active: "Активно",
|
||||||
Inactive: "Inactive",
|
Inactive: "Неактивно",
|
||||||
Token: "Token",
|
Token: "Токен",
|
||||||
"Show URI": "Show URI",
|
"Show URI": "Показать URI",
|
||||||
"Clear all statistics": "Clear all Statistics",
|
"Clear all statistics": "Очистить всю статистику",
|
||||||
|
retryCheckEverySecond: "Повторять каждые {0} секунд.",
|
||||||
|
importHandleDescription: "Выберите 'Пропустить существующие' если вы хотите пропустить каждый монитор или уведомление с таким же именем. 'Перезаписать' удалит каждый существующий монитор или уведомление.",
|
||||||
|
confirmImportMsg: "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
|
||||||
|
"Heartbeat Retry Interval": "Интервал повтора опроса",
|
||||||
|
"Import Backup": "Импорт резервной копии",
|
||||||
|
"Export Backup": "Экспорт резервной копии",
|
||||||
|
"Skip existing": "Пропустить существующие",
|
||||||
|
Overwrite: "Перезаписать",
|
||||||
|
Options: "Опции",
|
||||||
|
"Keep both": "Оставить оба",
|
||||||
|
Tags: "Теги",
|
||||||
|
"Add New below or Select...": "Добавить новое ниже или выбрать...",
|
||||||
|
"Tag with this name already exist.": "Такой тег уже существует.",
|
||||||
|
"Tag with this value already exist.": "Тег с таким значением уже существует.",
|
||||||
|
color: "цвет",
|
||||||
|
"value (optional)": "значение (опционально)",
|
||||||
|
Gray: "Серый",
|
||||||
|
Red: "Красный",
|
||||||
|
Orange: "Оранжевый",
|
||||||
|
Green: "Зелёный",
|
||||||
|
Blue: "Синий",
|
||||||
|
Indigo: "Индиго",
|
||||||
|
Purple: "Пурпурный",
|
||||||
|
Pink: "Розовый",
|
||||||
|
"Search...": "Поиск...",
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,5 +116,5 @@ export default {
|
||||||
"Clear Data": "Verileri Temizle",
|
"Clear Data": "Verileri Temizle",
|
||||||
Events: "Olaylar",
|
Events: "Olaylar",
|
||||||
Heartbeats: "Sağlık Durumları",
|
Heartbeats: "Sağlık Durumları",
|
||||||
"Auto Get": "Otomatik Al"
|
"Auto Get": "Otomatik Al",
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,6 @@ export default {
|
||||||
enableDefaultNotificationDescription: "新的监控项将默认启用,你也可以在每个监控项中分别设置",
|
enableDefaultNotificationDescription: "新的监控项将默认启用,你也可以在每个监控项中分别设置",
|
||||||
"Default enabled": "默认开启",
|
"Default enabled": "默认开启",
|
||||||
"Also apply to existing monitors": "应用到所有监控项",
|
"Also apply to existing monitors": "应用到所有监控项",
|
||||||
"Import/Export Backup": "导入/导出备份",
|
|
||||||
Export: "导出",
|
Export: "导出",
|
||||||
Import: "导入",
|
Import: "导入",
|
||||||
backupDescription: "你可以将所有的监控项和消息通知备份到一个 JSON 文件中",
|
backupDescription: "你可以将所有的监控项和消息通知备份到一个 JSON 文件中",
|
||||||
|
|
|
@ -120,7 +120,6 @@ export default {
|
||||||
enableDefaultNotificationDescription: "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
|
enableDefaultNotificationDescription: "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
|
||||||
"Default enabled": "預設通知",
|
"Default enabled": "預設通知",
|
||||||
"Also apply to existing monitors": "同時取用至目前所有監測器",
|
"Also apply to existing monitors": "同時取用至目前所有監測器",
|
||||||
"Import/Export Backup": "匯入/匯出 備份",
|
|
||||||
Export: "匯出",
|
Export: "匯出",
|
||||||
Import: "匯入",
|
Import: "匯入",
|
||||||
backupDescription: "您可以備份所有監測器及所有通知。",
|
backupDescription: "您可以備份所有監測器及所有通知。",
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
<!-- TCP Port / Ping / DNS only -->
|
<!-- TCP Port / Ping / DNS only -->
|
||||||
<div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' " class="my-3">
|
<div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' " class="my-3">
|
||||||
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
|
<label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
|
||||||
<input id="hostname" v-model="monitor.hostname" type="text" class="form-control" required>
|
<input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="ipRegexPattern || hostnameRegexPattern" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- For TCP Port Type -->
|
<!-- For TCP Port Type -->
|
||||||
|
@ -235,6 +235,9 @@ export default {
|
||||||
// Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
|
// Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
ipRegexPattern: "((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))",
|
ipRegexPattern: "((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))",
|
||||||
|
// Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
|
||||||
|
// eslint-disable-next-line
|
||||||
|
hostnameRegexPattern: "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -289,6 +289,12 @@
|
||||||
<p>Utilizzare con attenzione.</p>
|
<p>Utilizzare con attenzione.</p>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="$i18n.locale === 'ru-RU' ">
|
||||||
|
<p>Вы уверены, что хотите <strong>отключить авторизацию</strong>?</p>
|
||||||
|
<p>Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.</p>
|
||||||
|
<p>Пожалуйста, используйте с осторожностью.</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
<!-- English (en) -->
|
<!-- English (en) -->
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<p>Are you sure want to <strong>disable auth</strong>?</p>
|
<p>Are you sure want to <strong>disable auth</strong>?</p>
|
||||||
|
|
10
test/ubuntu-nodejs16.dockerfile
Normal file
10
test/ubuntu-nodejs16.dockerfile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
FROM ubuntu
|
||||||
|
WORKDIR /app
|
||||||
|
RUN apt update && apt --yes install git curl
|
||||||
|
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
|
||||||
|
RUN apt --yes install nodejs
|
||||||
|
RUN git clone https://github.com/louislam/uptime-kuma.git .
|
||||||
|
RUN npm run setup
|
||||||
|
|
||||||
|
# Option 1. Try it
|
||||||
|
RUN node server/server.js
|
Loading…
Add table
Reference in a new issue