mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-02-25 13:05:55 +00:00
fix:redirect /list on mobile to /dashboard when shrinking on computer
This commit is contained in:
parent
a6cb8584fc
commit
5f67a868cb
31 changed files with 42517 additions and 42498 deletions
54
.github/workflows/json-yaml-validate.yml
vendored
54
.github/workflows/json-yaml-validate.yml
vendored
|
@ -1,27 +1,27 @@
|
|||
name: json-yaml-validate
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 1.23.X
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write # enable write permissions for pull request comments
|
||||
|
||||
jobs:
|
||||
json-yaml-validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: json-yaml-validate
|
||||
id: json-yaml-validate
|
||||
uses: GrantBirki/json-yaml-validate@v2.4.0
|
||||
with:
|
||||
comment: "true" # enable comment mode
|
||||
exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions
|
||||
name: json-yaml-validate
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 1.23.X
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write # enable write permissions for pull request comments
|
||||
|
||||
jobs:
|
||||
json-yaml-validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: json-yaml-validate
|
||||
id: json-yaml-validate
|
||||
uses: GrantBirki/json-yaml-validate@v2.4.0
|
||||
with:
|
||||
comment: "true" # enable comment mode
|
||||
exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions
|
||||
|
|
|
@ -1,61 +1,61 @@
|
|||
# If the image changed, the second stage image should be changed too
|
||||
FROM node:20-bookworm-slim AS base2-slim
|
||||
ARG TARGETPLATFORM
|
||||
|
||||
# Specify --no-install-recommends to skip unused dependencies, make the base much smaller!
|
||||
# sqlite3 = for debugging
|
||||
# iputils-ping = for ping
|
||||
# util-linux = for setpriv (Should be dropped in 2.0.0?)
|
||||
# dumb-init = avoid zombie processes (#480)
|
||||
# curl = for debugging
|
||||
# ca-certificates = keep the cert up-to-date
|
||||
# sudo = for start service nscd with non-root user
|
||||
# nscd = for better DNS caching
|
||||
RUN apt update && \
|
||||
apt --yes --no-install-recommends install \
|
||||
sqlite3 \
|
||||
ca-certificates \
|
||||
iputils-ping \
|
||||
util-linux \
|
||||
dumb-init \
|
||||
curl \
|
||||
sudo \
|
||||
nscd && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove
|
||||
|
||||
# apprise = for notifications (Install from the deb package, as the stable one is too old) (workaround for #4867)
|
||||
# Switching to testing repo is no longer working, as the testing repo is not bookworm anymore.
|
||||
# python3-paho-mqtt (#4859)
|
||||
RUN curl http://ftp.debian.org/debian/pool/main/a/apprise/apprise_1.8.0-2_all.deb --output apprise.deb && \
|
||||
apt update && \
|
||||
apt --yes --no-install-recommends install ./apprise.deb python3-paho-mqtt && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f apprise.deb && \
|
||||
apt --yes autoremove
|
||||
|
||||
# Install cloudflared
|
||||
RUN curl https://pkg.cloudflare.com/cloudflare-main.gpg --output /usr/share/keyrings/cloudflare-main.gpg && \
|
||||
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list && \
|
||||
apt update && \
|
||||
apt install --yes --no-install-recommends -t stable cloudflared && \
|
||||
cloudflared version && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove
|
||||
|
||||
# For nscd
|
||||
COPY ./docker/etc/nscd.conf /etc/nscd.conf
|
||||
COPY ./docker/etc/sudoers /etc/sudoers
|
||||
|
||||
|
||||
# Full Base Image
|
||||
# MariaDB, Chromium and fonts
|
||||
# Make sure to reuse the slim image here. Uncomment the above line if you want to build it from scratch.
|
||||
# FROM base2-slim AS base2
|
||||
FROM louislam/uptime-kuma:base2-slim AS base2
|
||||
ENV UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB=1
|
||||
RUN apt update && \
|
||||
apt --yes --no-install-recommends install chromium fonts-indic fonts-noto fonts-noto-cjk mariadb-server && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove && \
|
||||
chown -R node:node /var/lib/mysql
|
||||
# If the image changed, the second stage image should be changed too
|
||||
FROM node:20-bookworm-slim AS base2-slim
|
||||
ARG TARGETPLATFORM
|
||||
|
||||
# Specify --no-install-recommends to skip unused dependencies, make the base much smaller!
|
||||
# sqlite3 = for debugging
|
||||
# iputils-ping = for ping
|
||||
# util-linux = for setpriv (Should be dropped in 2.0.0?)
|
||||
# dumb-init = avoid zombie processes (#480)
|
||||
# curl = for debugging
|
||||
# ca-certificates = keep the cert up-to-date
|
||||
# sudo = for start service nscd with non-root user
|
||||
# nscd = for better DNS caching
|
||||
RUN apt update && \
|
||||
apt --yes --no-install-recommends install \
|
||||
sqlite3 \
|
||||
ca-certificates \
|
||||
iputils-ping \
|
||||
util-linux \
|
||||
dumb-init \
|
||||
curl \
|
||||
sudo \
|
||||
nscd && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove
|
||||
|
||||
# apprise = for notifications (Install from the deb package, as the stable one is too old) (workaround for #4867)
|
||||
# Switching to testing repo is no longer working, as the testing repo is not bookworm anymore.
|
||||
# python3-paho-mqtt (#4859)
|
||||
RUN curl http://ftp.debian.org/debian/pool/main/a/apprise/apprise_1.8.0-2_all.deb --output apprise.deb && \
|
||||
apt update && \
|
||||
apt --yes --no-install-recommends install ./apprise.deb python3-paho-mqtt && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f apprise.deb && \
|
||||
apt --yes autoremove
|
||||
|
||||
# Install cloudflared
|
||||
RUN curl https://pkg.cloudflare.com/cloudflare-main.gpg --output /usr/share/keyrings/cloudflare-main.gpg && \
|
||||
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list && \
|
||||
apt update && \
|
||||
apt install --yes --no-install-recommends -t stable cloudflared && \
|
||||
cloudflared version && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove
|
||||
|
||||
# For nscd
|
||||
COPY ./docker/etc/nscd.conf /etc/nscd.conf
|
||||
COPY ./docker/etc/sudoers /etc/sudoers
|
||||
|
||||
|
||||
# Full Base Image
|
||||
# MariaDB, Chromium and fonts
|
||||
# Make sure to reuse the slim image here. Uncomment the above line if you want to build it from scratch.
|
||||
# FROM base2-slim AS base2
|
||||
FROM louislam/uptime-kuma:base2-slim AS base2
|
||||
ENV UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB=1
|
||||
RUN apt update && \
|
||||
apt --yes --no-install-recommends install chromium fonts-indic fonts-noto fonts-noto-cjk mariadb-server && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt --yes autoremove && \
|
||||
chown -R node:node /var/lib/mysql
|
||||
|
|
35380
package-lock.json
generated
35380
package-lock.json
generated
File diff suppressed because it is too large
Load diff
428
package.json
428
package.json
|
@ -1,214 +1,214 @@
|
|||
{
|
||||
"name": "uptime-kuma",
|
||||
"version": "2.0.0-dev",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/louislam/uptime-kuma.git"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || >= 20.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
|
||||
"lint:js-prod": "npm run lint:js -- --max-warnings 0",
|
||||
"lint-fix:js": "eslint --ext \".js,.vue\" --fix --ignore-path .gitignore .",
|
||||
"lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore",
|
||||
"lint-fix:style": "stylelint \"**/*.{vue,css,scss}\" --fix --ignore-path .gitignore",
|
||||
"lint": "npm run lint:js && npm run lint:style",
|
||||
"lint:prod": "npm run lint:js-prod && npm run lint:style",
|
||||
"dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"",
|
||||
"start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js",
|
||||
"start-frontend-devcontainer": "cross-env NODE_ENV=development DEVCONTAINER=1 vite --host --config ./config/vite.config.js",
|
||||
"start": "npm run start-server",
|
||||
"start-server": "node server/server.js",
|
||||
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
|
||||
"start-server-dev:watch": "cross-env NODE_ENV=development node --watch server/server.js",
|
||||
"build": "vite build --config ./config/vite.config.js",
|
||||
"test": "npm run test-backend && npm run test-e2e",
|
||||
"test-with-build": "npm run build && npm test",
|
||||
"test-backend": "cross-env TEST_BACKEND=1 node --test test/backend-test",
|
||||
"test-e2e": "playwright test --config ./config/playwright.config.js",
|
||||
"test-e2e-ui": "playwright test --config ./config/playwright.config.js --ui --ui-port=51063",
|
||||
"playwright-codegen": "playwright codegen localhost:3000 --save-storage=./private/e2e-auth.json",
|
||||
"playwright-show-report": "playwright show-report ./private/playwright-report",
|
||||
"tsc": "tsc",
|
||||
"vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
|
||||
"build-docker": "npm run build && npm run build-docker-full && npm run build-docker-slim",
|
||||
"build-docker-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2 --target base2 . --push",
|
||||
"build-docker-base-slim": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2-slim --target base2-slim . --push",
|
||||
"build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push",
|
||||
"build-docker-slim": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim -t louislam/uptime-kuma:$VERSION-slim --target release --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
|
||||
"build-docker-full": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2 -t louislam/uptime-kuma:$VERSION --target release . --push",
|
||||
"build-docker-nightly": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2 --target nightly . --push",
|
||||
"build-docker-slim-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim-rootless -t louislam/uptime-kuma:$VERSION-slim-rootless --target rootless --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
|
||||
"build-docker-full-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-rootless -t louislam/uptime-kuma:$VERSION-rootless --target rootless . --push",
|
||||
"build-docker-nightly-rootless": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2-rootless --target nightly-rootless . --push",
|
||||
"build-docker-nightly-local": "npm run build && docker build -f docker/dockerfile -t louislam/uptime-kuma:nightly2 --target nightly .",
|
||||
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test2 --target pr-test2 . --push",
|
||||
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
|
||||
"setup": "git checkout 1.23.14 && npm ci --production && npm run download-dist",
|
||||
"download-dist": "node extra/download-dist.js",
|
||||
"mark-as-nightly": "node extra/mark-as-nightly.js",
|
||||
"reset-password": "node extra/reset-password.js",
|
||||
"remove-2fa": "node extra/remove-2fa.js",
|
||||
"simple-dns-server": "node extra/simple-dns-server.js",
|
||||
"simple-mqtt-server": "node extra/simple-mqtt-server.js",
|
||||
"simple-mongo": "docker run --rm -p 27017:27017 mongo",
|
||||
"simple-postgres": "docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres",
|
||||
"simple-mariadb": "docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb# mariadb",
|
||||
"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",
|
||||
"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",
|
||||
"build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
|
||||
"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",
|
||||
"rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X"
|
||||
},
|
||||
"dependencies": {
|
||||
"@grpc/grpc-js": "~1.8.22",
|
||||
"@louislam/ping": "~0.4.4-mod.1",
|
||||
"@louislam/sqlite3": "15.1.6",
|
||||
"@vvo/tzdb": "^6.125.0",
|
||||
"args-parser": "~1.3.0",
|
||||
"axios": "~0.28.1",
|
||||
"badge-maker": "~3.3.1",
|
||||
"bcryptjs": "~2.4.3",
|
||||
"chardet": "~1.4.0",
|
||||
"check-password-strength": "^2.0.5",
|
||||
"cheerio": "~1.0.0-rc.12",
|
||||
"chroma-js": "~2.4.2",
|
||||
"command-exists": "~1.2.9",
|
||||
"compare-versions": "~3.6.0",
|
||||
"compression": "~1.7.4",
|
||||
"croner": "~8.1.0",
|
||||
"dayjs": "~1.11.5",
|
||||
"dev-null": "^0.1.1",
|
||||
"dotenv": "~16.0.3",
|
||||
"express": "~4.21.0",
|
||||
"express-basic-auth": "~1.2.1",
|
||||
"express-static-gzip": "~2.1.7",
|
||||
"feed": "^4.2.2",
|
||||
"form-data": "~4.0.0",
|
||||
"gamedig": "^4.2.0",
|
||||
"html-escaper": "^3.0.3",
|
||||
"http-cookie-agent": "~5.0.4",
|
||||
"http-graceful-shutdown": "~3.1.7",
|
||||
"http-proxy-agent": "~5.0.0",
|
||||
"https-proxy-agent": "~5.0.1",
|
||||
"iconv-lite": "~0.6.3",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"jsesc": "~3.0.2",
|
||||
"jsonata": "^2.0.3",
|
||||
"jsonwebtoken": "~9.0.0",
|
||||
"jwt-decode": "~3.1.2",
|
||||
"kafkajs": "^2.2.4",
|
||||
"knex": "^2.4.2",
|
||||
"limiter": "~2.1.0",
|
||||
"liquidjs": "^10.7.0",
|
||||
"marked": "^14.0.0",
|
||||
"mitt": "~3.0.1",
|
||||
"mongodb": "~4.17.1",
|
||||
"mqtt": "~4.3.7",
|
||||
"mssql": "~11.0.0",
|
||||
"mysql2": "~3.9.6",
|
||||
"nanoid": "~3.3.4",
|
||||
"net-snmp": "^3.11.2",
|
||||
"node-cloudflared-tunnel": "~1.0.9",
|
||||
"node-radius-client": "~1.0.0",
|
||||
"nodemailer": "~6.9.13",
|
||||
"nostr-tools": "^1.13.1",
|
||||
"notp": "~2.0.3",
|
||||
"openid-client": "^5.4.2",
|
||||
"password-hash": "~1.2.2",
|
||||
"pg": "~8.11.3",
|
||||
"pg-connection-string": "~2.6.2",
|
||||
"playwright-core": "~1.39.0",
|
||||
"prom-client": "~13.2.0",
|
||||
"prometheus-api-metrics": "~3.2.1",
|
||||
"promisify-child-process": "~4.1.2",
|
||||
"protobufjs": "~7.2.4",
|
||||
"qs": "~6.10.4",
|
||||
"redbean-node": "~0.3.0",
|
||||
"redis": "~4.5.1",
|
||||
"semver": "~7.5.4",
|
||||
"socket.io": "~4.8.0",
|
||||
"socket.io-client": "~4.8.0",
|
||||
"socks-proxy-agent": "6.1.1",
|
||||
"tar": "~6.2.1",
|
||||
"tcp-ping": "~0.1.1",
|
||||
"thirty-two": "~1.0.2",
|
||||
"tough-cookie": "~4.1.3",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@actions/github": "~5.1.1",
|
||||
"@fortawesome/fontawesome-svg-core": "~1.2.36",
|
||||
"@fortawesome/free-regular-svg-icons": "~5.15.4",
|
||||
"@fortawesome/free-solid-svg-icons": "~5.15.4",
|
||||
"@fortawesome/vue-fontawesome": "~3.0.0-5",
|
||||
"@playwright/test": "~1.39.0",
|
||||
"@popperjs/core": "~2.10.2",
|
||||
"@testcontainers/hivemq": "^10.13.1",
|
||||
"@types/bootstrap": "~5.1.9",
|
||||
"@types/node": "^20.8.6",
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.5",
|
||||
"@typescript-eslint/parser": "^6.7.5",
|
||||
"@vitejs/plugin-vue": "~5.0.1",
|
||||
"@vue/compiler-sfc": "~3.4.2",
|
||||
"@vuepic/vue-datepicker": "~3.4.8",
|
||||
"aedes": "^0.46.3",
|
||||
"bootstrap": "5.1.3",
|
||||
"chart.js": "~4.2.1",
|
||||
"chartjs-adapter-dayjs-4": "~1.0.4",
|
||||
"concurrently": "^7.1.0",
|
||||
"core-js": "~3.26.1",
|
||||
"cronstrue": "~2.24.0",
|
||||
"cross-env": "~7.0.3",
|
||||
"delay": "^5.0.0",
|
||||
"dns2": "~2.0.1",
|
||||
"dompurify": "~3.1.7",
|
||||
"eslint": "~8.14.0",
|
||||
"eslint-plugin-jsdoc": "~46.4.6",
|
||||
"eslint-plugin-vue": "~8.7.1",
|
||||
"favico.js": "~0.3.10",
|
||||
"get-port-please": "^3.1.1",
|
||||
"node-ssh": "~13.1.0",
|
||||
"postcss-html": "~1.5.0",
|
||||
"postcss-rtlcss": "~3.7.2",
|
||||
"postcss-scss": "~4.0.4",
|
||||
"prismjs": "~1.29.0",
|
||||
"qrcode": "~1.5.0",
|
||||
"rollup-plugin-visualizer": "^5.6.0",
|
||||
"sass": "~1.42.1",
|
||||
"stylelint": "^15.10.1",
|
||||
"stylelint-config-standard": "~25.0.0",
|
||||
"terser": "~5.15.0",
|
||||
"test": "~3.3.0",
|
||||
"testcontainers": "^10.13.1",
|
||||
"typescript": "~4.4.4",
|
||||
"v-pagination-3": "~0.1.7",
|
||||
"vite": "~5.2.8",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-vue-devtools": "^7.0.15",
|
||||
"vue": "~3.4.2",
|
||||
"vue-chartjs": "~5.2.0",
|
||||
"vue-confirm-dialog": "~1.0.2",
|
||||
"vue-contenteditable": "~3.0.4",
|
||||
"vue-i18n": "~9.2.2",
|
||||
"vue-image-crop-upload": "~3.0.3",
|
||||
"vue-multiselect": "~3.0.0-alpha.2",
|
||||
"vue-prism-editor": "~2.0.0-alpha.2",
|
||||
"vue-qrcode": "~1.0.0",
|
||||
"vue-router": "~4.2.5",
|
||||
"vue-toastification": "~2.0.0-rc.5",
|
||||
"vuedraggable": "~4.1.0",
|
||||
"wait-on": "^7.2.0",
|
||||
"whatwg-url": "~12.0.1"
|
||||
}
|
||||
}
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"version": "2.0.0-dev",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/louislam/uptime-kuma.git"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || >= 20.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
|
||||
"lint:js-prod": "npm run lint:js -- --max-warnings 0",
|
||||
"lint-fix:js": "eslint --ext \".js,.vue\" --fix --ignore-path .gitignore .",
|
||||
"lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore",
|
||||
"lint-fix:style": "stylelint \"**/*.{vue,css,scss}\" --fix --ignore-path .gitignore",
|
||||
"lint": "npm run lint:js && npm run lint:style",
|
||||
"lint:prod": "npm run lint:js-prod && npm run lint:style",
|
||||
"dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"",
|
||||
"start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js",
|
||||
"start-frontend-devcontainer": "cross-env NODE_ENV=development DEVCONTAINER=1 vite --host --config ./config/vite.config.js",
|
||||
"start": "npm run start-server",
|
||||
"start-server": "node server/server.js",
|
||||
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
|
||||
"start-server-dev:watch": "cross-env NODE_ENV=development node --watch server/server.js",
|
||||
"build": "vite build --config ./config/vite.config.js",
|
||||
"test": "npm run test-backend && npm run test-e2e",
|
||||
"test-with-build": "npm run build && npm test",
|
||||
"test-backend": "cross-env TEST_BACKEND=1 node --test test/backend-test",
|
||||
"test-e2e": "playwright test --config ./config/playwright.config.js",
|
||||
"test-e2e-ui": "playwright test --config ./config/playwright.config.js --ui --ui-port=51063",
|
||||
"playwright-codegen": "playwright codegen localhost:3000 --save-storage=./private/e2e-auth.json",
|
||||
"playwright-show-report": "playwright show-report ./private/playwright-report",
|
||||
"tsc": "tsc",
|
||||
"vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
|
||||
"build-docker": "npm run build && npm run build-docker-full && npm run build-docker-slim",
|
||||
"build-docker-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2 --target base2 . --push",
|
||||
"build-docker-base-slim": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2-slim --target base2-slim . --push",
|
||||
"build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push",
|
||||
"build-docker-slim": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim -t louislam/uptime-kuma:$VERSION-slim --target release --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
|
||||
"build-docker-full": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2 -t louislam/uptime-kuma:$VERSION --target release . --push",
|
||||
"build-docker-nightly": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2 --target nightly . --push",
|
||||
"build-docker-slim-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim-rootless -t louislam/uptime-kuma:$VERSION-slim-rootless --target rootless --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
|
||||
"build-docker-full-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-rootless -t louislam/uptime-kuma:$VERSION-rootless --target rootless . --push",
|
||||
"build-docker-nightly-rootless": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2-rootless --target nightly-rootless . --push",
|
||||
"build-docker-nightly-local": "npm run build && docker build -f docker/dockerfile -t louislam/uptime-kuma:nightly2 --target nightly .",
|
||||
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test2 --target pr-test2 . --push",
|
||||
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
|
||||
"setup": "git checkout 1.23.14 && npm ci --production && npm run download-dist",
|
||||
"download-dist": "node extra/download-dist.js",
|
||||
"mark-as-nightly": "node extra/mark-as-nightly.js",
|
||||
"reset-password": "node extra/reset-password.js",
|
||||
"remove-2fa": "node extra/remove-2fa.js",
|
||||
"simple-dns-server": "node extra/simple-dns-server.js",
|
||||
"simple-mqtt-server": "node extra/simple-mqtt-server.js",
|
||||
"simple-mongo": "docker run --rm -p 27017:27017 mongo",
|
||||
"simple-postgres": "docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres",
|
||||
"simple-mariadb": "docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb# mariadb",
|
||||
"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",
|
||||
"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",
|
||||
"build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
|
||||
"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",
|
||||
"rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X"
|
||||
},
|
||||
"dependencies": {
|
||||
"@grpc/grpc-js": "~1.8.22",
|
||||
"@louislam/ping": "~0.4.4-mod.1",
|
||||
"@louislam/sqlite3": "15.1.6",
|
||||
"@vvo/tzdb": "^6.125.0",
|
||||
"args-parser": "~1.3.0",
|
||||
"axios": "~0.28.1",
|
||||
"badge-maker": "~3.3.1",
|
||||
"bcryptjs": "~2.4.3",
|
||||
"chardet": "~1.4.0",
|
||||
"check-password-strength": "^2.0.5",
|
||||
"cheerio": "~1.0.0-rc.12",
|
||||
"chroma-js": "~2.4.2",
|
||||
"command-exists": "~1.2.9",
|
||||
"compare-versions": "~3.6.0",
|
||||
"compression": "~1.7.4",
|
||||
"croner": "~8.1.0",
|
||||
"dayjs": "~1.11.5",
|
||||
"dev-null": "^0.1.1",
|
||||
"dotenv": "~16.0.3",
|
||||
"express": "~4.21.0",
|
||||
"express-basic-auth": "~1.2.1",
|
||||
"express-static-gzip": "~2.1.7",
|
||||
"feed": "^4.2.2",
|
||||
"form-data": "~4.0.0",
|
||||
"gamedig": "^4.2.0",
|
||||
"html-escaper": "^3.0.3",
|
||||
"http-cookie-agent": "~5.0.4",
|
||||
"http-graceful-shutdown": "~3.1.7",
|
||||
"http-proxy-agent": "~5.0.0",
|
||||
"https-proxy-agent": "~5.0.1",
|
||||
"iconv-lite": "~0.6.3",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"jsesc": "~3.0.2",
|
||||
"jsonata": "^2.0.3",
|
||||
"jsonwebtoken": "~9.0.0",
|
||||
"jwt-decode": "~3.1.2",
|
||||
"kafkajs": "^2.2.4",
|
||||
"knex": "^2.4.2",
|
||||
"limiter": "~2.1.0",
|
||||
"liquidjs": "^10.7.0",
|
||||
"marked": "^14.0.0",
|
||||
"mitt": "~3.0.1",
|
||||
"mongodb": "~4.17.1",
|
||||
"mqtt": "~4.3.7",
|
||||
"mssql": "~11.0.0",
|
||||
"mysql2": "~3.9.6",
|
||||
"nanoid": "~3.3.4",
|
||||
"net-snmp": "^3.11.2",
|
||||
"node-cloudflared-tunnel": "~1.0.9",
|
||||
"node-radius-client": "~1.0.0",
|
||||
"nodemailer": "~6.9.13",
|
||||
"nostr-tools": "^1.13.1",
|
||||
"notp": "~2.0.3",
|
||||
"openid-client": "^5.4.2",
|
||||
"password-hash": "~1.2.2",
|
||||
"pg": "~8.11.3",
|
||||
"pg-connection-string": "~2.6.2",
|
||||
"playwright-core": "~1.39.0",
|
||||
"prom-client": "~13.2.0",
|
||||
"prometheus-api-metrics": "~3.2.1",
|
||||
"promisify-child-process": "~4.1.2",
|
||||
"protobufjs": "~7.2.4",
|
||||
"qs": "~6.10.4",
|
||||
"redbean-node": "~0.3.0",
|
||||
"redis": "~4.5.1",
|
||||
"semver": "~7.5.4",
|
||||
"socket.io": "~4.8.0",
|
||||
"socket.io-client": "~4.8.0",
|
||||
"socks-proxy-agent": "6.1.1",
|
||||
"tar": "~6.2.1",
|
||||
"tcp-ping": "~0.1.1",
|
||||
"thirty-two": "~1.0.2",
|
||||
"tough-cookie": "~4.1.3",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@actions/github": "~5.1.1",
|
||||
"@fortawesome/fontawesome-svg-core": "~1.2.36",
|
||||
"@fortawesome/free-regular-svg-icons": "~5.15.4",
|
||||
"@fortawesome/free-solid-svg-icons": "~5.15.4",
|
||||
"@fortawesome/vue-fontawesome": "~3.0.0-5",
|
||||
"@playwright/test": "~1.39.0",
|
||||
"@popperjs/core": "~2.10.2",
|
||||
"@testcontainers/hivemq": "^10.13.1",
|
||||
"@types/bootstrap": "~5.1.9",
|
||||
"@types/node": "^20.8.6",
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.5",
|
||||
"@typescript-eslint/parser": "^6.7.5",
|
||||
"@vitejs/plugin-vue": "~5.0.1",
|
||||
"@vue/compiler-sfc": "~3.4.2",
|
||||
"@vuepic/vue-datepicker": "~3.4.8",
|
||||
"aedes": "^0.46.3",
|
||||
"bootstrap": "5.1.3",
|
||||
"chart.js": "~4.2.1",
|
||||
"chartjs-adapter-dayjs-4": "~1.0.4",
|
||||
"concurrently": "^7.1.0",
|
||||
"core-js": "~3.26.1",
|
||||
"cronstrue": "~2.24.0",
|
||||
"cross-env": "~7.0.3",
|
||||
"delay": "^5.0.0",
|
||||
"dns2": "~2.0.1",
|
||||
"dompurify": "~3.1.7",
|
||||
"eslint": "~8.14.0",
|
||||
"eslint-plugin-jsdoc": "~46.4.6",
|
||||
"eslint-plugin-vue": "~8.7.1",
|
||||
"favico.js": "~0.3.10",
|
||||
"get-port-please": "^3.1.1",
|
||||
"node-ssh": "~13.1.0",
|
||||
"postcss-html": "~1.5.0",
|
||||
"postcss-rtlcss": "~3.7.2",
|
||||
"postcss-scss": "~4.0.4",
|
||||
"prismjs": "~1.29.0",
|
||||
"qrcode": "~1.5.0",
|
||||
"rollup-plugin-visualizer": "^5.6.0",
|
||||
"sass": "~1.42.1",
|
||||
"stylelint": "^15.10.1",
|
||||
"stylelint-config-standard": "~25.0.0",
|
||||
"terser": "~5.15.0",
|
||||
"test": "~3.3.0",
|
||||
"testcontainers": "^10.13.1",
|
||||
"typescript": "~4.4.4",
|
||||
"v-pagination-3": "~0.1.7",
|
||||
"vite": "~5.2.8",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-vue-devtools": "^7.0.15",
|
||||
"vue": "~3.4.2",
|
||||
"vue-chartjs": "~5.2.0",
|
||||
"vue-confirm-dialog": "~1.0.2",
|
||||
"vue-contenteditable": "~3.0.4",
|
||||
"vue-i18n": "~9.2.2",
|
||||
"vue-image-crop-upload": "~3.0.3",
|
||||
"vue-multiselect": "~3.0.0-alpha.2",
|
||||
"vue-prism-editor": "~2.0.0-alpha.2",
|
||||
"vue-qrcode": "~1.0.0",
|
||||
"vue-router": "~4.2.5",
|
||||
"vue-toastification": "~2.0.0-rc.5",
|
||||
"vuedraggable": "~4.1.0",
|
||||
"wait-on": "^7.2.0",
|
||||
"whatwg-url": "~12.0.1"
|
||||
}
|
||||
}
|
||||
|
|
1432
server/database.js
1432
server/database.js
File diff suppressed because it is too large
Load diff
|
@ -1,57 +1,57 @@
|
|||
const { R } = require("redbean-node");
|
||||
const { log } = require("../../src/util");
|
||||
const { setSetting, setting } = require("../util-server");
|
||||
const Database = require("../database");
|
||||
|
||||
const DEFAULT_KEEP_PERIOD = 180;
|
||||
|
||||
/**
|
||||
* Clears old data from the heartbeat table of the database.
|
||||
* @returns {Promise<void>} A promise that resolves when the data has been cleared.
|
||||
*/
|
||||
|
||||
const clearOldData = async () => {
|
||||
let period = await setting("keepDataPeriodDays");
|
||||
|
||||
// Set Default Period
|
||||
if (period == null) {
|
||||
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
|
||||
period = DEFAULT_KEEP_PERIOD;
|
||||
}
|
||||
|
||||
// Try parse setting
|
||||
let parsedPeriod;
|
||||
try {
|
||||
parsedPeriod = parseInt(period);
|
||||
} catch (_) {
|
||||
log.warn("clearOldData", "Failed to parse setting, resetting to default..");
|
||||
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
|
||||
parsedPeriod = DEFAULT_KEEP_PERIOD;
|
||||
}
|
||||
|
||||
if (parsedPeriod < 1) {
|
||||
log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
|
||||
} else {
|
||||
|
||||
log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`);
|
||||
|
||||
const sqlHourOffset = Database.sqlHourOffset();
|
||||
|
||||
try {
|
||||
await R.exec(
|
||||
"DELETE FROM heartbeat WHERE time < " + sqlHourOffset,
|
||||
[ parsedPeriod * -24 ]
|
||||
);
|
||||
|
||||
if (Database.dbConfig.type === "sqlite") {
|
||||
await R.exec("PRAGMA optimize;");
|
||||
}
|
||||
} catch (e) {
|
||||
log.error("clearOldData", `Failed to clear old data: ${e.message}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
clearOldData,
|
||||
};
|
||||
const { R } = require("redbean-node");
|
||||
const { log } = require("../../src/util");
|
||||
const { setSetting, setting } = require("../util-server");
|
||||
const Database = require("../database");
|
||||
|
||||
const DEFAULT_KEEP_PERIOD = 180;
|
||||
|
||||
/**
|
||||
* Clears old data from the heartbeat table of the database.
|
||||
* @returns {Promise<void>} A promise that resolves when the data has been cleared.
|
||||
*/
|
||||
|
||||
const clearOldData = async () => {
|
||||
let period = await setting("keepDataPeriodDays");
|
||||
|
||||
// Set Default Period
|
||||
if (period == null) {
|
||||
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
|
||||
period = DEFAULT_KEEP_PERIOD;
|
||||
}
|
||||
|
||||
// Try parse setting
|
||||
let parsedPeriod;
|
||||
try {
|
||||
parsedPeriod = parseInt(period);
|
||||
} catch (_) {
|
||||
log.warn("clearOldData", "Failed to parse setting, resetting to default..");
|
||||
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
|
||||
parsedPeriod = DEFAULT_KEEP_PERIOD;
|
||||
}
|
||||
|
||||
if (parsedPeriod < 1) {
|
||||
log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
|
||||
} else {
|
||||
|
||||
log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`);
|
||||
|
||||
const sqlHourOffset = Database.sqlHourOffset();
|
||||
|
||||
try {
|
||||
await R.exec(
|
||||
"DELETE FROM heartbeat WHERE time < " + sqlHourOffset,
|
||||
[ parsedPeriod * -24 ]
|
||||
);
|
||||
|
||||
if (Database.dbConfig.type === "sqlite") {
|
||||
await R.exec("PRAGMA optimize;");
|
||||
}
|
||||
} catch (e) {
|
||||
log.error("clearOldData", `Failed to clear old data: ${e.message}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
clearOldData,
|
||||
};
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,50 +1,50 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class ServerChan extends NotificationProvider {
|
||||
name = "ServerChan";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
|
||||
// serverchan3 requires sending via ft07.com
|
||||
const url = String(notification.serverChanSendKey).startsWith("sctp")
|
||||
? `https://${notification.serverChanSendKey}.push.ft07.com/send`
|
||||
: `https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`;
|
||||
|
||||
try {
|
||||
await axios.post(url, {
|
||||
"title": this.checkStatus(heartbeatJSON, monitorJSON),
|
||||
"desp": msg,
|
||||
});
|
||||
|
||||
return okMsg;
|
||||
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted title for message
|
||||
* @param {?object} heartbeatJSON Heartbeat details (For Up/Down only)
|
||||
* @param {?object} monitorJSON Monitor details (For Up/Down only)
|
||||
* @returns {string} Formatted title
|
||||
*/
|
||||
checkStatus(heartbeatJSON, monitorJSON) {
|
||||
let title = "UptimeKuma Message";
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
|
||||
title = "UptimeKuma Monitor Up " + monitorJSON["name"];
|
||||
}
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
|
||||
title = "UptimeKuma Monitor Down " + monitorJSON["name"];
|
||||
}
|
||||
return title;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ServerChan;
|
||||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class ServerChan extends NotificationProvider {
|
||||
name = "ServerChan";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
|
||||
// serverchan3 requires sending via ft07.com
|
||||
const url = String(notification.serverChanSendKey).startsWith("sctp")
|
||||
? `https://${notification.serverChanSendKey}.push.ft07.com/send`
|
||||
: `https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`;
|
||||
|
||||
try {
|
||||
await axios.post(url, {
|
||||
"title": this.checkStatus(heartbeatJSON, monitorJSON),
|
||||
"desp": msg,
|
||||
});
|
||||
|
||||
return okMsg;
|
||||
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted title for message
|
||||
* @param {?object} heartbeatJSON Heartbeat details (For Up/Down only)
|
||||
* @param {?object} monitorJSON Monitor details (For Up/Down only)
|
||||
* @returns {string} Formatted title
|
||||
*/
|
||||
checkStatus(heartbeatJSON, monitorJSON) {
|
||||
let title = "UptimeKuma Message";
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
|
||||
title = "UptimeKuma Monitor Up " + monitorJSON["name"];
|
||||
}
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
|
||||
title = "UptimeKuma Monitor Down " + monitorJSON["name"];
|
||||
}
|
||||
return title;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ServerChan;
|
||||
|
|
3732
server/server.js
3732
server/server.js
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,328 +1,328 @@
|
|||
<template>
|
||||
<div ref="wrap" class="wrap" :style="wrapStyle">
|
||||
<div class="hp-bar-big" :style="barStyle">
|
||||
<div
|
||||
v-for="(beat, index) in shortBeatList"
|
||||
:key="index"
|
||||
class="beat"
|
||||
:class="{ 'empty': (beat === 0), 'down': (beat.status === 0), 'pending': (beat.status === 2), 'maintenance': (beat.status === 3) }"
|
||||
:style="beatStyle"
|
||||
:title="getBeatTitle(beat)"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="!$root.isMobile && size !== 'small' && beatList.length > 4 && $root.styleElapsedTime !== 'none'"
|
||||
class="d-flex justify-content-between align-items-center word" :style="timeStyle"
|
||||
>
|
||||
<div>{{ timeSinceFirstBeat }}</div>
|
||||
<div v-if="$root.styleElapsedTime === 'with-line'" class="connecting-line"></div>
|
||||
<div>{{ timeSinceLastBeat }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import dayjs from "dayjs";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
/** Size of the heartbeat bar */
|
||||
size: {
|
||||
type: String,
|
||||
default: "big",
|
||||
},
|
||||
/** ID of the monitor */
|
||||
monitorId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
/** Array of the monitors heartbeats */
|
||||
heartbeatList: {
|
||||
type: Array,
|
||||
default: null,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
beatWidth: 10,
|
||||
beatHeight: 30,
|
||||
hoverScale: 1.5,
|
||||
beatMargin: 4,
|
||||
move: false,
|
||||
maxBeat: -1,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
/**
|
||||
* If heartbeatList is null, get it from $root.heartbeatList
|
||||
* @returns {object} Heartbeat list
|
||||
*/
|
||||
beatList() {
|
||||
if (this.heartbeatList === null) {
|
||||
return this.$root.heartbeatList[this.monitorId];
|
||||
} else {
|
||||
return this.heartbeatList;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
numPadding() {
|
||||
if (!this.beatList) {
|
||||
return 0;
|
||||
}
|
||||
let num = this.beatList.length - this.maxBeat;
|
||||
|
||||
if (this.move) {
|
||||
num = num - 1;
|
||||
}
|
||||
|
||||
if (num > 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1 * num;
|
||||
},
|
||||
|
||||
shortBeatList() {
|
||||
if (!this.beatList) {
|
||||
return [];
|
||||
}
|
||||
|
||||
let placeholders = [];
|
||||
|
||||
let start = this.beatList.length - this.maxBeat;
|
||||
|
||||
if (this.move) {
|
||||
start = start - 1;
|
||||
}
|
||||
|
||||
if (start < 0) {
|
||||
// Add empty placeholder
|
||||
for (let i = start; i < 0; i++) {
|
||||
placeholders.push(0);
|
||||
}
|
||||
start = 0;
|
||||
}
|
||||
|
||||
return placeholders.concat(this.beatList.slice(start));
|
||||
},
|
||||
|
||||
wrapStyle() {
|
||||
let topBottom = (((this.beatHeight * this.hoverScale) - this.beatHeight) / 2);
|
||||
let leftRight = (((this.beatWidth * this.hoverScale) - this.beatWidth) / 2);
|
||||
|
||||
return {
|
||||
padding: `${topBottom}px ${leftRight}px`,
|
||||
width: "100%",
|
||||
};
|
||||
},
|
||||
|
||||
barStyle() {
|
||||
if (this.move && this.shortBeatList.length > this.maxBeat) {
|
||||
let width = -(this.beatWidth + this.beatMargin * 2);
|
||||
|
||||
return {
|
||||
transition: "all ease-in-out 0.25s",
|
||||
transform: `translateX(${width}px)`,
|
||||
};
|
||||
|
||||
}
|
||||
return {
|
||||
transform: "translateX(0)",
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
beatStyle() {
|
||||
return {
|
||||
width: this.beatWidth + "px",
|
||||
height: this.beatHeight + "px",
|
||||
margin: this.beatMargin + "px",
|
||||
"--hover-scale": this.hoverScale,
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the style object for positioning the time element.
|
||||
* @returns {object} The style object containing the CSS properties for positioning the time element.
|
||||
*/
|
||||
timeStyle() {
|
||||
return {
|
||||
"margin-left": this.numPadding * (this.beatWidth + this.beatMargin * 2) + "px",
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates the time elapsed since the first valid beat.
|
||||
* @returns {string} The time elapsed in minutes or hours.
|
||||
*/
|
||||
timeSinceFirstBeat() {
|
||||
const firstValidBeat = this.shortBeatList.at(this.numPadding);
|
||||
const minutes = dayjs().diff(dayjs.utc(firstValidBeat?.time), "minutes");
|
||||
if (minutes > 60) {
|
||||
return (minutes / 60).toFixed(0) + "h";
|
||||
} else {
|
||||
return minutes + "m";
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates the elapsed time since the last valid beat was registered.
|
||||
* @returns {string} The elapsed time in a minutes, hours or "now".
|
||||
*/
|
||||
timeSinceLastBeat() {
|
||||
const lastValidBeat = this.shortBeatList.at(-1);
|
||||
const seconds = dayjs().diff(dayjs.utc(lastValidBeat?.time), "seconds");
|
||||
|
||||
let tolerance = 60 * 2; // default for when monitorList not available
|
||||
if (this.$root.monitorList[this.monitorId] != null) {
|
||||
tolerance = this.$root.monitorList[this.monitorId].interval * 2;
|
||||
}
|
||||
|
||||
if (seconds < tolerance) {
|
||||
return this.$t("now");
|
||||
} else if (seconds < 60 * 60) {
|
||||
return this.$t("time ago", [ (seconds / 60).toFixed(0) + "m" ]);
|
||||
} else {
|
||||
return this.$t("time ago", [ (seconds / 60 / 60).toFixed(0) + "h" ]);
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
beatList: {
|
||||
handler(val, oldVal) {
|
||||
this.move = true;
|
||||
|
||||
setTimeout(() => {
|
||||
this.move = false;
|
||||
}, 300);
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
unmounted() {
|
||||
window.removeEventListener("resize", this.resize);
|
||||
},
|
||||
beforeMount() {
|
||||
if (this.heartbeatList === null) {
|
||||
if (!(this.monitorId in this.$root.heartbeatList)) {
|
||||
this.$root.heartbeatList[this.monitorId] = [];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (this.size !== "big") {
|
||||
this.beatWidth = 5;
|
||||
this.beatHeight = 16;
|
||||
this.beatMargin = 2;
|
||||
}
|
||||
|
||||
// Suddenly, have an idea how to handle it universally.
|
||||
// If the pixel * ratio != Integer, then it causes render issue, round it to solve it!!
|
||||
const actualWidth = this.beatWidth * window.devicePixelRatio;
|
||||
const actualMargin = this.beatMargin * window.devicePixelRatio;
|
||||
|
||||
if (!Number.isInteger(actualWidth)) {
|
||||
this.beatWidth = Math.round(actualWidth) / window.devicePixelRatio;
|
||||
}
|
||||
|
||||
if (!Number.isInteger(actualMargin)) {
|
||||
this.beatMargin = Math.round(actualMargin) / window.devicePixelRatio;
|
||||
}
|
||||
|
||||
window.addEventListener("resize", this.resize);
|
||||
this.resize();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Resize the heartbeat bar
|
||||
* @returns {void}
|
||||
*/
|
||||
resize() {
|
||||
if (this.$refs.wrap) {
|
||||
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the title of the beat.
|
||||
* Used as the hover tooltip on the heartbeat bar.
|
||||
* @param {object} beat Beat to get title from
|
||||
* @returns {string} Beat title
|
||||
*/
|
||||
getBeatTitle(beat) {
|
||||
return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : "");
|
||||
},
|
||||
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "../assets/vars.scss";
|
||||
|
||||
.wrap {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.hp-bar-big {
|
||||
.beat {
|
||||
display: inline-block;
|
||||
background-color: $primary;
|
||||
border-radius: $border-radius;
|
||||
|
||||
&.empty {
|
||||
background-color: aliceblue;
|
||||
}
|
||||
|
||||
&.down {
|
||||
background-color: $danger;
|
||||
}
|
||||
|
||||
&.pending {
|
||||
background-color: $warning;
|
||||
}
|
||||
|
||||
&.maintenance {
|
||||
background-color: $maintenance;
|
||||
}
|
||||
|
||||
&:not(.empty):hover {
|
||||
transition: all ease-in-out 0.15s;
|
||||
opacity: 0.8;
|
||||
transform: scale(var(--hover-scale));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
.hp-bar-big .beat.empty {
|
||||
background-color: #848484;
|
||||
}
|
||||
}
|
||||
|
||||
.word {
|
||||
color: $secondary-text;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.connecting-line {
|
||||
flex-grow: 1;
|
||||
height: 1px;
|
||||
background-color: #ededed;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
margin-top: 2px;
|
||||
|
||||
.dark & {
|
||||
background-color: #333;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div ref="wrap" class="wrap" :style="wrapStyle">
|
||||
<div class="hp-bar-big" :style="barStyle">
|
||||
<div
|
||||
v-for="(beat, index) in shortBeatList"
|
||||
:key="index"
|
||||
class="beat"
|
||||
:class="{ 'empty': (beat === 0), 'down': (beat.status === 0), 'pending': (beat.status === 2), 'maintenance': (beat.status === 3) }"
|
||||
:style="beatStyle"
|
||||
:title="getBeatTitle(beat)"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="!$root.isMobile && size !== 'small' && beatList.length > 4 && $root.styleElapsedTime !== 'none'"
|
||||
class="d-flex justify-content-between align-items-center word" :style="timeStyle"
|
||||
>
|
||||
<div>{{ timeSinceFirstBeat }}</div>
|
||||
<div v-if="$root.styleElapsedTime === 'with-line'" class="connecting-line"></div>
|
||||
<div>{{ timeSinceLastBeat }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import dayjs from "dayjs";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
/** Size of the heartbeat bar */
|
||||
size: {
|
||||
type: String,
|
||||
default: "big",
|
||||
},
|
||||
/** ID of the monitor */
|
||||
monitorId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
/** Array of the monitors heartbeats */
|
||||
heartbeatList: {
|
||||
type: Array,
|
||||
default: null,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
beatWidth: 10,
|
||||
beatHeight: 30,
|
||||
hoverScale: 1.5,
|
||||
beatMargin: 4,
|
||||
move: false,
|
||||
maxBeat: -1,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
/**
|
||||
* If heartbeatList is null, get it from $root.heartbeatList
|
||||
* @returns {object} Heartbeat list
|
||||
*/
|
||||
beatList() {
|
||||
if (this.heartbeatList === null) {
|
||||
return this.$root.heartbeatList[this.monitorId];
|
||||
} else {
|
||||
return this.heartbeatList;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
numPadding() {
|
||||
if (!this.beatList) {
|
||||
return 0;
|
||||
}
|
||||
let num = this.beatList.length - this.maxBeat;
|
||||
|
||||
if (this.move) {
|
||||
num = num - 1;
|
||||
}
|
||||
|
||||
if (num > 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1 * num;
|
||||
},
|
||||
|
||||
shortBeatList() {
|
||||
if (!this.beatList) {
|
||||
return [];
|
||||
}
|
||||
|
||||
let placeholders = [];
|
||||
|
||||
let start = this.beatList.length - this.maxBeat;
|
||||
|
||||
if (this.move) {
|
||||
start = start - 1;
|
||||
}
|
||||
|
||||
if (start < 0) {
|
||||
// Add empty placeholder
|
||||
for (let i = start; i < 0; i++) {
|
||||
placeholders.push(0);
|
||||
}
|
||||
start = 0;
|
||||
}
|
||||
|
||||
return placeholders.concat(this.beatList.slice(start));
|
||||
},
|
||||
|
||||
wrapStyle() {
|
||||
let topBottom = (((this.beatHeight * this.hoverScale) - this.beatHeight) / 2);
|
||||
let leftRight = (((this.beatWidth * this.hoverScale) - this.beatWidth) / 2);
|
||||
|
||||
return {
|
||||
padding: `${topBottom}px ${leftRight}px`,
|
||||
width: "100%",
|
||||
};
|
||||
},
|
||||
|
||||
barStyle() {
|
||||
if (this.move && this.shortBeatList.length > this.maxBeat) {
|
||||
let width = -(this.beatWidth + this.beatMargin * 2);
|
||||
|
||||
return {
|
||||
transition: "all ease-in-out 0.25s",
|
||||
transform: `translateX(${width}px)`,
|
||||
};
|
||||
|
||||
}
|
||||
return {
|
||||
transform: "translateX(0)",
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
beatStyle() {
|
||||
return {
|
||||
width: this.beatWidth + "px",
|
||||
height: this.beatHeight + "px",
|
||||
margin: this.beatMargin + "px",
|
||||
"--hover-scale": this.hoverScale,
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the style object for positioning the time element.
|
||||
* @returns {object} The style object containing the CSS properties for positioning the time element.
|
||||
*/
|
||||
timeStyle() {
|
||||
return {
|
||||
"margin-left": this.numPadding * (this.beatWidth + this.beatMargin * 2) + "px",
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates the time elapsed since the first valid beat.
|
||||
* @returns {string} The time elapsed in minutes or hours.
|
||||
*/
|
||||
timeSinceFirstBeat() {
|
||||
const firstValidBeat = this.shortBeatList.at(this.numPadding);
|
||||
const minutes = dayjs().diff(dayjs.utc(firstValidBeat?.time), "minutes");
|
||||
if (minutes > 60) {
|
||||
return (minutes / 60).toFixed(0) + "h";
|
||||
} else {
|
||||
return minutes + "m";
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates the elapsed time since the last valid beat was registered.
|
||||
* @returns {string} The elapsed time in a minutes, hours or "now".
|
||||
*/
|
||||
timeSinceLastBeat() {
|
||||
const lastValidBeat = this.shortBeatList.at(-1);
|
||||
const seconds = dayjs().diff(dayjs.utc(lastValidBeat?.time), "seconds");
|
||||
|
||||
let tolerance = 60 * 2; // default for when monitorList not available
|
||||
if (this.$root.monitorList[this.monitorId] != null) {
|
||||
tolerance = this.$root.monitorList[this.monitorId].interval * 2;
|
||||
}
|
||||
|
||||
if (seconds < tolerance) {
|
||||
return this.$t("now");
|
||||
} else if (seconds < 60 * 60) {
|
||||
return this.$t("time ago", [ (seconds / 60).toFixed(0) + "m" ]);
|
||||
} else {
|
||||
return this.$t("time ago", [ (seconds / 60 / 60).toFixed(0) + "h" ]);
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
beatList: {
|
||||
handler(val, oldVal) {
|
||||
this.move = true;
|
||||
|
||||
setTimeout(() => {
|
||||
this.move = false;
|
||||
}, 300);
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
unmounted() {
|
||||
window.removeEventListener("resize", this.resize);
|
||||
},
|
||||
beforeMount() {
|
||||
if (this.heartbeatList === null) {
|
||||
if (!(this.monitorId in this.$root.heartbeatList)) {
|
||||
this.$root.heartbeatList[this.monitorId] = [];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (this.size !== "big") {
|
||||
this.beatWidth = 5;
|
||||
this.beatHeight = 16;
|
||||
this.beatMargin = 2;
|
||||
}
|
||||
|
||||
// Suddenly, have an idea how to handle it universally.
|
||||
// If the pixel * ratio != Integer, then it causes render issue, round it to solve it!!
|
||||
const actualWidth = this.beatWidth * window.devicePixelRatio;
|
||||
const actualMargin = this.beatMargin * window.devicePixelRatio;
|
||||
|
||||
if (!Number.isInteger(actualWidth)) {
|
||||
this.beatWidth = Math.round(actualWidth) / window.devicePixelRatio;
|
||||
}
|
||||
|
||||
if (!Number.isInteger(actualMargin)) {
|
||||
this.beatMargin = Math.round(actualMargin) / window.devicePixelRatio;
|
||||
}
|
||||
|
||||
window.addEventListener("resize", this.resize);
|
||||
this.resize();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Resize the heartbeat bar
|
||||
* @returns {void}
|
||||
*/
|
||||
resize() {
|
||||
if (this.$refs.wrap) {
|
||||
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the title of the beat.
|
||||
* Used as the hover tooltip on the heartbeat bar.
|
||||
* @param {object} beat Beat to get title from
|
||||
* @returns {string} Beat title
|
||||
*/
|
||||
getBeatTitle(beat) {
|
||||
return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : "");
|
||||
},
|
||||
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "../assets/vars.scss";
|
||||
|
||||
.wrap {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.hp-bar-big {
|
||||
.beat {
|
||||
display: inline-block;
|
||||
background-color: $primary;
|
||||
border-radius: $border-radius;
|
||||
|
||||
&.empty {
|
||||
background-color: aliceblue;
|
||||
}
|
||||
|
||||
&.down {
|
||||
background-color: $danger;
|
||||
}
|
||||
|
||||
&.pending {
|
||||
background-color: $warning;
|
||||
}
|
||||
|
||||
&.maintenance {
|
||||
background-color: $maintenance;
|
||||
}
|
||||
|
||||
&:not(.empty):hover {
|
||||
transition: all ease-in-out 0.15s;
|
||||
opacity: 0.8;
|
||||
transform: scale(var(--hover-scale));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
.hp-bar-big .beat.empty {
|
||||
background-color: #848484;
|
||||
}
|
||||
}
|
||||
|
||||
.word {
|
||||
color: $secondary-text;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.connecting-line {
|
||||
flex-grow: 1;
|
||||
height: 1px;
|
||||
background-color: #ededed;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
margin-top: 2px;
|
||||
|
||||
.dark & {
|
||||
background-color: #333;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
2108
src/lang/bg-BG.json
2108
src/lang/bg-BG.json
File diff suppressed because it is too large
Load diff
2104
src/lang/de-CH.json
2104
src/lang/de-CH.json
File diff suppressed because it is too large
Load diff
2110
src/lang/de-DE.json
2110
src/lang/de-DE.json
File diff suppressed because it is too large
Load diff
2114
src/lang/en.json
2114
src/lang/en.json
File diff suppressed because it is too large
Load diff
|
@ -1,320 +1,320 @@
|
|||
{
|
||||
"languageName": "eesti",
|
||||
"retryCheckEverySecond": "Kontrolli {0} sekundilise vahega",
|
||||
"retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus",
|
||||
"ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel",
|
||||
"upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
|
||||
"maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.",
|
||||
"acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
|
||||
"passwordNotMatchMsg": "Salasõnad ei kattu.",
|
||||
"notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
|
||||
"keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
|
||||
"pauseDashboardHome": "Seisatud",
|
||||
"deleteMonitorMsg": "Kas soovid eemaldada seire?",
|
||||
"deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
|
||||
"resolverserverDescription": "Cloudflare on vaikimisi pöördserver.",
|
||||
"rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.",
|
||||
"pauseMonitorMsg": "Kas soovid peatada seire?",
|
||||
"Settings": "Seaded",
|
||||
"Status Page": "Ülevaade",
|
||||
"Status Pages": "Ülevaated",
|
||||
"Dashboard": "Töölaud",
|
||||
"New Update": "Uuem tarkvara versioon on saadaval",
|
||||
"Language": "Keel",
|
||||
"Appearance": "Välimus",
|
||||
"Theme": "Teema",
|
||||
"General": "Üldine",
|
||||
"Version": "Versioon",
|
||||
"Check Update On GitHub": "Otsi uuendusi GitHub'ist",
|
||||
"List": "Nimekiri",
|
||||
"Add": "Lisa",
|
||||
"Add New Monitor": "Lisa seire",
|
||||
"Add a monitor": "Lisa seire",
|
||||
"Quick Stats": "Ülevaade",
|
||||
"Up": "Töökorras",
|
||||
"Down": "Rikkis",
|
||||
"Pending": "Määramisel",
|
||||
"Unknown": "Kahtlast",
|
||||
"Pause": "Seiska",
|
||||
"Name": "Nimi",
|
||||
"Status": "Olek",
|
||||
"DateTime": "Kuupäev",
|
||||
"Message": "Tulemus",
|
||||
"No important events": "Märkimisväärsed juhtumid puuduvad",
|
||||
"Resume": "Taasta",
|
||||
"Edit": "Muuda",
|
||||
"Delete": "Eemalda",
|
||||
"Current": "Hetkeseisund",
|
||||
"Uptime": "Eluiga",
|
||||
"Cert Exp.": "Sert. aegumine",
|
||||
"day": "päev | päeva",
|
||||
"-day": "-päev",
|
||||
"hour": "tund",
|
||||
"-hour": "-tund",
|
||||
"Response": "Reaktsiooniaeg",
|
||||
"Ping": "Ping",
|
||||
"Monitor Type": "Seire tüüp",
|
||||
"Keyword": "Võtmesõna",
|
||||
"Friendly Name": "Sõbralik nimi",
|
||||
"URL": "URL",
|
||||
"Hostname": "Hostname",
|
||||
"Port": "Port",
|
||||
"Heartbeat Interval": "Tukse sagedus",
|
||||
"Retries": "Korduskatsed",
|
||||
"Advanced": "Rohkem",
|
||||
"Upside Down Mode": "Tagurpidi seire",
|
||||
"Max. Redirects": "Max. ümbersuunamine",
|
||||
"Accepted Status Codes": "Kõlblikud HTTP koodid",
|
||||
"Save": "Salvesta",
|
||||
"Notifications": "Teavitused",
|
||||
"Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
|
||||
"Setup Notification": "Lisa teavitusteenus",
|
||||
"Light": "hele",
|
||||
"Dark": "tume",
|
||||
"Auto": "automaatne",
|
||||
"Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
|
||||
"Normal": "tavaline",
|
||||
"Bottom": "all",
|
||||
"None": "puudub",
|
||||
"Timezone": "Ajatsoon",
|
||||
"Search Engine Visibility": "Otsimootorite ligipääs",
|
||||
"Allow indexing": "Luba indekseerimine",
|
||||
"Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
|
||||
"Change Password": "Muuda parooli",
|
||||
"Current Password": "Praegune parool",
|
||||
"New Password": "Uus parool",
|
||||
"Repeat New Password": "Korda uut parooli",
|
||||
"Update Password": "Uuenda parooli",
|
||||
"Disable Auth": "Lülita autentimine välja",
|
||||
"Enable Auth": "Lülita autentimine sisse",
|
||||
"disableauth.message1": "Kas soovid {disableAuth}?",
|
||||
"disable authentication": "lülitada autentimise välja",
|
||||
"disableauth.message2": "Kastuamiseks {intendThirdPartyAuth}, näiteks Cloudflare Access.",
|
||||
"where you intend to implement third-party authentication": "välise autentimispakkujaga",
|
||||
"Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!",
|
||||
"Logout": "Logi välja",
|
||||
"Leave": "Lahku",
|
||||
"I understand, please disable": "Olen tutvunud riskidega, lülita välja",
|
||||
"Confirm": "Kinnita",
|
||||
"Yes": "Jah",
|
||||
"No": "Ei",
|
||||
"Username": "Kasutajanimi",
|
||||
"Password": "Parool",
|
||||
"Remember me": "Mäleta mind",
|
||||
"Login": "Logi sisse",
|
||||
"No Monitors, please": "Seired puuduvad, palun",
|
||||
"add one": "Lisa esimene",
|
||||
"Notification Type": "Teavituse tüüp",
|
||||
"Email": "e-posti aadress",
|
||||
"Test": "Saada prooviteavitus",
|
||||
"Certificate Info": "Sertifikaadi teave",
|
||||
"Resolver Server": "Server, mis vastab DNS päringutele.",
|
||||
"Resource Record Type": "DNS kirje tüüp",
|
||||
"Last Result": "Viimane",
|
||||
"Create your admin account": "Admininstraatori konto loomine",
|
||||
"Repeat Password": "korda salasõna",
|
||||
"respTime": "Reageerimisaeg (ms)",
|
||||
"notAvailableShort": "N/A",
|
||||
"enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
|
||||
"clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?",
|
||||
"clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?",
|
||||
"confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?",
|
||||
"Export": "Eksport",
|
||||
"Import": "Import",
|
||||
"Default enabled": "Kasuta vaikimisi",
|
||||
"Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
|
||||
"Create": "Loo konto",
|
||||
"Clear Data": "Eemalda andmed",
|
||||
"Events": "Sündmused",
|
||||
"Heartbeats": "Tuksed",
|
||||
"Auto Get": "Hangi automaatselt",
|
||||
"backupDescription": "Varunda kõik seired ja teavitused JSON faili.",
|
||||
"backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
|
||||
"backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
|
||||
"alertNoFile": "Palun lisa fail, mida importida.",
|
||||
"alertWrongFileType": "Palun lisa JSON-formaadis fail.",
|
||||
"twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood",
|
||||
"tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.",
|
||||
"confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?",
|
||||
"confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?",
|
||||
"Verify Token": "Kontrolli",
|
||||
"Setup 2FA": "Kaksikautentimise seadistamine",
|
||||
"Enable 2FA": "Seadista 2FA",
|
||||
"Disable 2FA": "Lülita 2FA välja",
|
||||
"2FA Settings": "2FA seaded",
|
||||
"Two Factor Authentication": "Kaksikautentimine",
|
||||
"Active": "Aktiivne",
|
||||
"Inactive": "Mitteaktiivne",
|
||||
"Token": "Kaksikautentimise kood",
|
||||
"Show URI": "Näita URId",
|
||||
"Clear all statistics": "Tühjenda ajalugu",
|
||||
"importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
|
||||
"confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
|
||||
"Heartbeat Retry Interval": "Korduskatsete intervall",
|
||||
"Import Backup": "Varukoopia importimine",
|
||||
"Export Backup": "Varukoopia eksportimine",
|
||||
"Skip existing": "lisa praegustele",
|
||||
"Overwrite": "Asenda",
|
||||
"Options": "Mestimisviis",
|
||||
"Keep both": "Kombineeri",
|
||||
"Tags": "Sildid",
|
||||
"Add New below or Select...": "Leia või lisa all uus…",
|
||||
"Tag with this name already exist.": "Selle nimega silt on juba olemas.",
|
||||
"Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
|
||||
"color": "värvus",
|
||||
"value (optional)": "väärtus (fakultatiivne)",
|
||||
"Gray": "hall",
|
||||
"Red": "punane",
|
||||
"Orange": "oranž",
|
||||
"Green": "roheline",
|
||||
"Blue": "sinine",
|
||||
"Indigo": "indigo",
|
||||
"Purple": "lilla",
|
||||
"Pink": "roosa",
|
||||
"Search...": "Otsi…",
|
||||
"Avg. Ping": "Keskmine ping",
|
||||
"Avg. Response": "Keskmine reaktsiooniaeg",
|
||||
"Entry Page": "Avaleht",
|
||||
"statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
|
||||
"No Services": "Teenused puuduvad",
|
||||
"All Systems Operational": "Kõik töökorras",
|
||||
"Partially Degraded Service": "Teenuse töö osaliselt häiritud",
|
||||
"Degraded Service": "Teenuse töö häiritud",
|
||||
"Add Group": "Lisa grupp",
|
||||
"Edit Status Page": "Muuda lehte",
|
||||
"Go to Dashboard": "Töölauale",
|
||||
"checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega",
|
||||
"telegram": "Telegram",
|
||||
"webhook": "Webhook",
|
||||
"smtp": "elektronpost (SMTP)",
|
||||
"discord": "Discord",
|
||||
"teams": "Microsoft Teams",
|
||||
"signal": "Signal",
|
||||
"gotify": "Gotify",
|
||||
"slack": "Slack",
|
||||
"rocket.chat": "Rocket.chat",
|
||||
"pushover": "Pushover",
|
||||
"pushy": "Pushy",
|
||||
"octopush": "Octopush",
|
||||
"promosms": "PromoSMS",
|
||||
"lunasea": "LunaSea",
|
||||
"apprise": "Apprise (vahendab üle 65 teavitusteenust)",
|
||||
"pushbullet": "Pushbullet",
|
||||
"line": "LINE",
|
||||
"mattermost": "Mattermost",
|
||||
"alerta": "Alerta",
|
||||
"alertaApiEndpoint": "API otsik",
|
||||
"alertaEnvironment": "Keskkond",
|
||||
"alertaApiKey": "API võti",
|
||||
"alertaAlertState": "Häireseisund",
|
||||
"alertaRecoverState": "Taasta algolek",
|
||||
"Game": "Mäng",
|
||||
"Primary Base URL": "Peamine baas URL",
|
||||
"Passive Monitor Type": "Passiivne monitori tüüp",
|
||||
"Specific Monitor Type": "Spetsiifiline monitori tüüp",
|
||||
"resendDisabled": "Uuesti saatmine keelatud",
|
||||
"Push URL": "Lükka URL",
|
||||
"needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.",
|
||||
"pushOptionalParams": "Valikulised parameetrid: {0}",
|
||||
"Schedule maintenance": "Planeeri hooldus",
|
||||
"All Status Pages": "Kõik staatuse lehed",
|
||||
"Select status pages...": "Vali staatuse lehed…",
|
||||
"Custom": "Kohandatud",
|
||||
"here": "siin",
|
||||
"Required": "Nõutud",
|
||||
"Post URL": "Postita URL",
|
||||
"Affected Monitors": "Mõjutatud monitorid",
|
||||
"Pick Affected Monitors...": "Vali mõjutatud monitorid…",
|
||||
"Start of maintenance": "Hoolduse algus",
|
||||
"Content Type": "Sisu tüüp",
|
||||
"webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js",
|
||||
"webhookAdditionalHeadersTitle": "Täiendavad päised",
|
||||
"setAsDefault": "Lisa vaikimisi",
|
||||
"deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?",
|
||||
"proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.",
|
||||
"setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.",
|
||||
"Certificate Chain": "Sertifikaadi kett",
|
||||
"Valid": "Kehtiv",
|
||||
"Invalid": "Kehtetu",
|
||||
"User": "Kasutaja",
|
||||
"Installed": "Paigaldatud",
|
||||
"Not installed": "Ei ole installeeritud",
|
||||
"Running": "Töötab",
|
||||
"resendEveryXTimes": "Saada uuesti {0} korda",
|
||||
"statusMaintenance": "Hooldus",
|
||||
"Webhook URL": "",
|
||||
"Server URL": "Serveri URL",
|
||||
"Priority": "Tähtsus",
|
||||
"emojiCheatSheet": "Emotikoni spikker: {0}",
|
||||
"appriseInstalled": "Apprise on installitud.",
|
||||
"appriseNotInstalled": "Apprise ei ole installitud. {0}",
|
||||
"Method": "Meetod",
|
||||
"Body": "Keha",
|
||||
"Headers": "Päis",
|
||||
"PushUrl": "Lükka URL",
|
||||
"Monitor History": "Monitori ajalugu",
|
||||
"PasswordsDoNotMatch": "Paroolid ei ühti.",
|
||||
"records": "",
|
||||
"Current User": "Praegune kasutaja",
|
||||
"topic": "Teema",
|
||||
"successMessage": "Edukas sõnum",
|
||||
"recent": "Hiljutine",
|
||||
"Info": "Info",
|
||||
"Security": "Turvalisus",
|
||||
"Steam API Key": "Steam API võti",
|
||||
"Pick a RR-Type...": "Vali RR-tüüp…",
|
||||
"Default": "Vaikimisi",
|
||||
"HTTP Options": "HTTP valikud",
|
||||
"Create Incident": "Loo intsident",
|
||||
"Title": "Pealkiri",
|
||||
"Content": "Sisu",
|
||||
"Style": "Stiil",
|
||||
"info": "info",
|
||||
"warning": "hoiatus",
|
||||
"danger": "oht",
|
||||
"error": "viga",
|
||||
"critical": "kriitiline",
|
||||
"primary": "peamine",
|
||||
"dark": "tume",
|
||||
"light": "hele",
|
||||
"Post": "Postita",
|
||||
"Please input title and content": "Palun lisa pealkiri ja sisu",
|
||||
"Created": "Loodud",
|
||||
"Last Updated": "Viimati uuendatud",
|
||||
"Unpin": "Vabastada",
|
||||
"Switch to Dark Theme": "Vaheta tumedale teemale",
|
||||
"Hide Tags": "Peida tagid",
|
||||
"Show Tags": "Näita tagid",
|
||||
"Description": "Kirjeldus",
|
||||
"No monitors available.": "Ühtegi monitori ei ole saadaval.",
|
||||
"Add one": "Lisa üks",
|
||||
"No Monitors": "Ei ole monitore",
|
||||
"Untitled Group": "Nimetamata grupp",
|
||||
"Services": "Teenused",
|
||||
"Cancel": "Tühista",
|
||||
"Customize": "Kohanda",
|
||||
"Custom Footer": "Kohandatud jalus",
|
||||
"Custom CSS": "Kohandatud CSS",
|
||||
"Proxies": "Puhverserverid",
|
||||
"default": "Vaikimisi",
|
||||
"enabled": "Lubatud",
|
||||
"Not running": "Ei tööta",
|
||||
"Start": "Alusta",
|
||||
"Stop": "Peata",
|
||||
"Add New Status Page": "Lisa uus staatuse leht",
|
||||
"Shrink Database": "Vähenda andmebaasi",
|
||||
"Help": "Abi",
|
||||
"Maintenance": "Hooldus",
|
||||
"General Monitor Type": "Üldine monitori tüüp",
|
||||
"webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.",
|
||||
"Read more": "Loe rohkem",
|
||||
"HeadersInvalidFormat": "",
|
||||
"clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.",
|
||||
"steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ",
|
||||
"Done": "Tehtud",
|
||||
"Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…",
|
||||
"Switch to Light Theme": "Vaheta heledale teemale",
|
||||
"Discard": "Loobu",
|
||||
"deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?",
|
||||
"Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest"
|
||||
}
|
||||
{
|
||||
"languageName": "eesti",
|
||||
"retryCheckEverySecond": "Kontrolli {0} sekundilise vahega",
|
||||
"retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus",
|
||||
"ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel",
|
||||
"upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
|
||||
"maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.",
|
||||
"acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
|
||||
"passwordNotMatchMsg": "Salasõnad ei kattu.",
|
||||
"notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
|
||||
"keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
|
||||
"pauseDashboardHome": "Seisatud",
|
||||
"deleteMonitorMsg": "Kas soovid eemaldada seire?",
|
||||
"deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
|
||||
"resolverserverDescription": "Cloudflare on vaikimisi pöördserver.",
|
||||
"rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.",
|
||||
"pauseMonitorMsg": "Kas soovid peatada seire?",
|
||||
"Settings": "Seaded",
|
||||
"Status Page": "Ülevaade",
|
||||
"Status Pages": "Ülevaated",
|
||||
"Dashboard": "Töölaud",
|
||||
"New Update": "Uuem tarkvara versioon on saadaval",
|
||||
"Language": "Keel",
|
||||
"Appearance": "Välimus",
|
||||
"Theme": "Teema",
|
||||
"General": "Üldine",
|
||||
"Version": "Versioon",
|
||||
"Check Update On GitHub": "Otsi uuendusi GitHub'ist",
|
||||
"List": "Nimekiri",
|
||||
"Add": "Lisa",
|
||||
"Add New Monitor": "Lisa seire",
|
||||
"Add a monitor": "Lisa seire",
|
||||
"Quick Stats": "Ülevaade",
|
||||
"Up": "Töökorras",
|
||||
"Down": "Rikkis",
|
||||
"Pending": "Määramisel",
|
||||
"Unknown": "Kahtlast",
|
||||
"Pause": "Seiska",
|
||||
"Name": "Nimi",
|
||||
"Status": "Olek",
|
||||
"DateTime": "Kuupäev",
|
||||
"Message": "Tulemus",
|
||||
"No important events": "Märkimisväärsed juhtumid puuduvad",
|
||||
"Resume": "Taasta",
|
||||
"Edit": "Muuda",
|
||||
"Delete": "Eemalda",
|
||||
"Current": "Hetkeseisund",
|
||||
"Uptime": "Eluiga",
|
||||
"Cert Exp.": "Sert. aegumine",
|
||||
"day": "päev | päeva",
|
||||
"-day": "-päev",
|
||||
"hour": "tund",
|
||||
"-hour": "-tund",
|
||||
"Response": "Reaktsiooniaeg",
|
||||
"Ping": "Ping",
|
||||
"Monitor Type": "Seire tüüp",
|
||||
"Keyword": "Võtmesõna",
|
||||
"Friendly Name": "Sõbralik nimi",
|
||||
"URL": "URL",
|
||||
"Hostname": "Hostname",
|
||||
"Port": "Port",
|
||||
"Heartbeat Interval": "Tukse sagedus",
|
||||
"Retries": "Korduskatsed",
|
||||
"Advanced": "Rohkem",
|
||||
"Upside Down Mode": "Tagurpidi seire",
|
||||
"Max. Redirects": "Max. ümbersuunamine",
|
||||
"Accepted Status Codes": "Kõlblikud HTTP koodid",
|
||||
"Save": "Salvesta",
|
||||
"Notifications": "Teavitused",
|
||||
"Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
|
||||
"Setup Notification": "Lisa teavitusteenus",
|
||||
"Light": "hele",
|
||||
"Dark": "tume",
|
||||
"Auto": "automaatne",
|
||||
"Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
|
||||
"Normal": "tavaline",
|
||||
"Bottom": "all",
|
||||
"None": "puudub",
|
||||
"Timezone": "Ajatsoon",
|
||||
"Search Engine Visibility": "Otsimootorite ligipääs",
|
||||
"Allow indexing": "Luba indekseerimine",
|
||||
"Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
|
||||
"Change Password": "Muuda parooli",
|
||||
"Current Password": "Praegune parool",
|
||||
"New Password": "Uus parool",
|
||||
"Repeat New Password": "Korda uut parooli",
|
||||
"Update Password": "Uuenda parooli",
|
||||
"Disable Auth": "Lülita autentimine välja",
|
||||
"Enable Auth": "Lülita autentimine sisse",
|
||||
"disableauth.message1": "Kas soovid {disableAuth}?",
|
||||
"disable authentication": "lülitada autentimise välja",
|
||||
"disableauth.message2": "Kastuamiseks {intendThirdPartyAuth}, näiteks Cloudflare Access.",
|
||||
"where you intend to implement third-party authentication": "välise autentimispakkujaga",
|
||||
"Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!",
|
||||
"Logout": "Logi välja",
|
||||
"Leave": "Lahku",
|
||||
"I understand, please disable": "Olen tutvunud riskidega, lülita välja",
|
||||
"Confirm": "Kinnita",
|
||||
"Yes": "Jah",
|
||||
"No": "Ei",
|
||||
"Username": "Kasutajanimi",
|
||||
"Password": "Parool",
|
||||
"Remember me": "Mäleta mind",
|
||||
"Login": "Logi sisse",
|
||||
"No Monitors, please": "Seired puuduvad, palun",
|
||||
"add one": "Lisa esimene",
|
||||
"Notification Type": "Teavituse tüüp",
|
||||
"Email": "e-posti aadress",
|
||||
"Test": "Saada prooviteavitus",
|
||||
"Certificate Info": "Sertifikaadi teave",
|
||||
"Resolver Server": "Server, mis vastab DNS päringutele.",
|
||||
"Resource Record Type": "DNS kirje tüüp",
|
||||
"Last Result": "Viimane",
|
||||
"Create your admin account": "Admininstraatori konto loomine",
|
||||
"Repeat Password": "korda salasõna",
|
||||
"respTime": "Reageerimisaeg (ms)",
|
||||
"notAvailableShort": "N/A",
|
||||
"enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
|
||||
"clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?",
|
||||
"clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?",
|
||||
"confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?",
|
||||
"Export": "Eksport",
|
||||
"Import": "Import",
|
||||
"Default enabled": "Kasuta vaikimisi",
|
||||
"Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
|
||||
"Create": "Loo konto",
|
||||
"Clear Data": "Eemalda andmed",
|
||||
"Events": "Sündmused",
|
||||
"Heartbeats": "Tuksed",
|
||||
"Auto Get": "Hangi automaatselt",
|
||||
"backupDescription": "Varunda kõik seired ja teavitused JSON faili.",
|
||||
"backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
|
||||
"backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
|
||||
"alertNoFile": "Palun lisa fail, mida importida.",
|
||||
"alertWrongFileType": "Palun lisa JSON-formaadis fail.",
|
||||
"twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood",
|
||||
"tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.",
|
||||
"confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?",
|
||||
"confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?",
|
||||
"Verify Token": "Kontrolli",
|
||||
"Setup 2FA": "Kaksikautentimise seadistamine",
|
||||
"Enable 2FA": "Seadista 2FA",
|
||||
"Disable 2FA": "Lülita 2FA välja",
|
||||
"2FA Settings": "2FA seaded",
|
||||
"Two Factor Authentication": "Kaksikautentimine",
|
||||
"Active": "Aktiivne",
|
||||
"Inactive": "Mitteaktiivne",
|
||||
"Token": "Kaksikautentimise kood",
|
||||
"Show URI": "Näita URId",
|
||||
"Clear all statistics": "Tühjenda ajalugu",
|
||||
"importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
|
||||
"confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
|
||||
"Heartbeat Retry Interval": "Korduskatsete intervall",
|
||||
"Import Backup": "Varukoopia importimine",
|
||||
"Export Backup": "Varukoopia eksportimine",
|
||||
"Skip existing": "lisa praegustele",
|
||||
"Overwrite": "Asenda",
|
||||
"Options": "Mestimisviis",
|
||||
"Keep both": "Kombineeri",
|
||||
"Tags": "Sildid",
|
||||
"Add New below or Select...": "Leia või lisa all uus…",
|
||||
"Tag with this name already exist.": "Selle nimega silt on juba olemas.",
|
||||
"Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
|
||||
"color": "värvus",
|
||||
"value (optional)": "väärtus (fakultatiivne)",
|
||||
"Gray": "hall",
|
||||
"Red": "punane",
|
||||
"Orange": "oranž",
|
||||
"Green": "roheline",
|
||||
"Blue": "sinine",
|
||||
"Indigo": "indigo",
|
||||
"Purple": "lilla",
|
||||
"Pink": "roosa",
|
||||
"Search...": "Otsi…",
|
||||
"Avg. Ping": "Keskmine ping",
|
||||
"Avg. Response": "Keskmine reaktsiooniaeg",
|
||||
"Entry Page": "Avaleht",
|
||||
"statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
|
||||
"No Services": "Teenused puuduvad",
|
||||
"All Systems Operational": "Kõik töökorras",
|
||||
"Partially Degraded Service": "Teenuse töö osaliselt häiritud",
|
||||
"Degraded Service": "Teenuse töö häiritud",
|
||||
"Add Group": "Lisa grupp",
|
||||
"Edit Status Page": "Muuda lehte",
|
||||
"Go to Dashboard": "Töölauale",
|
||||
"checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega",
|
||||
"telegram": "Telegram",
|
||||
"webhook": "Webhook",
|
||||
"smtp": "elektronpost (SMTP)",
|
||||
"discord": "Discord",
|
||||
"teams": "Microsoft Teams",
|
||||
"signal": "Signal",
|
||||
"gotify": "Gotify",
|
||||
"slack": "Slack",
|
||||
"rocket.chat": "Rocket.chat",
|
||||
"pushover": "Pushover",
|
||||
"pushy": "Pushy",
|
||||
"octopush": "Octopush",
|
||||
"promosms": "PromoSMS",
|
||||
"lunasea": "LunaSea",
|
||||
"apprise": "Apprise (vahendab üle 65 teavitusteenust)",
|
||||
"pushbullet": "Pushbullet",
|
||||
"line": "LINE",
|
||||
"mattermost": "Mattermost",
|
||||
"alerta": "Alerta",
|
||||
"alertaApiEndpoint": "API otsik",
|
||||
"alertaEnvironment": "Keskkond",
|
||||
"alertaApiKey": "API võti",
|
||||
"alertaAlertState": "Häireseisund",
|
||||
"alertaRecoverState": "Taasta algolek",
|
||||
"Game": "Mäng",
|
||||
"Primary Base URL": "Peamine baas URL",
|
||||
"Passive Monitor Type": "Passiivne monitori tüüp",
|
||||
"Specific Monitor Type": "Spetsiifiline monitori tüüp",
|
||||
"resendDisabled": "Uuesti saatmine keelatud",
|
||||
"Push URL": "Lükka URL",
|
||||
"needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.",
|
||||
"pushOptionalParams": "Valikulised parameetrid: {0}",
|
||||
"Schedule maintenance": "Planeeri hooldus",
|
||||
"All Status Pages": "Kõik staatuse lehed",
|
||||
"Select status pages...": "Vali staatuse lehed…",
|
||||
"Custom": "Kohandatud",
|
||||
"here": "siin",
|
||||
"Required": "Nõutud",
|
||||
"Post URL": "Postita URL",
|
||||
"Affected Monitors": "Mõjutatud monitorid",
|
||||
"Pick Affected Monitors...": "Vali mõjutatud monitorid…",
|
||||
"Start of maintenance": "Hoolduse algus",
|
||||
"Content Type": "Sisu tüüp",
|
||||
"webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js",
|
||||
"webhookAdditionalHeadersTitle": "Täiendavad päised",
|
||||
"setAsDefault": "Lisa vaikimisi",
|
||||
"deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?",
|
||||
"proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.",
|
||||
"setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.",
|
||||
"Certificate Chain": "Sertifikaadi kett",
|
||||
"Valid": "Kehtiv",
|
||||
"Invalid": "Kehtetu",
|
||||
"User": "Kasutaja",
|
||||
"Installed": "Paigaldatud",
|
||||
"Not installed": "Ei ole installeeritud",
|
||||
"Running": "Töötab",
|
||||
"resendEveryXTimes": "Saada uuesti {0} korda",
|
||||
"statusMaintenance": "Hooldus",
|
||||
"Webhook URL": "",
|
||||
"Server URL": "Serveri URL",
|
||||
"Priority": "Tähtsus",
|
||||
"emojiCheatSheet": "Emotikoni spikker: {0}",
|
||||
"appriseInstalled": "Apprise on installitud.",
|
||||
"appriseNotInstalled": "Apprise ei ole installitud. {0}",
|
||||
"Method": "Meetod",
|
||||
"Body": "Keha",
|
||||
"Headers": "Päis",
|
||||
"PushUrl": "Lükka URL",
|
||||
"Monitor History": "Monitori ajalugu",
|
||||
"PasswordsDoNotMatch": "Paroolid ei ühti.",
|
||||
"records": "",
|
||||
"Current User": "Praegune kasutaja",
|
||||
"topic": "Teema",
|
||||
"successMessage": "Edukas sõnum",
|
||||
"recent": "Hiljutine",
|
||||
"Info": "Info",
|
||||
"Security": "Turvalisus",
|
||||
"Steam API Key": "Steam API võti",
|
||||
"Pick a RR-Type...": "Vali RR-tüüp…",
|
||||
"Default": "Vaikimisi",
|
||||
"HTTP Options": "HTTP valikud",
|
||||
"Create Incident": "Loo intsident",
|
||||
"Title": "Pealkiri",
|
||||
"Content": "Sisu",
|
||||
"Style": "Stiil",
|
||||
"info": "info",
|
||||
"warning": "hoiatus",
|
||||
"danger": "oht",
|
||||
"error": "viga",
|
||||
"critical": "kriitiline",
|
||||
"primary": "peamine",
|
||||
"dark": "tume",
|
||||
"light": "hele",
|
||||
"Post": "Postita",
|
||||
"Please input title and content": "Palun lisa pealkiri ja sisu",
|
||||
"Created": "Loodud",
|
||||
"Last Updated": "Viimati uuendatud",
|
||||
"Unpin": "Vabastada",
|
||||
"Switch to Dark Theme": "Vaheta tumedale teemale",
|
||||
"Hide Tags": "Peida tagid",
|
||||
"Show Tags": "Näita tagid",
|
||||
"Description": "Kirjeldus",
|
||||
"No monitors available.": "Ühtegi monitori ei ole saadaval.",
|
||||
"Add one": "Lisa üks",
|
||||
"No Monitors": "Ei ole monitore",
|
||||
"Untitled Group": "Nimetamata grupp",
|
||||
"Services": "Teenused",
|
||||
"Cancel": "Tühista",
|
||||
"Customize": "Kohanda",
|
||||
"Custom Footer": "Kohandatud jalus",
|
||||
"Custom CSS": "Kohandatud CSS",
|
||||
"Proxies": "Puhverserverid",
|
||||
"default": "Vaikimisi",
|
||||
"enabled": "Lubatud",
|
||||
"Not running": "Ei tööta",
|
||||
"Start": "Alusta",
|
||||
"Stop": "Peata",
|
||||
"Add New Status Page": "Lisa uus staatuse leht",
|
||||
"Shrink Database": "Vähenda andmebaasi",
|
||||
"Help": "Abi",
|
||||
"Maintenance": "Hooldus",
|
||||
"General Monitor Type": "Üldine monitori tüüp",
|
||||
"webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.",
|
||||
"Read more": "Loe rohkem",
|
||||
"HeadersInvalidFormat": "",
|
||||
"clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.",
|
||||
"steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ",
|
||||
"Done": "Tehtud",
|
||||
"Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…",
|
||||
"Switch to Light Theme": "Vaheta heledale teemale",
|
||||
"Discard": "Loobu",
|
||||
"deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?",
|
||||
"Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest"
|
||||
}
|
||||
|
|
2104
src/lang/fi.json
2104
src/lang/fi.json
File diff suppressed because it is too large
Load diff
2110
src/lang/fr-FR.json
2110
src/lang/fr-FR.json
File diff suppressed because it is too large
Load diff
1974
src/lang/hr-HR.json
1974
src/lang/hr-HR.json
File diff suppressed because it is too large
Load diff
2100
src/lang/id-ID.json
2100
src/lang/id-ID.json
File diff suppressed because it is too large
Load diff
1352
src/lang/ja.json
1352
src/lang/ja.json
File diff suppressed because it is too large
Load diff
1994
src/lang/pl.json
1994
src/lang/pl.json
File diff suppressed because it is too large
Load diff
1968
src/lang/pt-BR.json
1968
src/lang/pt-BR.json
File diff suppressed because it is too large
Load diff
1950
src/lang/ru-RU.json
1950
src/lang/ru-RU.json
File diff suppressed because it is too large
Load diff
1922
src/lang/sv-SE.json
1922
src/lang/sv-SE.json
File diff suppressed because it is too large
Load diff
2110
src/lang/tr-TR.json
2110
src/lang/tr-TR.json
File diff suppressed because it is too large
Load diff
2122
src/lang/uk-UA.json
2122
src/lang/uk-UA.json
File diff suppressed because it is too large
Load diff
2114
src/lang/zh-CN.json
2114
src/lang/zh-CN.json
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -11,6 +11,18 @@ export default {
|
|||
components: {
|
||||
MonitorList,
|
||||
},
|
||||
mounted() {
|
||||
if (!this.$root.isMobile && this.$route.path === '/list') {
|
||||
this.$router.push('/dashboard');
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'$root.isMobile'(newVal) {
|
||||
if (!newVal && this.$route.path === '/list') {
|
||||
this.$router.push('/dashboard');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
@ -21,4 +33,11 @@ export default {
|
|||
padding: 20px;
|
||||
}
|
||||
|
||||
.slide-fade-enter-active, .slide-fade-leave-active {
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
.slide-fade-enter, .slide-fade-leave-to {
|
||||
transform: translateX(10px);
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
|
Loading…
Add table
Reference in a new issue